如何在AA
内访问meth3()
课程的'i'变量?我尝试拨打super.i
,但只调用i
类的BB
变量。
public class SuperTest {
public static void main(String[] args) {
CC cc = new CC();
cc.meth3();
}
}
class AA {
int i=10; // **I mean this variable to access somehow**
}
class BB extends AA{
int i=20;
void meth2(){
System.out.println(super.i);
}
}
class CC extends BB{
int i=30;
void meth3(){
System.out.println(super.i);
}
}
答案 0 :(得分:1)
您可以将this
投射到AA
,以便从i
阅读AA
:
class CC extends BB {
int i = 30;
void meth3() {
System.out.println(((AA) this).i);
}
}
打印
10
答案 1 :(得分:1)
public class Test {
public static void main(String[] args) {
CC cc = new CC();
cc.meth3();
}
}
class AA {
int i = 10; // **I mean this variable to access somehow**
}
class BB extends AA {
int j = 20;
}
class CC extends BB {
int k = 30;
void meth3() {
System.out.println(i);
System.out.println(j);
System.out.println(k);
}
}
输出
10
20
30
答案 2 :(得分:1)
当一个类扩展另一个类时,它会继承原始类中的所有非私有变量。
所以,让我们重写BB
类,就像编译器可能会看到它一样(裸露在我身边,我将编写无效代码来说明一点):
class BB extends AA{
int i = 10;//inherited from AA
int i = 20;
}
现在通常情况下,如果我们编写一个包含两个共享相同名称的变量的类(在这种情况下为i
),我们会得到一个编译错误。但是在扩展类的情况下,任何与从原始类继承的变量共享同一名称的变量都将被覆盖。来自班级i
的原始AA
会被来自班级i
的{{1}}覆盖。这称为名称遮蔽或名称隐藏。请参阅此more in depth explanation。
如果您想要从BB
或AA
个实例访问i
BB
变量,则需要将您正在使用的对象转换为类{{1} }。
以下是您提供的测试类,并根据您的要求重写以访问CC
AA
变量:
AA
答案 3 :(得分:0)
您应该了解引用之间的类对象。
反正
试试此代码
public class SuperTest {
public static void main(String[] args) {
CC cc = new CC();
cc.meth3();
AA aa = new AA();
System.out.println(aa.getI());
}
}
class AA {
int i=10; // **I mean this variable to access somehow**
public int getI() {
return this.i;
}
public void setI(int i) {
this.i = i ;
}
}
class BB extends AA{
int i=20;
void meth2(){
System.out.println(super.i);
}
public int getI() {
return this.i;
}
public void setI(int i) {
this.i = i ;
}
}
class CC extends BB{
int i=30;
void meth3(){
System.out.println(super.i);
}
public int getI() {
return this.i;
}
public void setI(int i) {
this.i = i ;
}
}
答案 4 :(得分:0)
super关键字允许你访问立即超类的变量...来访问你需要在CC类中调用meth2()的AA类的'i'值...这将打印所需的vaue ..