1 使用this来区分当前对象
Java中为解决变量的命名冲突和不确定性问题,引入关键字“this”代表其所在方法的当前对象:
构造器中指该构造器所创建的新对象;
方法中指调用该方法的对象;
在类本身的方法或构造器中引用该类的实例变量和方法。
this只能用在构造器或者方法中,用于获得调用当前的构造器、方法的对象引用。可以和任何的对象引用一样来对处理这个this对象。
下面我们以一个案例来演示一下如何在一个类的方法中调用同一个类的另一个方法:
public class Person {
private String name;
private int age;
private String sex;
public String showName() {
return this.name;
}
public void setName(String theName) {
this.name = theName;
}
// ... ...
}
在这个类“Person”中,定义了两个方法用于存取name属性。我们来看一下showName()这个方法,它将返回当前对象的name属性的值,在这里就使用了this来表示当前的对象的属性,在方法setName()中也有类似的用法。
其实,如果你只是在类的某个方法或构造器中调用另一个方法,可以不用显式使用this。
这样的写法虽然并非必要,但这种写法可以使得你的程序清晰易读,特别是在你的方法中的参数名称和属性名称一样的时候,例如,如果方法setName()中的参数名称也是为name,那么,如果没有用this来标示对象的属性,方法中的代码将如下所示:
… …
public void setName(String name){
name = name;
}
… …
那么,这里面的两个“name”就不是很好区别了。
还有一种情况是必需使用this关键字的,那就是当你需要在对象中明确的指明当前的对象引用是本对象的时候。比如,当你需要返回当前的对象的时候,就需要用到this关键字了。
public class Account {
private int accountId = 100000;
public Account createAccount() {
accountId++;
return this;
}
public int getAccountId() {
return accountId;
}
public static void main(String[] args) {
Account account = new Account();
System.out.println("账号是:"
+ account.createAccount().createAccount().getAccountId());
}
}
由于createAccount()方法返回了同一个对象,所以可以在这个对象上多次调用方法createAccount()。
编译并运行上面的程序,将得到如下的输出:
账号是:100002
2 在构造器中使用this来调用对象本身的其他构造器
当我们给一个重载构造器的时候,可能在一个构造器中的一段代码和另一个构造器完全一样,那么,就可以在这个构造器中直接调用另一个构造器,这样可以避免编写相同的代码。
在构造器中使用下面的方式可以调用对象本身的其他的构造器,语法如下:
this([args_list]);
直接用this()加上类构造器所需要的参数,就可以调用类本身的其他构造器了。
如果类中有多个其他构造器定义,系统将自动根据this()中的参数个数和参数类型来找出类中相匹配的构造器。
我们来看一个在构造器中使用this()的例子:
public class Person {
private String name;
private int age;
private String sex;
public Person() {
System.out.println("构造器Person()被调用");
sex = "Male";
System.out.println("name=" + name + " ,age=" + age + " ,sex=" + sex);
}
public Person(String theName) {
// 调用构造器Person()
this();
System.out.println("构造器Person(String theName)被调用");
name = theName;
System.out.println("name=" + name + " ,age=" + age + " ,sex=" + sex);
}
public Person(String theName, int theAge) {
// 调用构造器Person(String theName)
this(theName);
System.out.println("构造器Person(String theName,int theAge)被调用");
age = theAge;
System.out.println("name=" + name + " ,age=" + age + " ,sex=" + sex);
}
// … …
}
在这个示例中,我们定义了一个类“Person”,这个类中定义了三个构造器:没有参数的构造器、有一个参数的构造器以及有两个参数的构造器。没有参数的构造器将以“Male”值来初始化新建对象的sex属性。
下面我们重点来看后面两个构造器,在带一个参数的构造器中,接收一个String类型的参数theName(姓名)来创建对象,这个构造器代码块里面有一条语句:
this();
这条语句的作用是用于调用改对象的没有参数的构造器,也就是Person();而在带两个参数的构造器中,接收theName(姓名)和theAge(年龄)来创建对象,它也通过this()来调用了该对象中的另外一个构造器:
this(theName);
此时,这条语句调用的是带一个String类型参数的构造器,在这里是Person(String theName)这个构造器。
注意:
在构造器中可以通过this()方式来调用其他的构造器,但在一个构造器中最多只能调用一次其他的构造器。并且,对其他构造器的调用动作必须在构造器的起始处,否则编译的时候将会出现错误。
另外,不能在构造器以外的地方以这种方式调用构造器。