在Java中有两个非常特殊的变量:this和 super,这两个变量在使用前都是不需要声明的。this变量使用在成员函数的内部,指向当前对象。super变量直接指向超类的构造函数,用来引用超类中的变量和方法。 一、this 1、区分同名的成员变量与方法参数 Example 1:
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在方法体中重用来指向引用当前正在执行方法的那个对象实例,为了区别参数name和成员变量name,写 成name=name显然是不允许的,在参数或局部变量名与类成员变量同名的时候,由于参数或局部变量的优先级高,这样在方法体中参数名或局部变量名将隐藏同名的成员变量,因此,为了指明成员变量,必须使用this显式地指明当前对象。 2、
this还有一个用法,就是构造函数的第一个语句,它的形式是this(参数表),这个构造函数会调用同一个类的另一个对应的构造函数。 Example2:
class test_this {
public static void main(String[] args) {
UserInfo user = new UserInfo("abc");
System.out.printf("the user's name is %s, and the number is %d/n",
user.getName(), user.getNumber());
}
}
class UserInfo
{
private String name;
private int number;
public UserInfo( String name ) // Constructor1
{
this(name,78);
}
public UserInfo( String name, int number ){ //Constructor2
this.name = name;
this.number = number;
}
public String getName(){
return name;
}
public int getNumber() {
return number;
}
}
二、super 在Java中,有时还会遇到子类中的成员变量或方法与超类(有时也称父类)中的成员变量或方法同名,因为子类中的成员变量或方法名优先级高,所以子类中的同名成员变量和方法就隐藏了超类的成员变量或方法,如果此时想要使用超类中的这个成员变量或方法,就需要用到super。 Example1
class super_demo {
public static void main(String[] args) {
City ct = new City();
ct.setValue();
}
}
class Country
{
String name;
void setValue()
{
name="China";
}
}
class City extends Country {
String name;
void setValue()
{
name = "Beijing";
super.setValue();
System.out.println(name);
System.out.println(super.name);
}
}
Example2 public class Bird{ private String name; public Bird( ){ } public Bird(String name) { this.name =name; } public void walk( ) { System.out.println("Walk"); } public String getName( ) { return name; } public void setName(String name) { this.name=name; } } public class Chicken extends Bird { private String crest; public Chicken ( ) { super( ); // 用于构造函数里,继承超类的成员变量和方法 } public Chicken(String name, String crest) { super(name); this.crest=crest; } public void setCrest(String crest) { this.crest=crest; } public String getCrest( ) { return crest; } public void wu(){ System.out.println("gu...gu..."); } } public class Demo { public static void main(String[] args) { Chicken chicken1 = new Chicken("aaa", "red"); Chicken chicken2 = new Chicken(); System.out.printf("chicken1 name: %s, crest: %s./n", chicken1.getName(), chicken1.getCrest()); chicken1.wu(); System.out.printf("chicken2 name: %s, crest: %s./n", chicken2.getName(), chicken2.getCrest()); chicken2.wu(); } }