Почему код дает следующий результат? - PullRequest
0 голосов
/ 19 декабря 2018

Я озадачен и немного расточен следующим фрагментом.Я думаю, это все из-за статического внутреннего класса и области действия функции класса A1, которая вызывается.

Если у вас есть подробное объяснение, пожалуйста, поделитесь им!

public class Main {
    static class A1 {
        private void f() { System.out.println("A1");}
    }

    static class A2 extends A1 {
        public void f() {System.out.println("A2");}
    }

    static class A3 extends A2 {
        public void f() {System.out.println("A3");}
    }

    public static void main(String[] args) {
        A1 a1 = new A1();
        a1.f();
        a1 = new A2();
        a1.f();
        a1 = new A3();
        a1.f();
    }
}

Ожидаемое:

A1
A2
A3

Фактическое значение:

A1
A1
A1

1 Ответ

0 голосов
/ 19 декабря 2018

Метод f() в A1 помечен private.Это означает, что оно не унаследовано A2 или A3.Это означает, что полиморфизм не найдет переопределяющие методы f() в A2 или A3.Однако, поскольку A1 является вложенным классом, включающий класс Main все еще имеет к нему доступ, поэтому он компилируется.В результате A1 печатается 3 раза.

Вы можете увидеть ошибку, если попытаетесь разместить аннотацию @Override в f() в A2.Если вы измените f() на public, protected или не будете использовать модификатор доступа («пакетный доступ») в A1, тогда f() будет наследоваться, как вы ожидаете, так что вывод будет таким, как вы ожидаетес выводом A1, A2 и A3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...