回 帖 发 新 帖 刷新版面

主题:Java中的this和super

在[url=http://www.javazh.cn]java[/url]中有两个非常特殊的变量:[url=http://www.javazh.cn]this[/url]和super,这两个变量在使用前都是不需要声明的。this变量使用在一个成员函数的内部,指向当前对象,当前对象指的是调用当前正在执行方法的那个对象。super变量是直接指向超类的构造函数,用来引用超类中的变量和方法。因此它们都是非常有用的变量,下面我想介绍一下[url=http://www.javazh.cn]this[/url]和super的使用方法。

  1、this

  让我们先看一段代码吧:

  class [url=http://www.javazh.cn]PersonInformation[/url]

  {

   String name,gender,nationality,address;

   int [url=http://www.javazh.cn]age[/url];

   void PersonInformation(String p_name,String p_gender,String p_nationality,String p_address,int p_age)

   {

    [url=http://www.javazh.cn]name[/url]=p_name;

    gender=p_gender;

    nationality=p_nationality;

    [url=http://www.javazh.cn]address[/url]=p_address;

    age=p_age;

   }

  }
 
  你会发现[url=http://www.javazh.cn],[/url]在PersonInformation()函数中这个对象的方法提示可以直接访问对象的成员变量的,而且在同一个范围中,定义两个相同的名字的局部变量是不允许的,如果确实想使类的成员变量和方法的参数或方法自己定义的局部变量同名的话就需要想一种方法使成员变量与更它同名的方法参数或局部变量区分开来,这就要使用到this变量[url=http://www.javazh.cn]。[/url]下面我想改写一下上面的代码,使PersonInformation类的构造函数的每个参数都有与对象成员变量相同的名字,而成员变量的初值由参数给出。
[url=http://www.javazh.cn][/url]
  class PersonInformation

   {

    String name,gender,nationality,address;

    int age;
[url=http://www.javazh.cn][/url]
    void [url=http://www.javazh.cn]PersonInformation[/url](String name,String gender,String nationality,String address,int age)

    {

    this.name=name;

    [url=http://www.javazh.cn]this[/url].gender=gender;

    this.nationality=nationality;

    this.address=address;

    this.age=age;

    }

   }
[url=http://www.javazh.cn][/url]
  [url=http://www.javazh.cn]由上[/url]一例中,我们可以看出,该构造函数中必须使用this,this在方法体重用来指向引用当前正在执行方法的那个对象实例,this变量的类型总是为包含前执行方法的类,上例中,我们要区别参数name和成员变量name,写成name=name显然是不允许的,在参数或局部变量名与类成员变量同名的时候,由于参数或局部变量的优先级高,这样在方法体中参数名或局部变量名将隐藏同名的成员变量,因此,为了值名成员变量,你必须使用[url=http://www.javazh.cn]this[/url]显示地指明当前对象。

  有时候会遇到这种情况,[url=http://www.javazh.cn]我[/url]们全面的访问当前对象,而不是访问某一个个别的实例对象,我们也可以使用this,并利用Java中的toString()方法(它能够返回一个描述这个对象的字符串)如果把任何一个对象传递到System.out.println方法中,[url=http://www.javazh.cn]这个[/url]方法调用这个对象的toString方法,并打印出结果字符串,所以,我们可以用如下方法System.out.println(this),[url=http://www.javazh.cn]来[/url]打印出任何对方法固有参数的当前状态。

  this还有一个用法,[url=http://www.javazh.cn]就[/url]是构造函数的第一个语句,它的形式是this(参数表),这个构造函数就会调用同一个类的另一个相对的构造函数。请看下面的例子:

  class [url=http://www.javazh.cn]UserInfo [/url]

  {

   public [url=http://www.javazh.cn]UserInfo[/url](String name)

   {

    this(name,aNewSerialNumber);

   }[url=http://www.javazh.cn][/url]

   public Userinfo(String name,int number)

   {

    userName=name;

    userNumber=number;

   }

   }

  如果你调用[url=http://www.javazh.cn]UserInfor [/url]newinfotable = new UserInfo("aaron")后,就会自动调用UserInfo(String name,int number)构造函数。

   可见,熟练掌握this在Java程序设计过程中是非常重要的
2、super

  在Java中,有时还会遇到子类中的成员变量或方法与超类(有时也称父类)中的成员变量或方法同名,因为子类中的成员变量或方法名优先级高,所以子类中的同名成员变量和方法就隐藏了超类的成员变量或方法,但是我们如果想要使用超类中的这个成员变量或方法[url=http://www.javazh.cn],[/url]此使就需要用到super,请看下面的类。

   class Country

   {

    String name;

    void value()

    {

     name="China";

    }

   }

  下面的子类中,自类的成员变量和方法隐藏了超类的成员变量name和方法value(),

   class City [url=http://www.javazh.cn]extends[/url] Country

    String name;

    void value() 

    {

     name="Beijing";

     super.value();

     System.out.println(name);

     System.out.println(super.name);

    }
 
   为了在子类中引用超类中的成员变量[url=http://www.javazh.cn]name[/url]和方法value(),在代码中我们使用了super,super.name和super.value();

   所以显示的结果为

   Beijing

   China

   如果我们想要使用超类的构造函数则应当使用super(参数列表)的形式[url=http://www.javazh.cn][/url]。

回复列表 (共1个回复)

沙发

谢谢了,说的很好

我来回复

您尚未登录,请登录后再回复。点此登录或注册