this关键字
this可以强调用的是本类中的方法,还可以表示类中的属性、可以使用this调用本类中的方法、this表示当前的对象。
一. 使用this调用本类中的属性
在程序中可以使用this调用本类属性
class Preason
{
private String name;
private int age;
public void Preason(String n,int a){
name=n;
age=a;
}
public String getInfo(){
return "姓名:"+name+",年龄:"+age;
}
}
在此构造方法中目的很明确,就是为类中的属性赋值,但是从构造方法的传递参数很难看出参数n和a的意义,所以为了可以清楚的表示参数的意义,可以进行如下修改:
class Preason
{
private String name;
private int age;
public void Preason(String name,int age){
name=name;
age=age;
}
public String getInfo(){
return "姓名:"+name+",年龄:"+age;
}
}
此时可以从参数的名称中看出其真实意义,要传递的第一个参数是姓名,第二个参数是年龄,但是构造方法内部会出现错误,运行结果为:
姓名:null,年龄:0
从程序运行结果中可以发现,姓名为null,年龄为0,并没有把构造方法传递进去的参数值赋给属性,那么就证明现在的构造方法并不能成功的把传递进去的值赋值给类中的属性。由于在赋值时属性并不是明确地被指出,所以造成此错误,而之中错误就可以用this关键字来解决。代码修改如下:
class Person
{
private String name;
private int age;
public Person(){
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getInfo(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class ThisDemo01
{
public static void main(String[] args)
{
Person per1=new Person("张三",30);
System.out.println(per1.getInfo());
}
}
运行结果:
姓名:张三,年龄:30
从结果来看,程序的目的达到了。在构造方法中明确的标识了类中的两个属性“this.name”和“this.age”,所以在进行赋值时也不会产生歧义。为了避免类似歧义的发生,建议以后在类中访问属性时都加上this关键字。
二. 使用this调用构造方法
如果一个类中有多个构造方法,也可以利用this关键字互相调用。
【使用this调用本类的构造方法】
class Person
{
private String name;
private int age;
public Person(){
System.out.println("一个新的Person对象被实例化");
}
public Person(String name,int age){
this();
this.name=name;
this.age=age;
}
public String getInfo(){
return "姓名:"+name+",年龄:"+age;
}
}
public class ThisDemo03
{
public static void main(String[] args){
Person per1=new Person("张三",33);
System.out.println(per1.getInfo());
}
}
运行结果为:
一个新的Person对象被实例化
姓名:张三,年龄:33
本程序中提供了两个构造方法,其中有两个参数的构造方法中使用this()的形式调用本类中的无参构造方法,所以即使是通过有两个参数的构造方法实例化,最终结果还是会把对象实例化的信息打印出来。
在使用this()调用构造方法的时候,要注意的是:由于构造方法是在实例化对象时自动调用的,也就是说在类中的所有方法中,只有构造方法是被优先调用的,所以使用this()调用构造方法必须也只能在构造方法的首行;在构造方法间相互调用时一定要留一个出口,一般会将无参数的构造方法作为出口,即在无参构造方法中最好不要再去调用其他构造方法。
三. this表示当前的对象
前面已经讲解了如何使用this调用属性和何时使用this调用方法,实际上在这些特性外,this最重要的特点即使表示当前对象,在Java中当前对象就是指当前正在调用类中方法的对象。
【this表示当前对象】
class Person{ // 定义Person类
public String getInfo(){ // 取得信息的方法
System.out.println("Person类 --> " + this) ; // 直接打印this
return null ; // 为了保证语法正确,返回null
}
};
public class ThisDemo06{
public static void main(String args[]){
Person per1 = new Person() ; // 调用构造实例化对象
Person per2 = new Person() ; // 调用构造实例化对象
System.out.println("MAIN方法 --> " + per1) ; // 直接打印对象
per1.getInfo() ; // 当前调用getInfo()方法的对象是per1
System.out.println("MAIN方法 --> " + per2) ; // 直接打印对象
per2.getInfo() ; // 当前调用getInfo()方法的对象是per2
}
};
运行结果:
MAIN方法 --> Person@15db9742
Person类 --> Person@15db9742
MAIN方法 --> Person@6d06d69c
Person类 --> Person@6d06d69c
从程序的运行结果来看,直接打印对象和调用getInfo()方法打印的结果是一样的,而且在getInfo()方法中打印的永远是一个this关键字,也就是说哪个对象调用了类中的方法,则this就表示哪个对象,这一个特性的用途如下例:
class Person{ // 定义Person类
private String name ; // 姓名
private int age ; // 年龄
public Person(String name,int age){
this.setName(name) ;
this.setAge(age) ;
}
public boolean compare(Person per){
// 调用此方法时里面存在两个对象:当前对象、传入的对象
Person p1 = this ; // 当前的对象,就表示per1
Person p2 = per ; // 传递进来的对象,就表示per2
if(p1==p2){ // 判断是不是同一个对象,用地址比较
return true ;
}
// 之后分别判断每一个属性是否相等
if(p1.name.equals(p2.name)&&p1.age==p2.age){
return true ; // 两个对象相等
}else{
return false ; // 两个对象不相等
}
}
public void setName(String name){ // 设置姓名
this.name = name ;
}
public void setAge(int age){ // 设置年龄
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
};
public class ThisDemo08{
public static void main(String args[]){
Person per1 = new Person("张三",30) ; // 声明两个对象,内容完全相等
Person per2 = new Person("张三",30) ; // 声明两个对象,内容完全相等
// 直接在主方法中依次取得各个属性进行比较
if(per1.compare(per2)){
System.out.println("两个对象相等!") ;
}else{
System.out.println("两个对象不相等!") ;
}
}
};
运行结果为:
两个对象相等!
以上程序Person类中定义了一个compare方法,此方法的主要功能就是专门完成两个对象的比较操作,在比较时,首先进行地址的比较,如果两个对象的地址一样,,则肯定是同一个对象,如果不相等,则将一个个属性进行依次的比较。