this常见的用法有两种:
1.用this调用成员变量和成员函数
class Person
{
String name ;
void talk()
{
System.out.println("my name is" + this.name);
}
}
class Test
{
public static void main(String args[])
{
Person p1 = new Person();
p1.name = "zhangsan";
p1.talk();
}
}
编译后执行Test,打印出“my name is zhangsan”
this是一个对象,代表调用了"this所在函数的"那个对象,比如上面,p1.talk()调用了talk(),this就代表p1。this.name相当于p1.name。
this一般不加也可以,比如上面第一段函数中的this。但是当成员变量和参数名一致的时候就必须加this,比如下面这种情况:
class Person
{
String name ;
void talk(name)
{
System.out.println("my name is" + name);
}
}
注意这里是没有加this的;这个时候如果在Test里的talk函数里传入“zhangsan1”,如下:
class Test
{
public static void main(String args[])
{
Person p1 = new Person();
p1.name = "zhangsan";
p1.talk(zhangsan1);
}
}
编译执行Test后打印出来的就是"my name is zhangsan1"。就是说默认传给了参数。如果要传递给成员变量的name,就要加this。
同样,this作为对象,可以调用成员函数。
2.this调用构造函数
class Person
{
String name ;
int age ;
String address ;
Person()
{
System.out.println("无参数构造函数");
}
Person(String s1 , int a , String s2)
{
name = s1 ;
age = a ;
address = s2 ;
}
void talk()
{
System.out.println("my name is" + this.name);
}
}
用了this,上面就可以这样写:
class Person
{
String name ;
int age ;
String address ;
Person()
{
System.out.println("无参数构造函数");
}
Person(String name , int age , String address)
{
this.name = name ; //第一个name是成员变量,第二个name是参数
this.age = age ;
this.address = address ;
}
void talk()
{
System.out.println("my name is" + this.name);
}
}
或者当你不需要给所有的成员变量赋值,比如只需给name 和 age赋值,可以加一个构造函数:
class Person
{
String name ;
int age ;
String address ;
Person()
{
System.out.println("无参数构造函数");
}
Person(String name , int age)
{
this.name = name ;
this.age = age ;
}
Person(String name , int age , String address)
{
this.name = name ; //第一个name是成员变量,第二个name是参数
this.age = age ;
this.address = address ;
}
void talk()
{
System.out.println("my name is" + this.name);
}
}
但是这样存在重复代码,这时候可以用this的第二种用法:
class Person
{
String name ;
int age ;
String address ;
Person()
{
System.out.println("无参数构造函数");
}
Person(String name , int age)
{
this.name = name ;
this.age = age ;
}
Person(String name , int age , String address)
{
this(name , age);
this.address = address ;
}
void talk()
{
System.out.println("my name is" + this.name);
}
}
this调用哪一个构造函数,根据this()中传入的参数个数和类型来决定,比如调用无参构造函数只要写this();即可。注意,这种用法要求对this的调用必须是第一条语句。这样产生了一个矛盾,能不能在三个参数的构造函数里同时调用其他两个构造函数?在this(name , age );之前写一个this();是不可以的。但是可以在第二个构造函数里面写一个this();,形成一个接力形式。也就是:
class Person
{
String name ;
int age ;
String address ;
Person()
{
System.out.println("无参数的构造函数");
}
Person(String name , int age)
{
this();
this.name = name ;
this.age = age ;
System.out.println("两个参数的构造函数");
}
Person(String name , int age , String address)
{
this(name , age);
this.address = address ;
System.out.println("三个参数的构造函数");
}
void talk()
{
System.out.println("my name is" + this.name);
}
}
如此一来,用一个Test来调用:
class Test
{
public static void main(String args[])
{
Person p = new Person("Zhangsan" , 20 , "Beijing");
}
}
打印出的是:
无参数的构造函数
两个参数的构造函数
三个参数的构造函数
(为什么可以直接打印出这三句话呢?见“构造函数”)
(end)