如何通过子类外部的子引用访问与子变量同名的父类变量?

时间:2018-12-27 19:11:27

标签: java inheritance core super

是否可以通过子类外部的子引用访问与另一个子类实例变量同名的父类实例变量?

class Parent {
    int i;
}
class Child extends Parent {
    int i=10;

}
class Test {
    public static void main(String[] args) {
        Parent p=new Parent();
        Child c=new Child();
        System.out.println(p.i);//parent i variable
        System.out.println(c.i);//child i variable
        System.out.println(c.i);// again child i variable
    }
}

2 个答案:

答案 0 :(得分:1)

Child投射到Parent

System.out.println(((Parent) c).i);

为什么起作用?

Child实例具有两个名为i的字段,一个字段来自Parent类,一个字段来自Child,还有编译器(不是实例的运行时类型)决定使用哪个。编译器根据他看到的类型执行此操作。因此,如果编译器知道它是一个Child实例,他将为Child字段生成一个访问器。如果他只知道它是Parent,则可以访问Parent字段。

一些例子:

Parent parent = new Parent();
Child child = new Child();
Parent childAsParent = child;

System.out.println(parent.i);             // parent value
System.out.println(child.i);              // child value
System.out.println(((Parent) child) .i);  // parent value by inline cast
System.out.println(childAsParent.i);      // parent value by broader variable type

如果编译器知道它是Child,则他将授予对Child字段的访问权限,如果您不了解这些知识(通过强制转换或存储到Parent变量中),则可以可以访问Parent字段。

这令人困惑,不是吗?这是对各种令人讨厌的误解和编码错误的邀请。因此,最好不要在父类和子类中使用相同的字段名称。

答案 1 :(得分:0)

假设有充分的理由,那么可以:

class Child extends Parent {
    int i=10;

    public int getParentsI() {
       return super.i;
    }
}

现在您的主要方法如下:

Parent p=new Parent();
Child c=new Child();
System.out.println(p.i);//parent i variable
System.out.println(c.i);//child i variable
System.out.println(c.getParentsI());// parent i variable

编辑:意识到用户可能是新用户,所以我将充实sig方法并发表更多评论