程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 【Java咬文嚼字】關鍵字(一):super和this,咬文嚼字super

【Java咬文嚼字】關鍵字(一):super和this,咬文嚼字super

編輯:JAVA綜合教程

【Java咬文嚼字】關鍵字(一):super和this,咬文嚼字super


     這段時間一直在學Java,看了辣麼多書以及博客,心癢也是著寫寫自己的學習心得。

這也算是新手篇:咬文嚼字Java中的關鍵字。

以關鍵字為第一篇博文也是考慮再三:1、本人基礎也是薄弱 2、集跬步至千裡 3、看了一些博文也是有些瑕疵。不多說廢話正片開始:

super的用法:

1、調用父類的構造器:

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)直接不允許

編譯報錯

2、調用父類方法或是父類的成員:

class MyDate extends Date {
    
    static public MyDate valueOf() {
        return new MyDate();
    }
    
    private MyDate() {
        super.getTime();
    }
    
    public void doAction() {
        super.getTime();
    }
}

如上所示,調用父類的方法相對自由些:子類的方法、子類的構造器都可以調用。那麼問題來了:如果先調用父類方法,後調用父類構造器會如何?

很容易想到,這是不允許。父類都還沒有構造如何調用父類方法呢。。。

IDE(Eclipse)直接不允許

編譯報錯則提示的更加明顯:super的調用必須是構造器中的第一個語句

當然各位博友也可以去試試其他情況是不是super的調用必須是第一個語句這問題?

3、泛型中的應用:

很多博文都是列舉了上面兩種,但是泛型中同樣存在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接口也是可以的。

this的用法:

1、調用對象本身的構造器

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();},會由啥情況?

報錯很明顯:禁止遞歸調用

2、調用對象本身方法或是對象本身的成員

 

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只是作為一個具有提示意義的關鍵字而已。注意: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");
        }
    }
}

編譯報錯

啰嗦了這麼多,一方面才疏學淺無法精簡的表達自己的想法,另一方面第一次寫博客也是挺緊張的,布局、措詞、效果等等都不清楚。

如果問題希望各位指正。。。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved