this关键字小结

在java中,this关键字的语法比较灵活,可是使用this强调本类中的方法、表示类中的属性、调用本类的构造方法、表示当前对象。

1.表示类中属性

如下一道代码,其中没有使用this关键字

class Person{  
      private String name ;  
      private int age ;   
      public Person(String name,int age){ // 通过构造方法赋值
                name = name ;
              age = age ;
      }
      public String getInfo(){ 
             return "姓名:" + name + ",年龄:" + age ;
      }
};
public class ThisDemo{
      public static void main(String args[]){
             Person per1 = new Person("张三",33) ; 
             System.out.println(per1.getInfo()) ; 
      }
};

 该程序输出结果为姓名:null,年龄:0 

在该程序中并没有正确的将内容赋值属性。

在这里name=name;  age=age;中,此时操作的name和age实际上都是构造方法中的,跟类中的属性完全不沾边。

所以此时,为了明确的表示出那个是类中的属性,此时就要加上“this.属性名称”的操作。如下程序所示

class Person{ 
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String getInfo(){
return "姓名:" + name + ",年龄:" + age ;
}
};
public class ThisDemo{
public static void main(String args[]){
Person per1 = new Person("张三",33) ;
System.out.println(per1.getInfo()) ;
}
};

 

2.使用this调用构造方法

如果在一个类中有多个构造方法的话,也可以利用this关键字互相调用。如下程序所示

class Person{  
      private String name ;  
      private int age ;   
      public Person(){ 
             System.out.println("新对象实例化") ;
      }
      public Person(String name){
             this() ;
             this.name = name ;
      }
      public Person(String name,int age){ 
             this(name) ;// 调用有一个参数的构造方法
               this.age = age ;
      }
      public String getInfo(){ 
             return "姓名:" + name + ",年龄:" + age ;
      }
};
public class ThisDemo{
      public static void main(String args[]){
             Person per1 = new Person("张三",33) ; 
             System.out.println(per1.getInfo()) ; 
      }
};

 

在使用this关键字调用其他构造方法的时候,有一下几点限制

(1)this()调用构造方法的语句只能放在构造方法的首行。

(2)在使用ths调用本类中其他构造的时候,至少有一个构造方法是不使用this调用的。

 

3.使用this表示当前对象

当前对象:当前正在调用方法的对象。例题见以下程序

class Person{  
      public String getInfo(){ 
            System.out.println("Person类 --> " + this) ; // 直接打印this
            return null ; // 为了保证语法正确,返回null
      }
};
public class ThisDemo{
      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@1fb8ee3
Person类 --> Person@1fb8ee3
MAIN方法 --> Person@61de33
Person类 --> Person@61de33

前两个一样,后两个一样。

 

进行对象的比较

方法一:未使用this表示当前对象

class Person{  
      private String name ; 
      private int age ;  
      public Person(String name,int age){
            this.setName(name) ;
            this.setAge(age) ;
      }
      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 ThisDemo{
      public static void main(String args[]){
             Person per1 = new Person("张三",30) ; 
             Person per2 = new Person("张三",30) ;
             // 直接在主方法中依次取得各个属性进行比较
               if(per1.getName().equals(per2.getName())&&per1.getAge()==per2.getAge()){
                     System.out.println("两个对象相等!") ;
             }else{
                     System.out.println("两个对象不相等!") ;
             }
      }
};

 

方法二:this表示当前对象

由自己进行比较

class 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 ThisDemo{
 	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("两个对象不相等!") ;
  	      }
 	}
};

 地址相等,则两个对象相等,如果地址不相等,则依次判断每一个属性的内容来判断其是否相等。

 

 

总结:

(1)this.属性、this.方法(),实际上都表示当前的对象中的属性或当前对象调用的方法。

(2)this的核心:表示当前对象,当前正在操作本方法的对象称为当前对象。

(3)使用this可以调用其他构造方法,但是此语句必须放在构造方法的首行。

posted @ 2012-04-07 15:18  fjlsl  阅读(1152)  评论(2编辑  收藏  举报