2015-06-30 34 views
0
class Parent { 
    public Parent() { 
     System.out.println("Parent Default.."); 
     System.out.println("Object type : " + this.getClass().getName()); 
     this.method(); 
    } 

    private void method() { 
     System.out.println("private method"); 
    } 
} 

class Child extends Parent { 
    public Child() { 
     System.out.println("Child Default.."); 
    } 

    public static void main(String[] args) { 
     new Child(); 
    } 
} 

調用私有方法。當我運行這段代碼將打印「這個」 =兒童 的類名,但「此」對象是能夠調用爲什麼父類的私有方法?從子對象

+0

您需要在父類中刪除'this',因爲當您在此時調用繼承時,它指向子類引用,因此它不會調用該繼承。 –

+0

,因爲這是父母的私有方法,如果這=父母,那麼它稱之爲自己的方法 –

+0

@DanialHussain請首先運行代碼,然後做出決定。這可以調用私有方法。 –

回答

1

首先,調用new Child()的時候,因爲沒有一個申報非參數的構造函數中Child類,它會簡單的調用super()被調用Parent構造。

然後,當執行this.getClass().getName()時,這裏this代表Child實例,這就是爲什麼你得到「Child」的原因。請記住,Object#getClass()返回對象所屬的最具體的類。從here可以看到更多。

關於爲什麼有效。首先,因爲Child延伸Parent,所以Child實例也是Parent實例。 java scope修飾符控制方法或字段可以被訪問的地方。以Parent#method()爲例,private修飾符指示此方法只能在Parent類中被訪問(調用)。這正是你編碼的方式。它調用編譯規則的類Parent的構造函數內部的方法。從here可以看到更多關於java訪問控制的信息

+0

_「這裏代表一個子實例」_如果您運行Harshit Gupta的代碼,_實例不會創建,對於子代或父代都不會創建。我確定像Child這樣的「事物」存在於內存(堆)中的某個地方,但不是實例......請查看'jvisualjvm'來驗證。如果你像'Child ch = new Child()'那樣做了一些事情,那麼你可以確定你可以看到一個'instance'被創建,但是對於我們所知的Super類別來說並不是這樣。 – Nirmal

0

private與對象的實際類沒有任何關係。一個private成員可以被同一個頂級類中的任何代碼訪問。 (A頂層類是一個不是嵌套的,這是不相關的繼承)

methodParent限定,並且該呼叫也是Parent,因此它允許的。

-1

很明顯,您可以調用類中的任何私有成員,但不能在類之外調用。

在這種情況下它是合法的。在這個程序中,首先會調用Parent的構造函數,並且可以在類中調用私有方法。

+0

但首先看看我正在調用該方法的對象的類型。 –

+0

你是什麼意思?你正在使用父類對象來調用它的mehtod。 – RajSharma

+0

如果您運行代碼,那麼您將看到「this」對象打印子對象的類名稱。 –

2

當你擴展類時,私有方法將不會被繼承,但是子類的對象包含父類的對象,所以當超類構造函數被調用時,你可以調用超類內的超類私有方法class

0

這裏沒有創建一個父實例,你可以在你的jdk安裝的/ bin文件夾中使用jvisualjvm來確認,子實例也不會創建。父構造函數仍然被調用。

輸出:

Parent Default.. 
Object type : com.packagename.Child 
private method 
Child Default.. 

父類的構造可以通過子類調用。 雖然在父母的構造函數中,正如Krishanthy Mohanachandran在上面指出的那樣,可以合法調用私有方法。