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

变量

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(参数列表)的形式。

时间: 2024-11-03 12:42:05

Java中的两个特殊变量this和super的相关文章

java中,两个jar通讯问题

问题描述 java中,两个jar通讯问题 比如一个1.jar打开另一个2.jar1.jar想改变2.jar里的正在运行中参数状态它们之间怎么通讯?不用socket,因为它要堵塞 解决方案 Java多线程中的两个问题 解决方案二: http://blog.csdn.net/isea533/article/details/44566257

java中这两个构造方法一个队,一个错?感觉没有区别啊?

问题描述 java中这两个构造方法一个队,一个错?感觉没有区别啊? 第一种: public class point { private double x; private double y; public point(){ this(0,0); } public point(double x, double y){ this.x = x; this.y = y; } } 第二种 public class point { private double x; private double y; pu

JAVA中获取两个字符串差异的方法

问题描述 JAVA中获取两个字符串差异的方法 求助,在编程的过程中碰到这样一个问题,有两个String字符串,然后我需要获取他们之间的差异 String s = {"12345"}; String s1 ={"123645"}; 其中这两个数组的长度可变,s是模板,所有的数组都要和这个数组比较,然后把差异的部分获取出来 所以s1可以是缺了一两个元素的数组,仅仅是单个的字符被替换了,这个可以简单的用字符数组一个一个比较获得,但是如果多一个,或者少一个,这一块我就有点不

java 二维数组-java中把两个维数相同的矩阵对应的元素相加得到新的矩阵的代码

问题描述 java中把两个维数相同的矩阵对应的元素相加得到新的矩阵的代码 java中把两个维数相同的矩阵对应的元素相加得到新的矩阵的代码怎么写,在int[][] add(int[][]a,int[][] b)中添加代码,实现这个功能 解决方案 循环不就行了,和遍历差不多.

Java中的两种for循环介绍_java

复制代码 代码如下: package com.zxd.test; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import com.zxd.bea

java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况

/* 样例1:   class Parent{      int num = 3;   }     class Child extends Parent{      int num = 4;   } */   /* 样例2: class Parent{   }   class Child extends Parent{     int num = 4; } */   /* 样例3: class Parent{     void show(){         System.out.println

java中计算两个日期相差几天

  1.public class Test { 2.public void dateDiff(String startTime, String endTime, String format) { 3.//按照传入的格式生成一个simpledateformate对象 4.SimpleDateFormat sd = new SimpleDateFormat(format); 5.long nd = 1000*24*60*60;//一天的毫秒数 6.long nh = 1000*60*60;//一小时

JAVA中关于两个Frame 其中一个覆盖另一个的问题 求教!

问题描述 有两个FrameFrame1和Frame2Frame1上有一个按钮有其他随便什么控件点按钮一Frame2显示此时Frame1上的东西是不能操作的只有关闭Frame2才能对Frame1上的控件进行操作请问怎么实现啊??

java 中的 final 变量

http://wenjiesu.iteye.com/blog/799332 [java中为什么会有final变量]:     final这个关键字的含义是"这是无法改变的"或者"终态的":     那么为什么要阻止改变呢?     java语言的发明者可能由于两个目的而阻止改变:     1).效率问题:         jdk中的某些类的某些方法,是不允许被用户覆盖的,设计者可能认为,所用方法已经是最好的方法,         用户私自覆盖,或是由于疏忽而覆盖,就