繁体   English   中英

如何从课程中访问字段?

[英]How to access a field from a class?

如何在meth3()访问AA类的'i'变量? 我尝试调用super.i但它只是调用BB类的i变量。

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);
    }
}

您可以将this转换为AA以从AA读取i

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

版画

10

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

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

class BB extends AA{

int i = 10;//inherited from AA

int i = 20;

}

现在通常,如果我们编写了一个包含两个变量的类,这两个变量都具有相同的名称(在本例中为i ),则会出现编译错误。 但是在扩展类的情况下,任何与从原始类继承的变量具有相同名称的变量将被覆盖。 AA类的原始iBB类的i覆盖。 这称为名称隐藏或名称隐藏。 看到这个更深入的解释

如果要从BBCC实例访问AA i变量,则需要强制转换用于AA类的对象。

这是您提供的测试类,根据您的要求重写了该类以访问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

    }
}

您应该了解引用之间的类对象。

无论如何

试试这个代码

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 ;
}
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM