📜  Java this关键字

📅  最后修改于: 2020-09-25 00:47:22             🧑  作者: Mango

Java中的this关键字

javathis关键字可以有很多用法。在Java中,这是引用当前对象的参考变量。

java this关键字的用法

这里给出了javathis关键字的6种用法。

  • 用来引用当前的类实例变量。
  • 用来调用当前的类方法(隐式)
  • this()可用于调用当前类的构造函数。
  • 作为函数调用中的参数传递。
  • 在构造函数调用中作为参数传递。
  • 用来从函数中返回当前的类实例。

建议:如果您是Java的初学者,请仅查询此关键字的三种用法。

1)this:引用当前类的实例变量

this关键字可用于引用当前的类实例变量。如果实例变量和参数之间存在歧义,则此关键字解决了歧义问题。

不使用this关键字的问题

"class Student{  
int rollno;  
String name;  
float fee;  
Student(int rollno,String name,float fee){  
rollno=rollno;  
name=name;  
fee=fee;  
}  
void display(){System.out.println(rollno+" "+name+" "+fee);}  
}  
class TestThis1{  
public static void main(String args[]){  
Student s1=new Student(111,"ankit",5000f);  
Student s2=new Student(112,"sumit",6000f);  
s1.display();  
s2.display();  
}}  

输出:

0 null 0.0
0 null 0.0

在上面的示例中,参数(形式参数)和实例变量相同。因此,我们使用此关键字来区分局部变量和实例变量。

用this关键字解决以上问题

"class Student{  
int rollno;  
String name;  
float fee;  
Student(int rollno,String name,float fee){  
this.rollno=rollno;  
this.name=name;  
this.fee=fee;  
}  
void display(){System.out.println(rollno+" "+name+" "+fee);}  
}  
  class TestThis2{  
public static void main(String args[]){  
Student s1=new Student(111,"ankit",5000f);  
Student s2=new Student(112,"sumit",6000f);  
s1.display();  
s2.display();  
}}  

输出:

111 ankit 5000
112 sumit 6000

如果局部变量(形式参数)和实例变量不同,则无需像下面的程序中那样使用此关键字:

不需要this关键字的程序

"class Student{  
int rollno;  
String name;  
float fee;  
Student(int r,String n,float f){  
rollno=r;  
name=n;  
fee=f;  
}  
void display(){System.out.println(rollno+" "+name+" "+fee);}  
}  
  class TestThis3{  
public static void main(String args[]){  
Student s1=new Student(111,"ankit",5000f);  
Student s2=new Student(112,"sumit",6000f);  
s1.display();  
s2.display();  
}}  

输出:

111 ankit 5000
112 sumit 6000

对变量使用有意义的名称是一种更好的方法。因此,我们对实例变量和参数实时使用相同的名称,并始终使用此关键字。

2)this调用当前类方法

您可以使用this关键字调用当前类的方法。如果不使用this关键字,则编译器会在调用该方法时自动添加此关键字。让我们看一个例子

"class A{  
void m(){System.out.println("hello m");}  
void n(){  
System.out.println("hello n");  
//m();//same as this.m()  
this.m();  
}  
}  
class TestThis4{  
public static void main(String args[]){  
A a=new A();  
a.n();  
}}  

输出:

hello n
hello m

3)this():调用当前类的构造函数

this()构造函数调用可用于调用当前类的构造函数。它用于重用构造函数。换句话说,它用于构造函数链接。

从参数化构造函数中调用默认构造函数:

"class A{  
A(){System.out.println("hello a");}  
A(int x){  
this();  
System.out.println(x);  
}  
}  
class TestThis5{  
public static void main(String args[]){  
A a=new A(10);  
}}  

输出:

hello a
10

从默认构造函数调用参数化的构造函数:

"class A{  
A(){  
this(5);  
System.out.println("hello a");  
}  
A(int x){  
System.out.println(x);  
}  
}  
class TestThis6{  
public static void main(String args[]){  
A a=new A();  
}}  

