• <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • Java教程
    Java標識符與關鍵字
    Java變量
    Java數據類型
    Java運算符
    Java控制語句
    Java方法
    Java面向對象
    Java對象的創建和使用
    Java封裝
    Java中static和this
    Java繼承
    Java方法覆蓋和多態
    Java super
    Java基礎練習題

    Java中super關鍵字的使用(在實例方法中)

     

     

    super和this都可以使用在實例方法中,并且都不能使用在靜態方法當中,“this”大部分情況下都是可以省略的,只有在方法中區分局部變量和實例變量的時候不能省略。那“super”什么時候可以省略,什么時候不能省略呢?

     

    //書
    public class Book {
    	//書名
    	String name;
    	//構造方法
    	public Book(){
    		super();
    	}
    	public Book(String name){
    		super();
    		this.name = name;
    	}
    }

     

    //紙質書
    public class PaperBook extends Book {
    	//構造方法
    	public PaperBook(){
    		super();
    	}
    	public PaperBook(String name){
    		super();
    		this.name = name;
    	}
    	//打印書名
    	public void printName(){
    		System.out.println("this.name->書名 : " + this.name);
    		System.out.println("super.name->書名 : " + super.name);
    	}
    }

     

    public class BookTest {
    	public static void main(String[] args) {
    		PaperBook book1 = new PaperBook("零基礎學Java卷I");
    		book1.printName();
    	}
    }

     

    運行結果如下圖所示:

     

    圖14-11:super和this

     

    我們發現printName()方法中的super.name和this.name最終輸出結果是一樣的,這是為什么呢?請看以上程序執行的內存圖:

     

    圖14-12:父類的構造方法執行結束之后的內存圖

     

    圖14-13:子類的構造方法執行結束之后的內存圖

     

    通過以上內存結構圖發現this.name和super.name實際上是同一塊內存空間,所以它們的輸出結果是完全一樣的。接下來,我們再把以上的PaperBook類修改一下:

     

    //紙質書
    public class PaperBook extends Book {
    	String name; //在子類中也定義了一個name屬性
    	//構造方法
    	public PaperBook(){
    		super();
    	}
    	public PaperBook(String name){
    		super();
    		this.name = name;//這里的this.name代表子類的name
    	}
    	//打印書名
    	public void printName(){
    		System.out.println("this.name->書名 : " + this.name);
    		System.out.println("super.name->書名 : " + super.name);
    	}
    }

     

    運行結果如下圖所示:

     

    圖14-14:super和this的區別

     

    為什么super.name是null呢,我們一起來看看以上程序的內存圖:

     

    圖14-15:父類Book的構造方法執行之后的內存圖

     

    圖14-16:子類PaperBook的構造方法執行結束之后的內存圖

     

    通過以上內存圖可以清楚的看到,父類Book的構造方法在執行的時候給super.name賦值null,子類PaperBook的構造方法在執行的時候給this.name賦值“零基礎學Java卷I”,由于在子類PaperBook中定義了重名的變量name導致在當前對象中有兩個name,一個是從父類中繼承過來的,一個是自己的,如果此時想訪問父類中繼承過來的name則必須使用super.name,當直接訪問name或者this.name都表示訪問當前對象自己的name。

     

    通過以上的學習,大家知道super在什么情況下不能省略了嗎?當父類中有該實例變量,子類中又重新定義了同名的實例變量,如果想在子類中訪問父類的實例變量,super不能省略。實例方法是這樣嗎?我們可以來測試一下,請看代碼:

     

    public class Vip {
    	//Vip默認繼承Object
    	//重寫從Object類中繼承過來的toString()方法
    	public String toString(){
    		return "我是金牌會員";
    	}
    	public void test(){
    		System.out.println(super.toString());
    		System.out.println(this.toString());
    		System.out.println(toString());
    	}
    }

     

    public class VipTest {
    	public static void main(String[] args) {
    		Vip vip = new Vip();
    		vip.test();
    	}
    }

     

    運行結果如下圖所示:

     

    圖14-17:運行結果

     

    通過以上測試得出最終結論:父類和子類中有同名實例變量或者有同名的實例方法,想在子類中訪問父類中的實例變量或實例方法,則super是不能省略的,其它情況都可以省略。 

     

    全部教程
  • <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • 面对面棋牌游戏