是否可以通过子类外部的子引用访问与另一个子类实例变量同名的父类实例变量?
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
}
}
答案 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方法并发表更多评论