簡體   English   中英

如何使用子類之外的子引用訪問與子變量同名的父類變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM