0

如何访问AA内部类的“i”变量meth3()?我尝试调用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);
    }
}
4

5 回答 5

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
于 2013-06-03T05:06:41.443 回答
1

您可以this转换为 anAA以读取ifrom AA

class CC extends BB {
    int i = 30;
    void meth3() {
        System.out.println(((AA) this).i);
    }
}

印刷

10

于 2013-06-03T04:59:47.023 回答
1

当一个类扩展另一个类时,它会从原始类继承所有非私有变量。因此,让我们将类重写BB为编译器可能看到的那样(我将编写伪代码来说明一点):

class BB extends AA{

int i = 10;//inherited from AA

int i = 20;

}

现在通常,如果我们编写一个包含两个共享相同名称的变量的类(i在这种情况下),我们会得到一个编译错误。但是在扩展类的情况下,任何与从原始类继承的变量同名的变量都会被覆盖。原始ifrom classAAifrom Class覆盖BB。这称为名称隐藏或名称隐藏。请参阅此更深入的解释

如果要从实例或从实例访问AA i变量,则需要将正在使用的对象转换为 class 。BBCCAA

这是您提供的测试类,按照您的要求重写以访问AA i变量:

public class Test {

    public static void main(String[] args) {

        CC cc = new CC();
        AA aa = (AA) cc;//cast the CC class instance to an AA instance

        aa.i;//equals 10
        cc.i;//equals 30

    }
}
于 2013-06-03T05:32:38.230 回答
0

super 关键字允许您访问直接超类的变量...访问您需要在 CC 类中调用 meth2() 的 AA 类的“i”值...这将打印所需的值...

于 2013-06-03T05:03:18.583 回答
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 ;
}
}
于 2013-06-03T04:55:29.907 回答