[英]How to access parent class variable having same name as child variable with child reference outside the child class?
有沒有辦法通過子類外部的子引用訪問與另一個子類實例變量同名的父類實例變量?
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
}
}
假設有一個很好的理由,那么是的:
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 並進行更多評論
將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
字段。
這很混亂,不是嗎? 這是各種令人討厭的誤解和編碼錯誤的邀請。 因此,最好不要在父類和子類中使用相同的字段名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.