[ 永远的UNIX::UNIX技术资料的宝库 ]

首页 > 编程技术 > Java > 正文
 

Java中的两个特殊变量this和super

来源:不详 (2006-06-01 16:52:32)

在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("aaron")后,就会自动调用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="Beijing";

     super.value();

     System.out.println(name);

     System.out.println(super.name);

    }
 
   为了在子类中引用超类中的成员变量name和方法value(),在代码中我们使用了super,super.name和super.value();

   所以显示的结果为

   Beijing

   China

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



 
 相关文章
集成JSP、PHP和JAVA于一体的开发环境 2005-01-18 16:50:01
Redhat linux 9下让PHP支持java类 2005-01-21 11:00:53
在C、JAVA、PHP中操作postgreSql 2005-01-24 15:31:35
JavaBean 介绍 2005-01-27 17:49:58
Sun发布 Java Desktop 3系统 2005-02-21 17:09:51
IBM推动PHP发展,是否寻求Java替身? 2005-02-28 11:49:58
Eclipse 照亮Java众生 扩大地盘 2005-03-02 09:35:34
分析: Sun简化Java授权 开源之门只开一道缝 2005-03-17 15:26:00
Open Solaris能否复制Java的成功 2005-03-31 10:02:43
Sun CEO访华宣讲Solaris/Java 与曙光结盟 2005-04-11 10:21:15
Apache计划开发开源版Java Sun表示欢迎 2005-05-11 08:50:50
Firefox又现2极危缺陷 建议关闭JavaScript 2005-05-11 08:51:09
JAX2005-业界和社区的Java盛会 2005-05-12 11:05:54
脚本语言在企业软件领域崛起 会威胁Java吗? 2005-05-17 08:57:01
取悦Java编程人员 Macromedia要走开源之路 2005-06-07 09:14:40
LAMP挑战.Net、Java 商业软件呈三足鼎立 2005-06-15 11:14:31
Sun推Java软件分享项目 仍不是真正开源 2005-06-22 10:05:01
JBoss推Java升级软件 增添对业界标准支持 2005-06-22 22:52:06
BEA推出基于Java的高速芯片 对抗IBM的进攻 2005-06-27 09:14:07
JavaOne 大会今天开展,NoKia抢尽风头 2005-06-27 10:48:55
 

★  感谢所有的作者为我们学习技术知识提供了一条捷径  ★
www.fanqiang.com