這段時間一直在學Java,看了辣麼多書以及博客,心癢也是著寫寫自己的學習心得。
這也算是新手篇:咬文嚼字Java中的關鍵字。
以關鍵字為第一篇博文也是考慮再三:1、本人基礎也是薄弱 2、集跬步至千裡 3、看了一些博文也是有些瑕疵。不多說廢話正片開始:
class MyDate extends Date { static public MyDate valueOf() { return new MyDate(); } static public MyDate valueOf(long time) { return new MyDate(); } private MyDate() { super(); } private MyDate(long time) { super(time); } }
在子類中調用父類的構造器,可以傳遞響應的參數,初識化時使用(ps:只有在子類構造器中使用)。那麼問題來了:如果父類構造器是私有的,子類能不能super調用呢?
眾所周知 被private修飾的field、construc、method是不允許被外界訪問的,那麼super應該是調用不到的。
IDE(Eclipse)直接不允許
編譯報錯
class MyDate extends Date { static public MyDate valueOf() { return new MyDate(); } private MyDate() { super.getTime(); } public void doAction() { super.getTime(); } }
如上所示,調用父類的方法相對自由些:子類的方法、子類的構造器都可以調用。那麼問題來了:如果先調用父類方法,後調用父類構造器會如何?
很容易想到,這是不允許。父類都還沒有構造如何調用父類方法呢。。。
IDE(Eclipse)直接不允許
編譯報錯則提示的更加明顯:super的調用必須是構造器中的第一個語句
當然各位博友也可以去試試其他情況是不是super的調用必須是第一個語句這問題?
很多博文都是列舉了上面兩種,但是泛型中同樣存在super關鍵字,所以我也姑且算作他的一種用法吧。
super關鍵字聲明了類型的下界,表示參數化的類型可能是所指定的類型,或者是此類型的父類型,直至Object
extends關鍵字聲明了類型的上界,表示參數化的類型可能是所指定的類型,或者是此類型的子類
看上去有點繞,但是簡單的一個例子就知道為啥要有super:
public class MainTest { static public void main(String[] args) { } static private <T extends Comparable<? super T>> T min(T a, T b) { if (a == null || b == null) { return null; } if (a.compareTo(b) < 0) { return a; } return b; } } class SuperTest implements Comparable<SuperTest> { @Override public int compareTo(SuperTest o) { return 0; } } class SubTest extends SuperTest { }
如上代碼,表示使用min求出兩個T類型中小的那個(打算這麼實現而已)。用上泛型時,參數類型為T,T必須是Comparable子類或實現Comparable接口;同時考慮廣泛適用性,T如果有父類實現了Comparable接口也是可以的。
class MyDate extends Date { static public MyDate valueOf() { return new MyDate(); } private MyDate() { this(0); } private MyDate(long time) { } }
與super用法比較類似,必須是構造器中的第一個語句,但還有一個問題:如果構造其中this互相調用,即在private MyDate(long time){this();},會由啥情況?
報錯很明顯:禁止遞歸調用
class MyDate{ private long myDate; static public MyDate valueOf() { return new MyDate(); } public void print() { System.out.println(this.getMyDate()); } public long getMyDate() { return this.myDate; } }
this調用對象本身,super調用對象父類。這樣的理解還是不准確的。
樓豬認為相對優秀的理解是:this是對象本身的引用,super只是作為一個具有提示意義的關鍵字而已。注意:this是類對象,super不是父類對象。
import java.util.*; class MyDate extends Date{ static public void main(String[] args) { MyDate.valueOf().print(); } static public MyDate valueOf() { return new MyDate(); } private MyDate() { } public void print() { System.out.println(this); System.out.println(this.getClass()); System.out.println(super);//編譯不通過 System.out.println(super.getClass()); } }
如上述代碼,如果加上System.out.println(super);編譯無法通過。
編譯報錯,編譯器試圖告訴我們super不是這樣用的。
而 System.out.println(this);是允許這樣使用的。
另外一種判斷方法,利用instanceof這個關鍵字(instanceof測試一個對象是否是一個類的實例):
import java.util.*; class MyDate extends Date{ static public void main(String[] args) { MyDate.valueOf().print(); } static public MyDate valueOf() { return new MyDate(); } private MyDate() { } public void print() { if (this instanceof MyDate) { System.out.println("this is object"); } if (super instanceof Date) {//編譯不通過 System.out.println("super is object"); } } }
編譯報錯
啰嗦了這麼多,一方面才疏學淺無法精簡的表達自己的想法,另一方面第一次寫博客也是挺緊張的,布局、措詞、效果等等都不清楚。
如果問題希望各位指正。。。