输出:

5
hello a

this()构造函数调用的实际用法

应该使用this()构造函数调用来重用构造函数中的构造函数。它维护构造函数之间的链,即用于构造函数链接。让我们看下面给出的示例,该示例显示此关键字的实际用法。

"class Student{  
int rollno;  
String name,course;  
float fee;  
Student(int rollno,String name,String course){  
this.rollno=rollno;  
this.name=name;  
this.course=course;  
}  
Student(int rollno,String name,String course,float fee){  
this(rollno,name,course);//reusing constructor  
this.fee=fee;  
}  
void display(){System.out.println(rollno+" "+name+" "+course+" "+fee);}  
}  
class TestThis7{  
public static void main(String args[]){  
Student s1=new Student(111,"ankit","java");  
Student s2=new Student(112,"sumit","java",6000f);  
s1.display();  
s2.display();  
}}  

输出:

111 ankit java null
112 sumit java 6000

规则:调用this()必须是构造函数中的第一条语句。

"class Student{  
int rollno;  
String name,course;  
float fee;  
Student(int rollno,String name,String course){  
this.rollno=rollno;  
this.name=name;  
this.course=course;  
}  
Student(int rollno,String name,String course,float fee){  
this.fee=fee;  
this(rollno,name,course);//C.T.Error  
}  
void display(){System.out.println(rollno+" "+name+" "+course+" "+fee);}  
}  
class TestThis8{  
public static void main(String args[]){  
Student s1=new Student(111,"ankit","java");  
Student s2=new Student(112,"sumit","java",6000f);  
s1.display();  
s2.display();  
}}  
Compile Time Error: Call to this must be first statement in constructor

4)this:在方法中作为参数传递

this关键字也可以在方法中作为参数传递。它主要用于事件处理。让我们来看一个例子:

"class S2{  
  void m(S2 obj){  
  System.out.println("method is invoked");  
  }  
  void p(){  
  m(this);  
  }  
  public static void main(String args[]){  
  S2 s1 = new S2();  
  s1.p();  
  }  
}  

输出:

method is invoked

可以作为参数传递的应用程序:

在(或)事件处理中,我们必须提供一个类对另一个类的引用。它用于在许多方法中重用一个对象。

5):在构造函数调用中作为参数传递

我们也可以在构造函数中传递this关键字。如果我们必须在多个类中使用一个对象,这将很有用。让我们来看一个例子:

"class B{  
  A4 obj;  
  B(A4 obj){  
    this.obj=obj;  
  }  
  void display(){  
    System.out.println(obj.data);//using data member of A4 class  
  }  
}  
  class A4{  
  int data=10;  
  A4(){  
   B b=new B(this);  
   b.display();  
  }  
  public static void main(String args[]){  
   A4 a=new A4();  
  }  
}  
Output:10

6)此关键字可用于返回当前的类实例

我们可以将此关键字作为方法的语句返回。在这种情况下,方法的返回类型必须为类类型(非原始)。让我们来看一个例子:

可以作为语句返回的语法

"return_type method_name(){  
return this;  
}  

作为方法中的语句返回的此关键字的示例

"class A{  
A getA(){  
return this;  
}  
void msg(){System.out.println("Hello java");}  
}  
class Test1{  
public static void main(String args[]){  
new A().getA().msg();  
}  
}  

输出:

Hello java

证明此关键字

让我们证明这个关键字指的是当前类实例变量。在这个程序中,我们打印的是引用变量,这两个变量的输出是相同的。

"class A5{  
void m(){  
System.out.println(this);//prints same reference ID  
}  
public static void main(String args[]){  
A5 obj=new A5();  
System.out.println(obj);//prints the reference ID  
obj.m();  
}  
}  

输出:

A5@22b3ea59
A5@22b3ea59