Java基礎:第四十一講 this和super

來源:互聯網
上載者:User

 

this和super是Java中的兩個比較特殊的關鍵字。this表示當前對象,而super表示父類對象,嚴格來說應該是子類從父類繼承過來的部分,包括繼承過來的成員變數和成員方法。這兩個關鍵字用於Java類中自己的方法來訪問自己的成員變數和自己的成員方法。本次內容介紹如何使用this和super,主要內容如下:l 正常情況下如何訪問成員變數和成員方法l 什麼時候需要使用this訪問成員和成員方法l 什麼時候需要使用super訪問變數和成員方法l 如何使用this訪問其他的構造方法l 如何使用super訪問父類的構造方法下面分別介紹。 1 正常情況下如何訪問成員變數和成員方法正常情況下,訪問某個對象的方法和屬性,通過“對象名.屬性名稱”或者“對象名.方法名”訪問成員變數和成員方法。例:String name;System.out.println(name.length()); 如果是類自己的方法訪問成員變數和成員方法,可以採用如下的方式(setName方法中的代碼)。例: package thisAndSuper;  public class Animal {    protected String id;    protected String name;    public void setName(String newname){       // 正常情況下,應該這樣訪問成員變數和成員方法       name = newname;       print("初始化名字");    }    public void print(String message){       System. out.println("Animal--------"+message);    }}這裡再訪問name屬性和print方法的時候為什麼沒有給出對象名呢?因為在編寫類的時候不知道對象的名字,因為對象在運行之後才會產生。Name屬性和print方法應該屬於哪個對象呢?應該是當前方法(setName)所屬的對象,為了表示這個對象,Java中提供了this關鍵字用來表示當前對象。可以通過this訪問所有的成員變數和成員方法。 2 什麼時候需要使用this訪問成員和成員方法上面的代碼中沒有使用this訪問name屬性和print方法,實際上可以通過this訪問,上面的setName方法可以寫成下面的形式。例:    public void setName(String newname){       this.name = newname;       this.print("初始化名字");    }什麼時候必須用this呢?當局部變數與成員變數重名的時候必須使用this。例如,類中有成員變數id,而方法的參數中也有變數id。看下面的代碼。例:         public Animal(String id){                   this.id = id;         }如果直接寫成id=id,賦值過程無效。 3 什麼時候需要使用super訪問變數和成員方法super表示從父類繼承來的成員變數和成員方法,this可以用來訪問所有的成員變數和成員方法,包括從父類繼承過來的成員變數和成員方法。什麼時候必須使用super呢? 如果父類和子類有同名成員變數或成員方法,預設情況下訪問的是子類的,如果希望訪問從父類繼承的成員,則必須通過super這種方式訪問從父類繼承過來的成員變數。 例:         public void setParentName(String name){                   // 調用從父類繼承過來的成員變數,如果父類和子類有同名成員變數,則必須通過這種方式訪問從父類繼承過來的成員變數                   // super.name = name;                   // 調用從父類繼承過來的成員變數,父類中定義的私人的成員變數和方法是不能訪問的                   super.setName(name);                                      this.print("設定從父類繼承過來的成員!");         } 4 如何使用this訪問其他的構造方法this還可以用來訪問自己的構造方法。用法與調用其它方法不同。下面的代碼展示了用法。例:         public Animal(String id,String name){                   // 調用自己的構造方法,必須放在方法中的第一行                   this(id);                   this.name = name;         }注意:使用this調用自己的構造方法,必須放在構造方法中,並且必須是構造方法的第一行有效代碼。 5 如何使用super訪問父類的構造方法要訪問父類的構造方法需要使用super,用法與使用this訪問自己的構造方法相似。例:         public Dog(String id){                   // 調用父類的構造方法                   super(id);         }         public Dog(String id,String name){                   // 調用父類的構造方法,必須放在方法中的第一行                   super(id);                   this.name = name;         }注意:必須放在構造方法中,並且必須是構造方法中的第一行有效代碼。另外需要注意:必須調用父類構造方法,如果不寫,系統會自動調用父類的無參數構造方法。如果父類沒有參數構造方法,就會出錯。看看下面的代碼會報什麼錯?public class Animal{   protected String id;   public Animal(Stirng id){      this.id = id;   }} public class Dog extends Animal{   protected String name;   public Dog(String name){      this.name = name;   }} 下面的例子展示了this和super的用法。 package thisAndSuper;  public class Animal {         protected String id;         protected String name;         public void setName(String newname){                   // 正常情況下,應該這樣訪問成員變數和成員方法                   name = newname;                   print("初始化名字");         }         public Animal(String id){                   this.id = id;         }         public Animal(String id,String name){                   // 調用自己的構造方法,必須放在方法中的第一行                   this(id);                   this.name = name;         }         public void print(String message){                   System. out.println("Animal--------"+message);         }}  package thisAndSuper;  public class Dog extends Animal{         public String name;         public String x;         public void setName(String name){                   // 調用自己的成員變數,或者從父類繼承過來的成員變數                   this.name = name;                   // 調用從父類繼承過來的成員方法,也可以使用this.print("設定子類成員");                   super.print("設定子類成員"); //this.print("設定子類成員");         }         public void setParentName(String name){                   // 調用從父類繼承過來的成員變數,如果父類和子類有同名成員變數,則必須通過這種方式訪問從父類繼承過來的成員變數                   // super.name = name;                   // 調用從父類繼承過來的成員變數,父類中定義的私人的成員變數和方法是不能訪問的                   super.setName(name);                                      this.print("設定從父類繼承過來的成員!");         }         public Dog(String id){                   // 調用父類的構造方法                   super(id);         }         public Dog(String id,String name){                   // 調用父類的構造方法,必須放在方法中的第一行                   super(id);                   this.name = name;         }         public void print(String message){                   System. out.println("Dog--------"+message);         } } 上一次: 第四十講 向上轉型和強制類型轉換下一次:李緒成 CSDN Blog:http://blog.csdn.net/javaeeteacher邀請您為好友:http://student.csdn.net/invite.php?u=124362&c=7be8ba2b6f3b6cc5
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.