1 this关键字
this的实际使用可以做三件事:调用本类属性、调用本类方法(普通、构造)、表示当前对象(相对概念)
1.1 this调用本类属性
范例:观察如下程序
代码
class Person{
private String name;
private int age;
// setter、getter、无参构造略
public Person(String n,int a){
name = n;
age = a;
}
public String getInfo(){
return "name : " + name + ", age : " + age ;
}
}
public class ThisDemo {
public static void main(String args[]){
System.out.println(new Person("zhangsan",20).getInfo());
}
} // name : zhangsan, age : 20
但是给出的参数存在问题,当前类的构造方法的核心目的在于:为类中的name和age属性初始化。但是构造方法的参数声明不准确(String n,int a),最好的方法是将参数的名称与属性名称统一起来。
这个时候可能会产生参数与属性同名的问题,为了明确标记处要使用的是属性还是方法的参数,那么属性前都统一加上“this”的形式。
范例:属性前加“this”
代码
class Person{
private String name;
private int age;
public Person(String name,int age){
// this.属性:表示当前对象中的属性,这样就不会与方法中的参数名称混淆。
this.name = name;
this.age = age;
}
public String getInfo(){
return "name : " + this.name + ", age : " + this.age ;
}
}
public class ThisDemo {
public static void main(String args[]){
System.out.println(new Person("zhangsan",20).getInfo());
}
} // name : zhangsan, age : 20
只要在类的方法中访问有类的属性,就要加“this”关键字。
1.2 this调用本类方法
类的方法一共有两种:
- 普通方法:this.方法名称(参数…);
- 构造方法:this(参数…);
范例:调用本类普通方法
代码
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
// 问题是不使用this也可以调用
this.print(); // 调用本类方法
}
public void print(){
System.out.println("*************************");
}
public String getInfo(){
return "name : " + this.name + ", age : " + this.age ;
}
}
public class ThisDemo {
public static void main(String args[]){
System.out.println(new Person("zhangsan",20).getInfo());
}
}
输出结果
*************************
name : zhangsan, age : 20
虽然调用本类方法前可以不使用this,但是建议使用,目的是区分方法的定义来源。
构造方法与普通方法的最大区别:
使用关键字new实例化类新对象的时候使用一次,而普通方法是在对象实例化完成后(构造方法已经执行过了)可以调用多次。
在Java中支持类构造方法的互相调用。
范例:观察构造方法存在的问题
代码
class Person{
private String name;
private int age;
// 要求不管调用哪个构造方法,都要执行一个信息输出
public Person(){ // 无参构造
System.out.println("*****一个新的Person类对象产生*****");
}
public Person(String name){
System.out.println("*****一个新的Person类对象产生*****");
this.name = name;
}
public Person(String name,int age){
System.out.println("*****一个新的Person类对象产生*****");
this.name = name;
this.age = age;
}
public String getInfo(){
return "name : " + this.name + ", age : " + this.age ;
}
}
public class ThisDemo {
public static void main(String args[]){
System.out.println(new Person().getInfo());
System.out.println(new Person("zhangsan").getInfo());
System.out.println(new Person("zhangsan",20).getInfo());
}
}
输出结果
*****一个新的Person类对象产生*****
name : null, age : 0
*****一个新的Person类对象产生*****
name : zhangsan, age : 0
*****一个新的Person类对象产生*****
name : zhangsan, age : 20
存在代码重复,必须消除掉重复代码,使用“this”。
范例:使用this解决问题
代码
class Person{
private String name;
private int age;
// 要求不管调用哪个构造方法,都要执行一个信息输出
public Person(){ // 无参构造
System.out.println("*****一个新的Person类对象产生*****");
}
public Person(String name){
this(); // 调用本类中无参构造
this.name = name;
}
public Person(String name,int age){
this(name); // 调用本类中有参构造
// this.name = name;
this.age = age;
}
public String getInfo(){
return "name : " + this.name + ", age : " + this.age ;
}
}
public class ThisDemo {
public static void main(String args[]){
System.out.println(new Person().getInfo());
System.out.println(new Person("zhangsan").getInfo());
System.out.println(new Person("zhangsan",20).getInfo());
}
}
输出结果
*****一个新的Person类对象产生*****
name : null, age : 0
*****一个新的Person类对象产生*****
name : zhangsan, age : 0
*****一个新的Person类对象产生*****
name : zhangsan, age : 20
虽然使用this可以实现构造方法的互相调用,但有两点要求:
- this()调用构造方法的语句必须放在构造方法的首行;
- 使用this()调用构造方法的时候请留有出口,避免递归调用构造器。
1.3 this表示当前对象
在一个类中肯定会产生若干个对象,那么程序类在分辨的时候不会记住具体有多少个对象产生,它唯一可能知道的是,当前操作本类的对象是哪一个。
范例:观察当前对象
代码
class Person{
public void fun(){
System.out.println(" [fun] " + this);
}
}
public class ThisDemo {
public static void main(String args[]){
Person p1 = new Person();
System.out.println(" [main] " + p1);
p1.fun(); // 由p1这个对象调用了fun()方法(this = p1)
System.out.println("=========================");
Person p2 = new Person();
System.out.println(" [main] " + p2);
p2.fun();
}
}
输出结果
[main] Person@1540e19d
[fun] Person@1540e19d
=========================
[main] Person@677327b6
[fun] Person@677327b6
在整体操作过程中,this定义没有变,只要有某一个对象调用了本类中的方法,那么这个this就表示当前执行的对象。