object類有哪些方法 java所有類都繼承object嗎?
java所有類都繼承object嗎?默認繼承。如果創(chuàng)建類時未聲明要繼承的類,默認情況下,Java將從對象類繼承它公共類a{/*代碼*/]}公共類a擴展java.lang.Object對象{/*code
java所有類都繼承object嗎?
默認繼承。
如果創(chuàng)建類時未聲明要繼承的類,默認情況下,Java將從對象類繼承它
公共類a{
/*代碼*/]}
公共類a擴展java.lang.Object對象{
/*code*/]}
]等價的公共類test//從對象類繼承
{
public static void main(string[]args)
{系統(tǒng)輸出打印(新測試()。ToString())
}
從上面的代碼可以看出,實際上,測試類的父類是object。因此,可以在測試中使用對象類的公共或受保護資源,例如toString方法。那么java編譯器和jvm是如何做到的呢?
要理解這一點,您不需要知道JVM的實現(xiàn)細節(jié)。想想這個虛擬機程序的原理。一般來說,有兩種方法來處理這類語言的默認繼承問題(如Java、C等等)。
1. 在編譯源代碼時,當(dāng)遇到?jīng)]有父類的類時,編譯器將指定默認的父類(通常是對象)。當(dāng)虛擬機處理這個類時,因為這個類已經(jīng)有了一個默認的父類,所以VM仍然會以傳統(tǒng)的方式處理每個類。在這種情況下,從編譯的二進制角度來看,所有類都將有一個父類。
2. 編譯器仍然按照實際代碼進行編譯,沒有任何額外的處理。如果一個類沒有顯式地從其他類繼承,那么編譯后的代碼仍然沒有父類。然后,當(dāng)虛擬機運行二進制代碼時,當(dāng)遇到?jīng)]有父類的類時,它會自動將該類視為對象類的子類(通常,這類語言的默認父類是object)。
從以上兩種情況可以看出,第一種情況是編譯器上的文章,即沒有父類時,編譯器會在編譯時自動為其指定父類。第二種情況是在虛擬機上寫,即虛擬機添加默認父類。
JAVA只可以單繼承但是object又是每個類的超類,在這基礎(chǔ)上類還可以繼承一個類,是什么原理?
1. Java只支持單一繼承,但可以實現(xiàn)多個接口。如果未顯示繼承任何類,系統(tǒng)將默認繼承對象類。但是,如果a顯示繼承B,則系統(tǒng)不會給出默認的繼承對象,而是a將繼承B,B將繼承object,這相當(dāng)于間接地繼承對象。
2. 談到繼承,您會想到面向?qū)ο蟮囊粋€原則:優(yōu)先考慮組合而不是繼承。為什么?
首先,繼承和組合都可以達到代碼重用的效果。我認為有以下考慮:
1。繼承的父類繼承父類的成員以增加耦合度
2。如果父類發(fā)生變化,會影響子類,組合只需要保證接口的穩(wěn)定性
3。子類在編譯時繼承父類,不能動態(tài)更改,但組合可以根據(jù)需要使用不同的實現(xiàn)類。
因此,組合更加靈活和可擴展。
但是,如果您需要向上移動,或者明確說明類關(guān)系是is-a關(guān)系,則仍然需要使用繼承。
希望對您有所幫助,可以跟著我,繼續(xù)分享java知識,謝謝。