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.."); } }