這段時間一直在學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");
}
}
}
編譯報錯
啰嗦了這麼多,一方面才疏學淺無法精簡的表達自己的想法,另一方面第一次寫博客也是挺緊張的,布局、措詞、效果等等都不清楚。
如果問題希望各位指正。。。