2 июл. 2015 г.

Наследование. Модификатор private для методов и полей.

Как показывает многочисленная практика и даже некоторые статьи в интернет, многие думают что private поля и методы не наследуются подклассами. Так вот :) Они наследуются. И сейчас мы это докажем, дабы не быть голословными. Честно говоря не думал что такую статью придется писать, но в комментариях к моим статьям тоже были такие утверждения. Но сейчас мы прольем свет истины на это дело.

P001

Эта программа выведет слово PRIVATE.

Как видно из кода мы создали два класса A и B сидели на трубе. Блин, даже писать скучно все это :)

Так вот, B наследуется от А и как видите мы в класс B, для яркости примера (чтоб прям било в глаза), вообще ни чего не добавили.

Затем создаем объект класса B и на нем вызываем метод prt(). Хочу сразу оговорится объектов класса A мы не создавали.

Программа выводит слово PRIVATE потому что объект класса B унаследовал ВСЁ, вот блин ВСЁ, от класса A, включая private поля и методы. Надеюсь уже больше вопросов по этому вопросу не будет :) ?

Стоит еще раз отметить, что private поля и методы доступны методам только внутри класса поэтому, хотя они и наследуются подклассами, но подклассы не могут получить доступ к private полям и методам супер класса. На то они и private.

5 комментариев:

  1. Не вполне согласен с автором. Вот некомпилируемый пример:
    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 метод, а этот открытый метод уже вызывается внутри класса-родителя.

    ОтветитьУдалить
    Ответы
    1. Не совсем понял, что вы хотели сказать, поясните пжл

      Удалить
    2. Опыта у меня крайне мало, но мне кажется что у автора все порядке в силу того что protected метод prt не переопределен в наследнике и вызывается в классе родителе. А раз вызывается в классе родителе, то и приватный метод privprint он тоже может вызвать внутри себя.

      Удалить
    3. Согласен про косвенность.

      Удалить
  2. Автор все четко объяснил, так и предполагал, но некоторые формулировки вводили в заблуждения.Поля наследуются, доступ ограничен родительским классом.

    ОтветитьУдалить