t.x = 1; //compiles
Это поле static
.Поэтому вы должны написать это как TestA.x
(об этом будет предупреждение компилятора).
Статические защищенные поля доступны из статического кода подклассов (или из нестатического кода в этом отношении).
t.y = 2; //field not visible, fails to compile
Это поле экземпляра.Защищенные поля экземпляра доступны из методов экземпляра на подклассах.Но только изнутри этих методов.Вы не можете вызывать их из статического метода (даже если этот статический метод находится в подклассе).
Если вам нужно получить доступ к полям из статического метода в другом классе, вам нужно либо создать полеpublic или переместите код, который нуждается в нем, в тот же пакет.
Но только изнутри этих методов.
И только если вы можете быть уверены, чторассматриваемый экземпляр фактически из вашего собственного класса.
В вашем примере
TestA t = new TestA();
t.y = 2;
t.y
не отображается, потому что код в TestB
не может получить доступ к защищенному полю в экземплярах TestA
. Это должен быть экземпляр TestB
.Однако тот же код будет работать внутри метода на TestA
.
Также не будет работать следующее:
// in TestB
void boo(TestA someInstance){
this.y = someInstance.y;
// does not compile, because someInstance.y is not visible
// because it could be from unknown TestC
}
Хорошо, что имеет смыслно тогда как я могу получить доступ к TX?Это тоже защищенный член, и я все еще не т.
Экземпляр t
здесь вообще не используется (это может быть , может быть даже null
и кодвсе равно будет работать).Статический метод отправляется только для типа переменной (объявленного) во время компиляции.В идеале t.x
даже не должно быть разрешено , но по крайней мере вы получаете предупреждение компилятора.
это статично, так что технически вы не получаете к нему доступ черезсуперкласс, но через подкласс?ietx -> x -> TestB.x, который получает его через TestB?
Статические методы не могут быть переопределены подклассами.TestB.x
- это просто сбивающий с толку (или удобный, в зависимости от того, как вы на это смотрите) способ написания TestA.x
.Вы можете думать об этом как о подклассе, автоматически импортирующем все (публичные и защищенные) статические поля и переменные из родительского класса.Делает меньше нажатий клавиш, но не меняет поведение (конечно, работает очень отличается от методов экземпляра, которые динамически отправляются на фактический тип экземпляра).
В любом случае, поскольку TestA.x
защищен, он доступенк статическим кодовым блокам в подклассах TestA
, включая TestB
.