📅  最后修改于: 2020-09-25 00:47:22             🧑  作者: Mango
javathis关键字可以有很多用法。在Java中,这是引用当前对象的参考变量。
这里给出了javathis关键字的6种用法。
建议:如果您是Java的初学者,请仅查询此关键字的三种用法。
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
在上面的示例中,参数(形式参数)和实例变量相同。因此,我们使用此关键字来区分局部变量和实例变量。
"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
如果局部变量(形式参数)和实例变量不同,则无需像下面的程序中那样使用此关键字:
"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
对变量使用有意义的名称是一种更好的方法。因此,我们对实例变量和参数实时使用相同的名称,并始终使用此关键字。
您可以使用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
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()构造函数调用来重用构造函数中的构造函数。它维护构造函数之间的链,即用于构造函数链接。让我们看下面给出的示例,该示例显示此关键字的实际用法。
"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
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
在(或)事件处理中,我们必须提供一个类对另一个类的引用。它用于在许多方法中重用一个对象。
我们也可以在构造函数中传递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
我们可以将此关键字作为方法的语句返回。在这种情况下,方法的返回类型必须为类类型(非原始)。让我们来看一个例子:
"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