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)