this关键字主要有以下三个地方使用
在方法体中引用当前对象,即其方法被调用的对象,以便将当前对象的实例变量或当前对象作为参数传递给其他方法。
① t = this.x; 要在方法中引用当前对象,可以使用关键字 this。
② return this; 作为当前方法的返回值等。
③ z.resetData(this); 关键字 this 指向当前对象,可用于任何可使用对象引用的地方:在句点表示法中,作为方法的参数;
下面是一些使用 this 的例子,其中的注释对相应的用法做了说明。
一、t = this.x;
this
用于指代当前对象,而 .x
则是该对象的属性。因此,this.x
表示当前对象的属性 x
public class MyClass {private int x;public MyClass(int x) {this.x = x; // 设置当前对象的属性 x}public int getX() {return this.x; // 返回当前对象的属性 x}public static void main(String[] args) {MyClass obj = new MyClass(10);int t = obj.getX(); // 使用 this.x 赋值给变量 t}
}
还有在内部类中,使用this关键字引用外部类对象。
public class OuterClass {private int value;public void outerMethod() {InnerClass inner = new InnerClass();inner.innerMethod();}public class InnerClass {public void innerMethod() {OuterClass.this.value = 10; // 使用this关键字引用外部类对象的成员变量}}
}
二、return this;
return this;
表示从当前方法中返回当前对象的引用,即返回指向当前对象的指针或引用。
当一个方法的返回类型是类本身(或该类的父类或接口),而不是基本数据类型或其他对象类型时,可以使用 return this;
来返回当前对象的引用。
例如,在一个类的方法中,如果你想要返回调用该方法的对象本身,而不是其他值,你可以使用 return this;
。这在链式调用或者需要返回当前对象的场景中特别有用。
public class Leaf {public static void main(String[] args){Leaf leaf = new Leaf();leaf.increment().increment().increment().print();}int i = 0;Leaf increment(){i++;return this;}void print(){System.out.println("i = " + i);}
}
increment
方法用于递增实例变量i
的值并返回当前对象的引用,以便支持方法链的形式调用,实现了在一个语句中对同一个对象进行了多次操作。
三、Peeler.peel(this);
Apple 需要调用 Peeler.peel() 方法,它是一个外部的工具方法,为了将自身传递给外部方法,Apple必须使用 this 关键字。
/*** 这段代码实现了一个简单的场景,演示了对象间的方法调用和 toString 方法的使用。* 在 main 方法中创建了一个 Person 对象,并调用其 eat 方法,传入一个新创建的 Apple 对象。* eat 方法内部调用了传入的 Apple 对象的 getPeeled 方法,获取削皮后的苹果对象。* getPeeled 方法内部调用了 Peeler 类的 peel 静态方法,对当前苹果对象进行削皮操作,并返回结果。* 削皮操作完成后,削皮后的苹果对象被打印输出到控制台。*/public class PassingThis {public static void main(String[] args) {//在 main 方法中创建了一个 Person 对象,并调用其 eat 方法,传入一个新创建的 Apple 对象。new Person().eat(new Apple());}
}class Person {// Person 类中定义了一个 eat 方法,接受一个 Apple 对象作为参数。调用传入的 Apple 对象的 getPeeled 方法,获取削皮后的苹果对象,然后打印输出这个削皮后的苹果对象。public void eat(Apple apple) {Apple peeled = apple.getPeeled();// 直接输出 peeled 对象,会调用其 toString 方法System.out.println("这个苹果是:" + peeled);}
}class Peeler {static Apple peel(Apple apple) {// Peeler 类中定义了一个静态方法 peel,接受一个 Apple 对象作为参数,并对这个苹果对象进行削皮操作,削皮操作非常简单,只是直接返回传入的苹果对象,没有进行实际的削皮操作。return apple;}
}class Apple {Apple getPeeled() {// Apple 类中定义了一个 getPeeled 方法,它返回一个经过削皮后的苹果对象。// 在这个方法中,通过调用 Peeler 类的 peel 静态方法来实现对当前苹果对象的削皮操作,并将结果返回。return Peeler.peel(this);}@Overridepublic String toString() {// 在 Apple 类中重写了 toString 方法,使其返回一个描述削皮后苹果的字符串,这样在打印输出时就会显示你自定义的描述,而不是默认的类名和哈希码。return "削皮后的苹果";}
}
注意:
this 关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。同时,如果在方法内部调用同一个类的同一个方法,就直接调用,不用加this。
public class Example {private int value;public Example(int value) {this.value = value;}// 方法内部使用this关键字引用当前对象,并返回当前对象的值public int getValue() {return this.value;}// 方法内部调用同一个类的同一个方法,不需要加thispublic void printValue() {int val = getValue(); // 直接调用getValue方法System.out.println("Value: " + val);}public static void main(String[] args) {Example example = new Example(10);example.printValue();}
}
这个示例中,Example类有一个私有成员变量value和两个公共方法getValue和printValue。在getValue方法中,使用了this关键字来引用当前对象,并返回value的值。而在printValue方法中,直接调用了getValue方法,不需要加this关键字。在main方法中,创建了Example类的实例对象,并调用了printValue方法,输出value的值。