Ошибка компиляции верна, и я думаю, что вы просто упускаете небольшую точку!
protected
модификатор доступа означает
Если класс определен следующим образом:
package com.j2se.access_specifiers;
public class ProtectedAccessSpecifierRnD {
protected int protectedIntVar;
protected String protectedStrVar;
}
все классы в одном пакете могут получить доступ к protected
полям через свой объект явно без каких-либо методов установки или получения.
Все дочерние классы в других пакетах могут получить доступ к protected
полям родительского класса в своем коде, например, в своих методах или конструкторе:
public class ProtectedAccessSpecifierRnD2 extends ProtectedAccessSpecifierRnD{
public ProtectedAccessSpecifierRnD2() {
protectedIntVar = 0;
protectedStrVar = "Test";
}
}
Но в своем коде вы создаете объект из родительского класса в коде дочернего класса, и это не должно работать с самого начала.
Вкратце:
Если какой-либо объект создан из вашего родительского класса, только классы в одном пакете могут получить к нему доступ через переменную объекта в явном виде.В других пакетах только дочерние классы могут получить доступ к этим полям protected
родительского класса явно в своих методах или конструкторах.
Поскольку ProtectedAccessSpecifierRnD2
расширяет ProtectedAccessSpecifierRnD
, он наследует не-приватные и не по умолчанию (без каких-либо модификаторов) поля ProtectedAccessSpecifierRnD
.Тогда вы можете сказать, что ProtectedAccessSpecifierRnD2
имеет поля protectedIntVar
и protectedStrVar
как свои собственные, поэтому очевидно, что вы можете получить к ним доступ через объект из ProtectedAccessSpecifierRnD2
, так как эти поля также являются полями ProtectedAccessSpecifierRnD2
:
ProtectedAccessSpecifierRnD2 obj = new ProtectedAccessSpecifierRnD2();
System.out.println( obj.protectedIntVar + " " + obj.protectedStrVar );
Надеюсь, это поможет.