Java基础------this关键字

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的使用在 节省代码、区分局部变量与成员变量、对象的比较等方面起着重要的作用。

猜你喜欢

转载自blog.csdn.net/zxzzxzzxz123/article/details/78392122
今日推荐