Java中的兩個特殊變數this和super
來源:互聯網
上載者:User
變數 Java中的兩個特殊變數this和super2001-04-26· ·Wayne ··yesky 在Java中有兩個非常特殊的變數:this和super,這兩個變數在使用前都是不需要聲明的。this變數使用在一個成員函數的內部,指向當前對象,當前對象指的是調用當前正在執行方法的那個對象。super變數是直接指向超類的建構函式,用來引用超類中的變數和方法。因此它們都是非常有用的變數,下面我想介紹一下this和super的使用方法。 1、this 讓我們先看一段代碼吧: class PersonInformation { String name,gender,nationality,address; int age; void PersonInformation(String p_name,String p_gender,String p_nationality,String p_address,int p_age) { name=p_name; gender=p_gender; nationality=p_nationality; address=p_address; age=p_age; } } 你會發現,在PersonInformation()函數中這個對象的方法提示可以直接存取對象的成員變數的,而且在同一個範圍中,定義兩個相同的名字的局部變數是不允許的,如果確實想使類的成員變數和方法的參數或方法自己定義的局部變數同名的話就需要想一種方法使成員變數與更它同名的方法參數或局部變數區分開來,這就要使用到this變數。下面我想改寫一下上面的代碼,使PersonInformation類的建構函式的每個參數都有與對象成員變數相同的名字,而成員變數的初值由參數給出。 class PersonInformation { String name,gender,nationality,address; int age; void PersonInformation(String name,String gender,String nationality,String address,int age) { this.name=name; this.gender=gender; this.nationality=nationality; this.address=address; this.age=age; } } 由上一例中,我們可以看出,該建構函式中必須使用this,this在方法體重用來指向引用當前正在執行方法的那個對象執行個體,this變數的類型總是為包含前執行方法的類,上例中,我們要區別參數name和成員變數name,寫成name=name顯然是不允許的,在參數或局部變數名與類成員變數同名的時候,由於參數或局部變數的優先順序高,這樣在方法體中參數名或局部變數名將隱藏同名的成員變數,因此,為了值名成員變數,你必須使用this顯示地指明當前對象。 有時候會遇到這種情況,我們全面的訪問當前對象,而不是訪問某一個個別的執行個體對象,我們也可以使用this,並利用Java中的toString()方法(它能夠返回一個描述這個對象的字串)如果把任何一個對象傳遞到System.out.println方法中,這個方法調用這個對象的toString方法,並列印出結果字串,所以,我們可以用如下方法System.out.println(this),來列印出任何對方法固有參數的目前狀態。 this還有一個用法,就是建構函式的第一個語句,它的形式是this(參數表),這個建構函式就會調用同一個類的另一個相對的建構函式。請看下面的例子: class UserInfo { public UserInfo(String name) { this(name,aNewSerialNumber); } public Userinfo(String name,int number) { userName=name; userNumber=number; } } 如果你調用UserInfor newinfotable = new UserInfo("Wayne Zheng")後,就會自動調用UserInfo(String name,int number)建構函式。 可見,熟練掌握this在Java程式設計過程中是非常重要的 2、super 在Java中,有時還會遇到子類中的成員變數或方法與超類(有時也稱父類)中的成員變數或方法同名,因為子類中的成員變數或方法名優先順序高,所以子類中的同名成員變數和方法就隱藏了超類的成員變數或方法,但是我們如果想要使用超類中的這個成員變數或方法,此使就需要用到super,請看下面的類。 class Country { String name; void value() { name="China"; } } 下面的子類中,自類的成員變數和方法隱藏了超類的成員變數name和方法value(), class City extends Country String name; void value() { name="Hefei"; super.value(); System.out.println(name); System.out.println(super.name); } 為了在子類中引用超類中的成員變數name和方法value(),在代碼中我們使用了super,super.name和super.value(); 所以顯示的結果為 Hefei China 如果我們想要使用超類的建構函式則應當使用super(參數列表)的形式。