任何一個子類的創建,都會導致整個繼承鏈上的所有的類被實例化##
網上各種文件都在說super和this的作用是感冒的,但是很多文章都沒說清楚,各種概念和表述都含混不清,鄙人通過猜測和代碼測試,終于完全搞清楚suepr和this的概念及其發揮的作用,在此給出正解:
- super關鍵字是干嘛的?
super:超類/父類的##對象## - 誰的超類/父類?
當然是【子類】的超類/父類 - 什么情況下會出現super(等同于什么情況下需要super?)
當new一個子類的對象的時候,super就存在了。當創建一個子類的對象時,會從祖宗父類(Object)的構造方法到當前子類的構造方法依次調用,既然調用了祖宗八代的構造方法,那么
祖宗八代都會被實例化,形成一個嵌套結構放在推內存中,最外層是當前子類的對象,最內存是
Object類的對象,中間是各個繼承和被基層的類的對象。那么相對于最外層的對象(當前子類的對象),它的上一層父類的對象就是super,換句話說super指向上一次父類對象的引用,相對于上一次父類對象,super指向上上一次父類對象的引用,... ... 一直到Object對象的引用。
那OK, super就是在當前子類對象中對上層父類對象的引用!!!
既然super出現了,那隨便用吧,只要在父類中不是被private修飾的成員,都可以使用super來調用. - 那this是干嘛的?
接到問題3,當前子類的對象就是this.換句話說,this是只存在于當前子類對象中對當前子類對象的引用,在語法上,出了當前子類,this就不能用了。同理,super也只能在子類中使用。 - 加深理解-->>
this和super其實代表一個未來的對象,因為在我們手動敲代碼的時候,子類或是父類并未不實例化,只有運行起來才會被實例化,因此this/super是對未來對象的引用,只不過這個引用很特殊。 - super在什么場景下使用?
說實在的,并不是任何地方都需要使用super. super代值父類的對象,為了避免父類的方法被子類重寫但是又需要調用父類的成員方法的時候,就需要super了,要不然你怎么調用父類不重寫的方法呢?因為當前子類已經有了同名的方法,當然直接被調用了,但是總有犯賤的時候?比如在父類代碼的基礎上做增強,又如調用父類的構造方法,那super就必須要用到。
其他情況下,super并沒什么卵用。 - this在什么情況下使用?
個人覺得使用this只是一種偷懶的方法,用this代指被創建的對象,提前指代,但是不使用很多
目的照樣可以達到。
完了,日后有時間會直接上圖!!
測試代碼一:
要說明的問題:任何一個子類對象被創建,繼承鏈上所有類都會被實例化
默認調用的是父類的空參構造函數(當然你也可以重寫),總之一定會被調用
并且這個默認調用是用super()來完成的.
public class Demo06 {
public static void main(String[] args) {
C c = new C();
}
}
class A{
public A(){
System.out.println("This is A");
}
}
class B extends A{
public B(){
System.out.println("This is B");
}
}
class C extends B{
public C(){
System.out.println("This is C");
}
}
運行結果:
This is A
This is B
This is C