Java中"this"的含义是什么?

gui*_*mos 127 java

通常,我this只在构造函数中使用.

我知道它用于识别参数变量(通过使用this.something),如果它与全局变量具有相同的名称.

但是,我不知道thisJava 的真正含义是什么,如果我this不使用dot(.)会发生什么.

Joa*_*uer 150

this 指当前的对象.

每个非静态方法都在对象的上下文中运行.所以如果你有这样一个类:

public class MyThisTest {
  private int a;

  public MyThisTest() {
    this(42); // calls the other constructor
  }

  public MyThisTest(int a) {
    this.a = a; // assigns the value of the parameter a to the field of the same name
  }

  public void frobnicate() {
    int a = 1;

    System.out.println(a); // refers to the local variable a
    System.out.println(this.a); // refers to the field a
    System.out.println(this); // refers to this entire object
  }

  public String toString() {
    return "MyThisTest a=" + a; // refers to the field a
  }
}
Run Code Online (Sandbox Code Playgroud)

然后调用frobnicate()new MyThisTest()会打印

1
42
MyThisTest a=42

因此,您可以有效地将它用于多种事物:

  • 澄清你正在谈论一个领域,当还有一个与领域同名的东西时
  • 从整体上看当前对象
  • 在构造函数中调用当前类的其他构造函数

  • @dbconfession:这里的代码并不是一个独立的自运行程序.你打算*读**代码***和**文本,而不是运行它!它是有效的代码,但它仅用于演示目的(这就是它没有正确的主要原因).有关main方法的帮助,请参阅http://stackoverflow.com/questions/146576/why-is-the-java-main-method-static. (7认同)

Mic*_*Sim 51

以下是此处的复制和粘贴,但很好地解释了this关键字的所有不同用法:

定义:Java的this关键字用于引用使用它的方法的当前实例.

以下是使用此方法:

  1. 具体表示使用实例变量而不是静态或局部变量.那是,

    private String javaFAQ;
    void methodName(String javaFAQ) {
        this.javaFAQ = javaFAQ;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这里指的是实例变量.这里局部变量的优先级高.因此缺少this表示局部变量.如果作为参数名称的局部变量与实例变量不同,则无论this是否使用它都表示实例变量.

  2. This 用于引用构造函数

     public JavaQuestions(String javapapers) {
         this(javapapers, true);
     }
    
    Run Code Online (Sandbox Code Playgroud)

    这将调用具有两个参数的同一java类的构造函数.

  3. This 用于将当前java实例作为参数传递

    obj.itIsMe(this);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 与上面类似,这也可以用于返回当前实例

    CurrentClassName startMethod() {
         return this;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    注意:在上述两点的内部类中使用时,这可能会导致不希望的结果.因为这将引用内部类而不是外部实例.

  5. This 可用于获取当前类的句柄

    Class className = this.getClass(); // this methodology is preferable in java
    
    Run Code Online (Sandbox Code Playgroud)

    虽然这可以通过

    Class className = ABC.class; // here ABC refers to the class name and you need to know that!
    
    Run Code Online (Sandbox Code Playgroud)

与往常一样,this它与其实例相关联,这在静态方法中不起作用.


irr*_*ble 42

要完成,this也可以用来引用外部对象

class Outer {
    class Inner {
        void foo() {
            Outer o = Outer.this;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • `this`就是我想要的!;) (4认同)
  • 那只是“超级” (3认同)

Jon*_*man 16

它指的是特定对象的当前实例,因此您可以编写类似的东西

public Object getMe() {
    return this;
}
Run Code Online (Sandbox Code Playgroud)

一个常见的用例this是防止阴影.请看以下示例:

public class Person {
    private final String name;

    public Person(String name) {
        // how would we initialize the field using parameter?
        // we can't do: name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我们希望使用参数的值分配字段成员.由于它们具有相同的名称,因此我们需要一种方法来区分字段和参数.this允许我们访问此实例的成员,包括该字段.

public class Person {
    private final String name;

    public Person(String name) {
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 调用它时要小心使用正确的样式:o.getMe().getMe().outOfHere() (4认同)

Qwe*_*rky 8

在Swing中,编写一个实现ActionListener并将当前实例(即'this')添加为组件的ActionListener 的类是相当常见的.

public class MyDialog extends JDialog implements ActionListener
{
    public MyDialog()
    {
        JButton myButton = new JButton("Hello");
        myButton.addActionListener(this);
    }

    public void actionPerformed(ActionEvent evt)
    {
        System.out.println("Hurdy Gurdy!");
    }

}
Run Code Online (Sandbox Code Playgroud)


aio*_*obe 7

如果你打电话,myObject.method()那么this将参考myObject里面method.


Bar*_*lom 6

它指的是调用该方法的实例

class A {

  public boolean is(Object o) {
    return o == this;
  }

}

A someA = new A();
A anotherA = new A();
someA.is(someA); // returns true
someA.is(anotherA); // returns false
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

它实际上是“对当前上下文中对象的引用”。例如,要打印出“此对象”,您可以编写:

System.out.println(this);
Run Code Online (Sandbox Code Playgroud)

请注意,您对“全局变量”的使用有些不正确……如果您使用的this.variableName话,根据定义,它不是全局变量,而是特定于此特定实例的变量。