Переопределение метода JAVA и концепции внутреннего класса

#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. В случае внутренних классов внутренний класс является членом класса и имеет доступ ко всем членам окружающего класса.