我知道这是指一个当前对象。但是我不知道什么时候我真的需要使用它。例如,如果我用x代替这个,会有什么不同吗。X在某些方法中?可能x将是指一个变量,这是局部的考虑方法?我指的是只有在这个方法中才能看到的变量。
那么this.method()呢?我能用吗?我应该用它吗?如果我只是使用方法(),它不是,默认情况下,应用到当前对象?
我知道这是指一个当前对象。但是我不知道什么时候我真的需要使用它。例如,如果我用x代替这个,会有什么不同吗。X在某些方法中?可能x将是指一个变量,这是局部的考虑方法?我指的是只有在这个方法中才能看到的变量。
那么this.method()呢?我能用吗?我应该用它吗?如果我只是使用方法(),它不是,默认情况下,应用到当前对象?
当前回答
以下是在java中使用' this '关键字的方法:
使用此关键字引用当前类实例变量 使用this()调用当前类构造函数 使用此关键字返回当前类实例 使用此关键字作为方法参数
https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
其他回答
关于威廉·布伦德尔的帖子和坦白问题,关于案例2。这里有一个例子:
public class Window {
private Window parent;
public Window (Window parent) {
this.parent = parent;
}
public void addSubWindow() {
Window child = new Window(this);
list.add(child);
}
public void printInfo() {
if (parent == null) {
System.out.println("root");
} else {
System.out.println("child");
}
}
}
我曾在与对象建立父子关系时看到过这种用法。但是,请注意,为了简洁起见,这里进行了简化。
只有当存在同名重叠的局部变量时才需要使用它——而且大多数人只使用它。(例如,Setter方法。)
当然,使用它的另一个很好的理由是它会在ide中弹出智能感知:)
这不会影响结果代码——它是编译时操作符,有或没有它生成的代码都是一样的。当你必须使用它时,取决于上下文。例如,你必须使用它,当你有一个局部变量,它掩盖了类变量你想引用类变量而不是局部变量。
edit:“生成的代码将是相同的”,我的意思当然是,当局部作用域中的某个变量没有隐藏属于类的变量时。因此
class POJO {
protected int i;
public void modify() {
i = 9;
}
public void thisModify() {
this.i = 9;
}
}
两个方法的结果代码将是相同的。如果某个方法声明了同名的局部变量,区别就会显现出来
public void m() {
int i;
i = 9; // i refers to variable in method's scope
this.i = 9; // i refers to class variable
}
this的第二个重要用途(除了用局部变量隐藏之外,很多人已经说过了)是在从嵌套的非静态类访问外部实例时:
public class Outer {
protected int a;
public class Inner {
protected int a;
public int foo(){
return Outer.this.a;
}
public Outer getOuter(){
return Outer.this;
}
}
}
this关键字主要用于三种情况。第一种也是最常见的方法是在setter方法中消除变量引用的歧义。第二种情况是需要将当前类实例作为参数传递给另一个对象的方法。第三种方法是从构造函数内部调用备用构造函数。
案例1:使用this来消除变量引用的歧义。在Java setter方法中,我们通常传递一个与我们试图设置的私有成员变量同名的参数。然后我们将参数x赋值给this。x。这清楚地表明,您正在将参数“name”的值分配给实例变量“name”。
public class Foo
{
private String name;
public void setName(String name) {
this.name = name;
}
}
情况2:使用this作为传递给另一个对象的参数。
public class Foo
{
public String useBarMethod() {
Bar theBar = new Bar();
return theBar.barMethod(this);
}
public String getName() {
return "Foo";
}
}
public class Bar
{
public void barMethod(Foo obj) {
obj.getName();
}
}
案例3:使用this调用备用构造函数。在评论中,trinithis正确地指出了this的另一种常用用法。当一个类有多个构造函数时,可以使用this(arg0, arg1,…)来调用您选择的另一个构造函数,前提是在构造函数的第一行中这样做。
class Foo
{
public Foo() {
this("Some default value for bar");
//optional other lines
}
public Foo(String bar) {
// Do something with bar
}
}
我还见过这种情况,用来强调实例变量被引用(不需要消除歧义),但在我看来,这种情况很少见。