this关键字
在java中,当创建一个对象后,Java虚拟机就会为其分配一个指向对象本身的指针,而这个指针就是“this”。
为什么要使用this关键字?
此时如果有这样一种场景:
有两个相同类型的对象,分别叫做a和b,同时调同一个方法f()方法:
class Banana { void f(int i) { /* ... */ }; }
Banana a = new Banana () , b=new Banana();
a.f(1);
b.f(2);
那么对于f()这个方法来说,它是如何知道自己到底是被a调用还是b调用呢?
其实编译器在幕后为我们做了一些事(第一个自变量传递给f(),而且那个自变量是准备操作的那个对象的句柄):
Banana.f(a,1);
Banana.f(b,2);
这就是编译器内部的表达形式,把要操作的那个对象的句柄传了进去。通过把操作对象的句柄传进去,告诉编译器到底是那个对象调用f()方法。
但是这个对象的句柄就像上述说的,是由编译器在幕后为我们执行的,所以没有“标识符”可用。所以,针对这一现象,java有一个专门的关键字,“this”。
this关键字的介绍
1、this关键字只能在方法内部使用,可为已调用了其方法的那个对象生成相应的句柄(引用)。可像对待其他任何对象句柄一样对待这个句柄。
2、假若准备从自己某个类的另一个方法内部调用一个类方法(同样是在自己的某个类中)或者叫成员方法时,就不必使用this。只需直接调用那个方法即可。当前的this句柄会自动应用于其他方法。
this关键字的用法
1、使用this调用本类中的成员变量(属性)或本类中的成员方法(也可以不加,默认会自动加上)
调用成员变量:
class Student
{
private String name; //定义一个成员变量name
public void setName(String name) {//设置姓名,定义一个形参name
name=name; //将局部变量的值传递给成员变量
}
public String getName( ) {
//获得姓名
return "姓名:"+name;
}
}
public class ThisExample01
{
public static void main(String args[]) {
Student stu=new Student(); stu.setName("李明");
System.out.println(stu.getName());
}
}
运行结果: null
从运行结果看,通过name=name并没有正确的将内容赋给属性,因为此时的操作的name实际上是方法中的,跟类中的属性完全不沾边。
在上述这个类中,有一个成员变量name,同时在方法中有个形式参数,参数名也是name,然后在方法中将形式参数name的值传给成员变量name。
那么编译器是如何判断使用哪个变量呢?到底是将形式参数name传递给成员变量,还是将成员变量传递给形式参数name呢?
此时,就可以使用this关键字调用本类中的成员变量(属性),来指明,所以“this.属性名称”指明的属性就是成员变量。
上述代码改造:
public void setName(String name) {//设置姓名,定义一个形参name
this.name=name; //将局部变量的值传递给成员变量 }
public String getName( ) {//获得姓名 return "姓名:"+name; }}
注意点:
一般情况下,在Java语言中引用成员变量或者成员方法都是以对象名.成员变量或者对象名.成员方法的形式。不过有些程序员即使在没有相同变量的时候,也喜欢使用this.成员变量的形式来引用变量 。
这主要是从便于代码的阅读考虑。一看到这个this关键字就知道现在引用的变量是成员变量或者成员方法,而不是局部变量。这无形中就提高了代码的阅读性。
调用构造方法:
在一个类中可以存在多个构造方法,这些构造方法都采用相同的名字,只是形式参数不同(构造函数重载)。
Java语言凭用户的参数来判断调用哪一个构造方法。
当一个类中有多个构 造方法时,可以利用this关键字相互调用。但是,在使用this关键字调用其他构造方法的时候,this()调用空的构造方法只能放在构造方法的首行,为的是能够为类中的属性初始化;而且至少有一个构造方法是不用this调用,否则程序会出现错误。使用this调用构造方法只适用于构造方法的调用,类中的其他方法不能使用这种方法。
class Student
{
private String name ;
private int age ;
public Student () {
this("李明",20) ;//调用有两个参数的构造方法
System.out.println("新对象实例化") ;
}
public Student (String name) {
this() ;
}
public Student (String name,int age) {
this(name) ;
this.age = age ;
}
public String getInfo(){
return "姓名:" + name + ",年龄:" + age ;
}
}
public class ThisExample05
{
public static void main(String args[]) {
Student stu1 = new Student ("李小明",19) ;
System.out.println(stu1.getInfo()) ;
}
}
这时候构造方法就出现了递归调用,程序出错。
引用当前对象:
this最重要的特定就是表示当前对象,那什么叫当前对象呢?
在Java中当前对象就是指当前正在调用类中方法的对象。
使用this引用当前对象是指如果在类的方法中需要返回一个对象,并且该对象是 方法所在的类的当前对象,可以使用this关键字作为方法的返回值。
public class Car
{
public Car getCarObject(){
return this; //返回当前对象
}
public static void main(String[] args) {
Car sc = new Car ();//创建一个Car对象
System.out.println( sc.getCarObject() instanceof Car);
}}
其他用法(对象的比较,可以使用this和引用传递进行两个对象是否相等的判断)
判断两个对象是否相等:
class Student
{
private String name ;
private int age ;
public Student (String name,int age) {
this.setName(name) ;this.setAge(age) ;
}
public boolean compare(Student stu) {
//调用此方法时里面存在两个对象:当前对象、传入的对象
Student s1 = this ;//当前的对象,就表示stu1
Student s2 = stu ;//传递进来的对象,就表示stu2
if(s1==s2){// 判断是不是同一个对象,用地址比较
return true ;
} //之后分别判断每一个属性是否相等
if(equals()&&s1.age==s2.age){
return true ; //两个对象相等
}else{
return false ; //两个对象不相等
}
}
public void setName(String name){ //设置姓名 ; }
public void setAge (int age){
//设置年龄 this.age = age ;
}
public String getName(){ return; }
public int getAge(){ return this.age ; }
}
public class ThisExample07
{ public static void main(String args[]) {
Student stu1 = new Student ("李明",20) ; //声明两个对象,内容完全相等
Student stu2 = new Student ("李明",20) ; //声明两个对象,内容完全相等
// 直接在主方法中依次取得各个属性进行比较
if(stu1.compare(stu2)){
System.out.println("两个对象相等!") ;
}else{ System.out.println("两个对象不相等!") ;
} }}
地址相等,则两个对象相等;如果地址不相等,则依次判断每一个属性的内容来判断其是否相等。
总结:
Java中的this与面向对象的程序设计密切相关,它表示当前对象。
this.成员变量、this.成员方法(参数列表):实际上都表示当前对象中的属性或当前对象调用的方法;this的核心表示当前对象,当前正在操作本方法的对象称为当前对象;使用this可以调用其他构造方法,但是此语句必须放在构造方法的首行
this的使用在 节省代码、区分局部变量与成员变量、对象的比较等方面起着重要的作用。