要說super就先要說this。
"this",作為一個特殊的關鍵字,它的規則如下:
1。可以表示構造函數傳遞。this(a,b)表示調用另外一個構造函數。這裡面的this就是一個特殊文法,不是變量,沒有什麼類型。
2。可以在一個類的非static成員内部使用,表示目前這個對象。此時,this就是一個final的普通變量,它有靜态類型,就是這個類C本身;它有動态類型,就是目前這個對象的類型。你可以對它調用成員函數,把它傳遞給别的函數,等等等等。隻要一個C類型的final變量可以出現的地方,它就可以出現。
"super"。它和"this"類似,但是也有不同的地方。
1。表示調用父類的構造函數。也是一個特殊文法,不是變量,沒有什麼類型。
2。可以在一個類的非static成員内部使用。比如super.method()。
但是,注意,這個super.method()隻是長得跟some_var.method()一樣,一個文法糖而已。實質上,"super"根本不是一個變量。
為什麼不是?因為如果是就壞了。java裡面有一個金科玉律:任何public非static函數的調用都是多态的。
是以,如果super是個變量,也指向目前對象,那麼,不管super的靜态類型是什麼super.method()必然調用的是子類的那個版本,而不會是我們期望的,靜态地選擇父類的那個版本。
是以,你隻要把super.xxx看成一個特殊的文法,比如了解為“super::xxx”就好了。
既然super不是一個變量,那麼不能把它象一個普通變量那樣"==",或者傳遞給某個函數就看起來很正常了,是麼?何況,你其實也用不着它,有this你這些要求就都可以辦到了。
3。super的另外一個作用是調用父類的protected函數。隻有通過"super"這個魔咒,我們才能操作父類的protected成員,别無它法。
借鑒于:https://www.cnblogs.com/wulianshang/p/5809898.html
3."超"關鍵字(super keyword)
馬克-to-win,Super是一個參考(或說指針)指向他緊鄰的父類(見下面的例子)。
用super可以指向被隐藏的父類的同名成員。
3.1 super指向父類的成員
注意: 下例中:子類和父類都有i,我們一共有兩個i,用super可以指向前一個父類的i。
例1.3.1---
class AMark_to_win {
int i;
}
class B extends AMark_to_win {
int i;
public B(int x, int y) {
super.i = x;//AMark_to_win 的 i被指派
i = y;//B的i被指派
}
public void show() {
System.out.println("i in superclass: " + super.i);
System.out.println("i in subclass: " + i);
}
}
public class Test {
public static void main(String[] args) {
B b = new B(2, 3);
b.show();
}
}
————————————————
版權聲明:本文為CSDN部落客「mark_to_win」的原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/mark_to_win/article/details/38663289