#java #inner-classes #overriding
#java #внутренние классы #переопределение
Вопрос:
class A { //1st code starts here
private void display() {
System.out.println("A class");
}
}
class B extends A {
protected void display() {
System.out.println("B class");
}
}
class Test {
public static void main(String args[]) {
A obj = new B();
obj.display();
}
}
Вывод: Test.java:22: ошибка: display() имеет частный доступ в
obj.display();
class Outer{ //2nd Code starts here
class Inner1{
private void m2() {
System.out.println("Inner1 class");
}
}
class Inner2 extends Inner1{
protected void m2() {
System.out.println("Inner2 class");
}
}
public static void main(String args[]) {
Outer o=new Outer();
Outer.Inner1 i=o.new Inner2();
i.m2();
}
}
Вывод: класс Inner1
Почему ошибка времени компиляции в 1-м коде при выводе класса Inner1 во 2-м коде???
Комментарии:
1. Вы не можете переопределять частные методы
2. Видимость внутреннего класса не может быть больше, чем у суперкласса.
3. Поскольку охватывающий класс имеет доступ к
private
членам своих внутренних классов; таким образом, классуOuter
во втором примере разрешен доступ кprivate
методуm2
в классеInner1
.4. @nickzoum видимость суперкласса не может быть большей.
protected
Метод в родительском может статьpublic
в подклассе, напримерCloneable.clone()
5. @PeterLawrey частный метод родительского класса никогда не может быть переопределен в подклассе.
Ответ №1:
Код Outer
класса может обращаться к любому члену или методу, объявленному в Outer
классе, независимо от уровня доступа. Однако вызываемый m2
метод является методом базового класса Inner1
, поскольку вы не можете переопределить private
метод.
С другой стороны, код Test
класса не может получить доступ к private
методу другого класса, поэтому этот код не проходит компиляцию.
Комментарии:
1. Вы не можете переопределить частный метод родительского класса. Таким образом, первоначально опубликованный код неверен, а отображение ошибки неверно
2. @Blip Нет, извините, вы ошибаетесь. У вас может быть частный метод
m
в суперклассе, а также методm
в подклассе. В этом случае метод подкласса не переопределяет метод суперкласса; это просто два отдельных метода, которые случайно имеют одно и то же имя. Попробуйте.3. @Jesper Я понимаю, что вы правы. Это не переопределение, а объявляется как новый метод. Спасибо, что исправили меня.
Ответ №2:
Потому что закрытые члены доступны только в классе. когда класс B расширяет A, закрытые члены недоступны для B. В случае внутренних классов внутренний класс является членом класса и имеет доступ ко всем членам окружающего класса.