Java中的this关键字

时间:2020-01-09 10:34:51  来源:igfitidea点击:

Java中的this关键字是对当前对象的引用。更清楚地说,当我们使用类的对象调用任何方法(或者创建对象时的构造函数)时,则此关键字是对用于调用该方法的对象的引用。

例如

public class MainClass implements MyInterface{	
  public static void main(String[] args) {
    MainClass obj = new MainClass();
    MainClass obj1 =  obj.showMessage("Hello");
    if(obj == obj1) {
      System.out.println("Both objects have the same reference");
    }
  }

  public MainClass showMessage(String msg) {		
    System.out.println("" + msg);
    return this;
  }
}

输出:

Hello
Both objects have the same reference

在使用类对象的示例中,调用了一个方法,并从该方法中返回" this"。由于" this"是对当前对象的引用,因此为什么在比较对象时引用的对象是相等的。

如何在Java中使用this关键字

Java中的this关键字可以在许多情况下使用。

  • 解决实例和局部变量之间的名称空间冲突。参见示例。
  • 在构造函数重载的情况下从另一个构造函数调用。参见示例。
  • 调用任何方法。参见示例。
  • 当必须传递对象时作为参数传递。参见示例。

使用它来访问实例变量

通常,对于构造函数,通常的做法是在构造函数中为局部变量赋予与实例变量相同的名称。在这种情况下,局部变量隐藏实例变量,并且在该构造函数的上下文中,局部变量优先于实例变量。由于这是对对象本身的引用,因此在这种情况下可以使用此关键字访问实例变量。

public class ConstructorDemo {
  int num;
  String name;
  // Parameterized constructor
  private ConstructorDemo(int num, String name){
    this.num = num;
    this.name = name;
  }
	
  // no-arg constructor
  private ConstructorDemo(){
    
  }

  public static void main(String[] args) {
    ConstructorDemo cd = new ConstructorDemo(10, "theitroad");
  }
}

在示例代码中可以看到,构造函数具有与实例变量同名的局部变量,并且此关键字用于解决冲突。

用它来调用重载的构造函数

在重载构造函数的情况下,可以使用此函数从另一个构造函数调用另一个构造函数,以便只有一个构造函数实际进行初始化。

public class ConstrChaining {
  int a;
  double b;
  String name;
  ConstrChaining(){
    this(0);
  }
  ConstrChaining(int a){
    this(a, 0.0);
  }
  ConstrChaining(int a, double b){
    this(a, b, null);
  }
  ConstrChaining(int a, double b, String name){
    this.a = a;
    this.b = b;
    this.name = name;
  }
  public static void main(String[] args) {
    ConstrChaining cc = new ConstrChaining();
    System.out.println("a- " + cc.a + " b- " + cc.b + " name- " + cc.name);
    
    ConstrChaining cc1 = new ConstrChaining(5, 7.8);
    System.out.println("a- " + cc1.a + " b- " + cc1.b + " name- " + cc1.name);
    
    ConstrChaining cc2 = new ConstrChaining(18, 13.45, "theitroad");
    System.out.println("a- " + cc2.a + " b- " + cc2.b + " name- " + cc2.name);
  }
}

在示例中,我们可以看到初始化最终是由以下构造函数完成的:

ConstrChaining(int a, double b, String name){
    this.a = a;
    this.b = b;
    this.name = name;
  }

所有其他构造函数都使用此关键字来形成一个链,以调用构造函数,最终完成初始化。

使用此关键字调用任何方法

由于这是对当前对象的引用,因此它也可以用于调用类的方法。

public class MainClass implements MyInterface{
  public static void main(String[] args) {
    MainClass obj = new MainClass();
    obj.showMessage("Hello");
  }
	
  public void showMessage(String msg) {		
    System.out.println("Message- " + msg);
    // calling method using this
    this.callThis();
  }
	
  public void callThis() {
    System.out.println("Method called using this..");
  }	
}

输出:

Message- Hello
Method called using this..

当必须传递对象时,可以将其作为参数传递

由于这是对当前对象的引用,因此我们可以将其作为需要传递对象的参数来传递。

public class MainClass implements MyInterface{
  public static void main(String[] args) {
    MainClass obj = new MainClass();
    obj.showMessage("Hello");	
  }
	
  public void showMessage(String msg) {		
    System.out.println("Message- " + msg);
    // passing this as an argument
    callThis(this);
  }
	
  public void callThis(MainClass obj) {
    System.out.println("this passed as an argument..");
  }	
}