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