預設繼承。
如果在建立類的時候沒有宣告要繼承的類 那麼java就預設 把它繼承Object類
public class A{
/*Code*/
}
public class A extends java.lang.Object{
以上兩種的等價的public class Test // 從Object類繼承
{
public static void main(String[] args)
System.out.println(new Test().toString());
從上面的程式碼可以看出,實際上,Test類的父類就是Object,因此,在Test中可以使用Object類的public或protected資源,如toString方法。那麼Java編譯器和JVM到底是如何做的呢?
瞭解這個原因其實並不需要知道JVM的實現細節。只要思考一下對於這種虛擬機器程式的原理即可。一般對於這種靠虛擬機器執行的語言(如Java、C#等)會有兩種方法處理預設繼承問題。
1、在編譯原始碼時,當遇到沒有父類的類時,編譯器會將其指定一個預設的父類(一般為Object),而虛擬機器在處理到這個類時,由於這個類已經有一個預設的父類了,因此,VM仍然會按著常規的方法來處理每一個類。對於這種情況,從編譯後的二進位制角度來看,所有的類都會有一個父類。
2、編譯器仍然按著實際程式碼進行編譯,並不會做額外的處理。如果一個類沒有顯式地繼承於其他的類,編譯後的程式碼仍然沒有父類。然後由虛擬機器執行二進位制程式碼時,當遇到沒有父類的類時,就會自動將這個類看成是Object類的子類(一般這類語言的預設父類都是Object)。
從上面兩種情況可以看出,第1種情況是在編譯器上做的文章,也就是說,當沒有父類時,由編譯器在編譯時自動為其指定一個父類。第2種情況是在虛擬機器上做文章,也就是這個預設的父類是由虛擬機器來新增的。
預設繼承。
如果在建立類的時候沒有宣告要繼承的類 那麼java就預設 把它繼承Object類
public class A{
/*Code*/
}
public class A extends java.lang.Object{
/*Code*/
}
以上兩種的等價的public class Test // 從Object類繼承
{
public static void main(String[] args)
{
System.out.println(new Test().toString());
}
}
從上面的程式碼可以看出,實際上,Test類的父類就是Object,因此,在Test中可以使用Object類的public或protected資源,如toString方法。那麼Java編譯器和JVM到底是如何做的呢?
瞭解這個原因其實並不需要知道JVM的實現細節。只要思考一下對於這種虛擬機器程式的原理即可。一般對於這種靠虛擬機器執行的語言(如Java、C#等)會有兩種方法處理預設繼承問題。
1、在編譯原始碼時,當遇到沒有父類的類時,編譯器會將其指定一個預設的父類(一般為Object),而虛擬機器在處理到這個類時,由於這個類已經有一個預設的父類了,因此,VM仍然會按著常規的方法來處理每一個類。對於這種情況,從編譯後的二進位制角度來看,所有的類都會有一個父類。
2、編譯器仍然按著實際程式碼進行編譯,並不會做額外的處理。如果一個類沒有顯式地繼承於其他的類,編譯後的程式碼仍然沒有父類。然後由虛擬機器執行二進位制程式碼時,當遇到沒有父類的類時,就會自動將這個類看成是Object類的子類(一般這類語言的預設父類都是Object)。
從上面兩種情況可以看出,第1種情況是在編譯器上做的文章,也就是說,當沒有父類時,由編譯器在編譯時自動為其指定一個父類。第2種情況是在虛擬機器上做文章,也就是這個預設的父類是由虛擬機器來新增的。