Ошибка, которую вы видите, имеет смысл.
Когда вы делаете следующее
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? (подсказка: последняя строка в описанной таблице)