Java - Почему Child в другом пакете не может получить доступ к защищенному методу родителя через родительскую ссылку? - PullRequest
4 голосов
/ 26 апреля 2020

У меня есть два класса в двух разных пакетах:

package package1;

public class ParentClass {
    public void testPublic() {
    }

    protected void testProtected() {
    }
}


package package2;

import package1.ParentClass;

public class ChildClass extends ParentClass {
   void test() {
        ParentClass par = new ParentClass();
        par.testProtected(); // Line 1 : ERROR: testProtected() has protected access in ParentClass
        testProtected();     // Line 2 : No error

        ChildClass ch = new ChildClass();
        ch.testProtected(); // Line 3 : No ERROR
        testProtected();    // Line 4 : No error
    }    
}

Я могу понять, почему NO ERROR в вызове testProtected() -- Line 2, так как ChildClass видит этот метод как он наследуется от ParentClass.

И каким-то образом способен понять, почему выдает ошибку при вызове par.testProtected() -- Line 1, поскольку par - это другой объект, а текущий объект не имеет доступ к защищенному методу родителя другого объекта.

Но как объект ChildClass может получить доступ к этому же методу ch.testProtected() -- Line 3 (защищенный метод родителя другого объекта), когда ссылочный тип имеет только ChildClass

1 Ответ

6 голосов
/ 26 апреля 2020

Ошибка, которую вы видите, имеет смысл.

Когда вы делаете следующее

ParentClass par = new ParentClass();
par.testProtected();

, вы пытаетесь получить доступ к testProtected, как если бы он был частью публикации. c API ParentClass, вот и все, вы вызываете из другого пакета защищенный метод ParentClass для экземпляра этого класса . Неважно, что он вызывается внутри расширяющего класса, все, что имеет значение, это то, что он вызывается из другого пакета.

Теперь, если вы сделаете

ChildClass ch = new ChildClass();
ch.testProtected(); // Line 3
testProtected();    // Line 4

, вы не увидите любые ошибки. Почему?

В строке 3 вы получаете доступ к методу экземпляра класса ChildClass внутри ChildClass, так что это законно. Даже если бы у вас был приватный метод childMethod в ChildClass, вы могли бы сделать ch.childMethod().

В строке 4 вы получаете доступ к testProtected через this ссылка (неявно), это означает, что она вызывает метод через ChildClass, что, опять же, является законным.

См. этот пост: В чем разница между publi c, protected, пакет-приватный и приватный в Java? (подсказка: последняя строка в описанной таблице)

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