在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.a
在 class 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);
}
}
例如,
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.a
在 class 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);
}
}