第12章 繼承與接口

12.3 this

Java程序員面試寶典 作者:歐立奇、朱梅、段韜 編著


  面試例題1:下面程序的結(jié)果是什么?[Trend公司面試題]

  class Tester

{

int var;

Tester(double var)

{

      this.var = (int)var;

     

}

 

Tester(int var)

{

      this("hello");

}

 

Tester(String s)

{

      this();

    System.out.println(s);

}

Tester()

{

    System.out.println("good-bye");

}

 

public static void main(String[] args)

{

      Tester t = new Tester(5);

}

}

  答案:

  good-bye
  hello

  擴展知識(變量的內(nèi)存分配情況)

  在Java中有兩個非常特殊的變量:this和super,這兩個變量在使用前都是不需要聲明的。this變量使用在一個成員函數(shù)的內(nèi)部,指向當前對象,當前對象指的是調(diào)用當前正在執(zhí)行方法的那個對象。super變量是直接指向超類的構(gòu)造函數(shù),用來引用超類中的變量和方法。因此它們都是非常有用的變量。下面介紹一下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()函數(shù)中這個對象的方法提示可以直接訪問對象的成員變量,而且在同一個范圍中,定義兩個相同的名字的局部變量是不允許的。如果確實想使類的成員變量與方法的參數(shù)或方法自己定義的局部變量同名的話,就需要想一種方法使成員變量與跟它同名的方法參數(shù)或局部變量區(qū)分開來,這就要使用到this變量。下面改寫一下上面的代碼,使PersonInformation類的構(gòu)造函數(shù)的每個參數(shù)都有與對象成員變量相同的名字,而成員變量的初值由參數(shù)給出。

  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;

  }

  }

  從上例中可以看出,該構(gòu)造函數(shù)中必須使用this。this在方法體中用來指向引用當前正在執(zhí)行方法的那個對象實例。this變量的類型總是為包含前執(zhí)行方法的類。在上例中,我們要區(qū)別參數(shù)name和成員變量name,寫成name=name顯然是不允許的。在參數(shù)或局部變量名與類成員變量名相同的時候,由于參數(shù)或局部變量的優(yōu)先級高,這樣在方法體中參數(shù)名或局部變量名將隱藏同名的成員變量,因此,為了指明成員變量,必須使用this顯式地指明當前對象。

  有時候會遇到這種情況,全面地訪問當前對象,而不是訪問某一個個別的實例對象,此時也可以使用this,并利用Java中的toString()方法(它能夠返回一個描述這個對象的字符串)。如果把任何一個對象傳遞到System.out.println方法中,這個方法調(diào)用這個對象的toString方法,并打印出結(jié)果字符串,所以,可以用System.out.println(this)方法來打印出固有參數(shù)的當前狀態(tài)。

  this還有一個用法,就是構(gòu)造函數(shù)的第一個語句,它的形式是this(參數(shù)表),這個構(gòu)造函數(shù)就會調(diào)用同一個類的另一個相對的構(gòu)造函數(shù)。請看下面的例子。

  class UserInfo

  {

  public UserInfo(String name)

  {

  this(name,aNewSerialNumber);

  }

  public Userinfo(String name,int number)

  {

  userName=name;

  userNumber=number;

  }}

  如果調(diào)用UserInfor newinfotable = new UserInfo("Wayne Zheng"),就會自動調(diào)用UserInfo(String name,int number)構(gòu)造函數(shù)。

  可見,熟練掌握this在Java程序設(shè)計過程中是非常重要的。

  面試例題2:以下代碼的運行結(jié)果是   。[Advantech公司2005年12月面試題]

  class Base{

  int i;

  Base(){

  add(1);

  System.out.println(i);

  }

  void add(int v){

  i+=v;

  System.out.println(i);

  }

  void print(){

  System.out.println(i);

  }}class MyBase extends Base{

  MyBase(){

  add(2);

  }

  void add(int v){

  i+=v*2;

  System.out.println(i);

  }}public class TestClu {

  public static void main(String[] args) {

  go(new MyBase());

  //System.out.println();

  }

  static void go(Base b){

  b.add(8);

  //b.print();

  }}

  A.12   B.11   C.22   D.21

  解析:

  程序流程是這樣的:在主函數(shù)中,首先執(zhí)行new MyBase(),在這個過程中,子類會首先調(diào)用父類的構(gòu)造函數(shù);在父類的構(gòu)造函數(shù)Base()中執(zhí)行add()方法。這里需要注意,這個add方法由于是在新建MyBase對象時調(diào)用的,將會首先查找MyBase類中是否有此方法。所以,Base()函數(shù)中的add(1)實際上是:

   void add(int v)

  { 

  i+=v*2;      System.out.println(i); 

  }

  此時i的值即為2。在打印兩個2之后,父類構(gòu)造函數(shù)執(zhí)行完畢,執(zhí)行子類的構(gòu)造函數(shù),即MyBase(),這里的add(2)當然也是子類的。i的值就變?yōu)榱?。

  最后執(zhí)行g(shù)o函數(shù),i即為22。
  答案:C


上一章目錄下一章

Copyright ? 讀書網(wǎng) www.dappsexplained.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號