在Java中,一个class可以访问它的superclass的superclass中的protected属性吗?

In Java, can a class access the protected attribute in the super class of its super class?

例如,

public class Question {
protected String question, correctAnswer, type;
....

}

public class MultipleChoice extends Question{{
  ...
}

public class TrueFalse extends MultipleChoice{
public TrueFalse(){
    this.type = "TrueFalse";
    this.question = "Question is not assinged!";
    this.correctAnswer = "Correct Answer is not assinged!";
}
....
}

显然class MultipleChoice可以访问class Question中的question, type, and correctAnswer。但是当我尝试通过 this.aclass TrueFalse 中访问它们时。我得到一个错误。 cannot be resolved or is not a field.

因此,class中的受保护属性是否只能在其子class中访问,而不能在子子class中访问?三个文件在同一个包中但不同 class 文件。

好吧,我copy/pasted把你的代码放到一个在线编译器里试了一下。它起作用了,你可以找到它 here。看起来是的。

我的意思是,如果那些是私有字段,那将是有意义的,但对于其余部分,应该没有问题(除非它仅是包访问)。

您是在同一个文件中声明那些 classes 吗?如果其中之一是嵌套 class,那可能就是原因。

回复旧版本

Super-super field access, uh? Hmm...

How about ((A)this).a? If the field is protected, maybe this could work.

NOTE: If it still doesn't work for you, try using it inside a non-static method inside C.

是的,可以。这是您无法访问的私有方法。

public class MultilevelVar {
public static void main(String[] args) {
new C().fun();
}
}

class A {
protected int x = 10;
}

class B extends A {
int x = 20;
}

class C extends B {
int x = 30;
void fun() {
System.out.println(((A) this).x);
System.out.println(((B) this).x);
System.out.println(((C) this).x);
}
}