您好,欢迎来到九壹网。
搜索
您的当前位置:首页深入理解java中this关键字的使用

深入理解java中this关键字的使用

来源:九壹网
深⼊理解java中this关键字的使⽤

⼀,表⽰类中属性1,没有使⽤this的情况

class Person{ // 定义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 ThisDemo01{

public static void main(String args[]){

Person per1 = new Person(\"张三\调⽤构造实例化对象 System.out.println(per1.getInfo()) ; // 取得信息 }};

运⾏结果:

姓名:null,年龄:0;

可以得出结论:此时并没有正确将内容赋给属性;

假设⾝边有⼀只笔,远处也有⼀只笔,肯定会就近拿⾝边的笔。这在构造⽅法中⼀样。所以此时操作的name,age都是构造⽅法中定义的name,age.跟类中属性完全不沾边。此时,为了明确哪个是类中的属性,需要加上this.类中属性。

class Person{ // 定义Person类 private String name ; // 姓名 private int age ; // 年龄

public Person(String name,int age){ // 通过构造⽅法赋值 this.name = name ; // 为类中的name属性赋值 this.age = age ;// 为类中的age属性赋值 }

public String getInfo(){ // 取得信息的⽅法 return \"姓名:\" + name + \",年龄:\" + age ; }};

public class ThisDemo02{

public static void main(String args[]){

Person per1 = new Person(\"张三\调⽤构造实例化对象 System.out.println(per1.getInfo()) ; // 取得信息 }};

运⾏结果:

姓名:张三,年龄:33⼆,this调⽤构造⽅法

如果在类中有多个构造⽅法,也可以利⽤this关键字互相调⽤。

假设⼀个类中存在多个构造⽅法,但⽆论多少构造⽅法,都要打造⼀个“新对象实例化”,此时就有两种做法。按照最原始⽅法:

class Person{ // 定义Person类 private String name ; // 姓名 private int age ; // 年龄 public Person(){ // ⽆参构造

System.out.println(\"新对象实例化\") ; }

public Person(String name){

System.out.println(\"新对象实例化\") ; this.name = name ;

}

public Person(String name,int age){ // 通过构造⽅法赋值 System.out.println(\"新对象实例化\") ;

this.name = name ; // 为类中的name属性赋值 this.age = age ;// 为类中的age属性赋值 }

public String getInfo(){ // 取得信息的⽅法 return \"姓名:\" + name + \",年龄:\" + age ; }};

public class ThisDemo03{

public static void main(String args[]){

Person per1 = new Person(\"张三\调⽤构造实例化对象 System.out.println(per1.getInfo()) ; // 取得信息 }};

因为以上红⾊部分重复了,现在只是⼀⾏,感觉不出来,但是如果现在代码很多⾏的话,缺陷⽴刻显现出来了。此时,最好让构造⽅法间进⾏互相调⽤。使⽤:this(若⼲参数)的形式完成。

package methoud;

class Person{ // 定义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 ;// 为类中的age属性赋值 }

public String getInfo(){ // 取得信息的⽅法 return \"姓名:\" + name + \",年龄:\" + age ; }};

public class ThisDemo06{

public static void main(String args[]){

Person per1 = new Person(\"张三\调⽤构造实例化对象 System.out.println(per1.getInfo()) ; // 取得信息 }};

运⾏结果:

新对象实例化

姓名:张三,年龄:33注意点:

在使⽤this关键字调⽤其他关键字的时候,有以下:

1)this()调⽤其他构造⽅法的语句只能放在构造⽅法(在其他普通⽅法⾥是不⾏的)的⾸⾏;

2)在使⽤this调⽤其他构造⽅法的时候,⾄少有⼀个构造⽅法是不⽤this调⽤的。(必须要有结尾,不能⽆限期的调⽤下去,循环递归调⽤);如下就会出错:

package methoud;

class Person{ // 定义Person类 private String name ; // 姓名 private int age ; // 年龄 public Person(){ // ⽆参构造

System.out.println(\"新对象实例化\") ; }

public Person(String name){

this.name = name ;

this() ;// 调⽤this()⽅法只能放在构造⽅法⾸⾏ }

public Person(String name,int age){ // 通过构造⽅法赋值 this(name) ;// 调⽤有⼀个参数的构造⽅法 this.age = age ;// 为类中的age属性赋值 }

public String getInfo(){ // 取得信息的⽅法 this() ;// 其他普通⽅法不能调⽤this()⽅法 return \"姓名:\" + name + \",年龄:\" + age ; }};

public class ThisDemo04{

public static void main(String args[]){

Person per1 = new Person(\"张三\调⽤构造实例化对象 System.out.println(per1.getInfo()) ; // 取得信息 }};

三,使⽤this关键字调⽤当前对象。当前对象:当前正在调⽤⽅法的对象。如下,分别⽤两种⽅法打印对象per1和per2

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⽅法 --> methoud.Person@2a139a55Person类 --> methoud.Person@2a139a55MAIN⽅法 --> methoud.Person@15db9742Person类 --> methoud.Person@15db9742可见,⽤this调⽤的是当前对象,与直接per1,per2是⼀样的效果。四,对象的⽐较

以下这个例⼦中,⽣成两个对象,当对象中年龄和姓名完全相等的时候,则认为两个对象是相等的,此时有两个问题1)如何进⾏对象⽐较:2)在那块对象⽐较:

String本⾝是⼀个类,如果要进⾏相等⽐较,需要使⽤equls(),⽽,age是Int,直接使⽤==判断。

class Person{ // 定义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 ThisDemo07{

public static void main(String args[]){

Person per1 = new Person(\"张三\声明两个对象,内容完全相等 Person per2 = new Person(\"张三\声明两个对象,内容完全相等 // 直接在主⽅法中依次取得各个属性进⾏⽐较

if(per1.getName().equals(per2.getName())&&per1.getAge()==per2.getAge()){ System.out.println(\"两个对象相等!\") ; }else{

System.out.println(\"两个对象不相等!\") ; } }};

运⾏结果:两个对象相等!

以上代码,功能确实实现了,但是由于代码暴露在外⾯,不安全,容易出错。应该由⾃⼰进⾏⽐较最合适,所以应该在Person类中增加⼀个⽐较的⽅法。当前对象调⽤传⼈的对象,当前对象即调⽤⽅法的对象,⽤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(\"张三\声明两个对象,内容完全相等 Person per2 = new Person(\"张三\声明两个对象,内容完全相等 // 直接在主⽅法中依次取得各个属性进⾏⽐较 if(per1.compare(per2)){

System.out.println(\"两个对象相等!\") ; }else{

System.out.println(\"两个对象不相等!\") ; } }};

运⾏结果:两个对象相等!

以上就是⼩编整理的全部内容啦,希望⼤家继续⽀持~

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务