Как показывает многочисленная практика и даже некоторые статьи в интернет, многие думают что private поля и методы не наследуются подклассами. Так вот :) Они наследуются. И сейчас мы это докажем, дабы не быть голословными. Честно говоря не думал что такую статью придется писать, но в комментариях к моим статьям тоже были такие утверждения. Но сейчас мы прольем свет истины на это дело.
Эта программа выведет слово PRIVATE.
Как видно из кода мы создали два класса A и B сидели на трубе. Блин, даже писать скучно все это :)
Так вот, B наследуется от А и как видите мы в класс B, для яркости примера (чтоб прям било в глаза), вообще ни чего не добавили.
Затем создаем объект класса B и на нем вызываем метод prt(). Хочу сразу оговорится объектов класса A мы не создавали.
Программа выводит слово PRIVATE потому что объект класса B унаследовал ВСЁ, вот блин ВСЁ, от класса A, включая private поля и методы. Надеюсь уже больше вопросов по этому вопросу не будет :) ?
Стоит еще раз отметить, что private поля и методы доступны методам только внутри класса поэтому, хотя они и наследуются подклассами, но подклассы не могут получить доступ к private полям и методам супер класса. На то они и private.
Не вполне согласен с автором. Вот некомпилируемый пример:
ОтветитьУдалитьpublic class HelloWorld2 {
public static void main(String[] args) {
B b = new B();
b.prtPriv();
b.prtProt();
}
private String str = "Private";
private void prtPriv () {
System.out.println(str);
}
protected void prtProt () {
System.out.println(str + "protected");
}
}
class B extends HelloWorld2 {}
И не компилируется этот пример так как вызов наследником приватных методов родителя невозможен.
В примере автора всё же происходит косвенный вызов приватного метода через открытый наследнику protected метод, а этот открытый метод уже вызывается внутри класса-родителя.
Не совсем понял, что вы хотели сказать, поясните пжл
УдалитьОпыта у меня крайне мало, но мне кажется что у автора все порядке в силу того что protected метод prt не переопределен в наследнике и вызывается в классе родителе. А раз вызывается в классе родителе, то и приватный метод privprint он тоже может вызвать внутри себя.
УдалитьСогласен про косвенность.
УдалитьАвтор все четко объяснил, так и предполагал, но некоторые формулировки вводили в заблуждения.Поля наследуются, доступ ограничен родительским классом.
ОтветитьУдалить