2010-09-16 129 views
96

通常情况下,我只在构造函数使用this什么是“本”在Java中的含义是什么?

我明白,这是用来标识参数变量(通过使用this.something),如果它有一个全局变量相同的名称。

但是,我不知道this在Java中的真正意义,以及如果我使用this没有点(.)会发生什么。

+6

给回复者:http://meta.stackexchange.com/questions/15775/do-you-delete-your-own-answer-when-its-a-duplicate – BalusC 2010-09-16 15:19:35

+1

Yakshemash! SO朋友。你可能想在这里引用我的问题 - https://stackoverflow.com/questions/23334336/this-in-java-exception-in-thread-main-java-lang-stackoverflowerror Chenqui。 – 2014-04-28 17:16:34

回答

12

它是指特定对象的当前实例,所以你可以编写类似

public Object getMe() { 
    return this; 
} 
+4

调用它时要小心使用正确的样式:o.getMe()。getMe().outOfHere() – 2010-09-16 15:31:09

3

这是“一个在当前上下文对象引用”有效。例如,要打印出“这个对象”你可能会这样写:

System.out.println(this); 

请注意,您的“全局变量”的使用是有点过......如果你使用this.variableName然后通过定义它一全局变量 - 它是特定于此特定实例的变量。

2

这可以某些方法或构造内使用。

它返回参照当前对象。

4

它指的是在其上调用方法

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 
133

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 
    } 
} 

然后调用frobnicate()new MyThisTest()将因此有效地打印

 
1 
42 
MyThisTest a=42 

您使用它的许多内容:

  • 澄清,和你谈话有关字段,当有其他人也具有相同名称的东西作为一个字段
  • 指当前OBJ ECT整体
  • 调用当前类的其他构造在构造函数
+0

这不起作用。我得到一个错误,说需要一个'main'方法。如果我添加主要方法,那么我必须从那里调用。任何试图在main中调用frobnicate()的方法都表示你不能从静态引用中调用非静态引用。并且从'main'中移除静态函数会再次返回错误,表示没有找到主要方法。请解释。 – dbconfession 2014-09-11 21:34:26

+4

@dbconfession:这里的代码不是作为一个独立的自运行程序。你的意思是*阅读*代码* **和**文本,而不是运行它!它是有效的代码,但它仅用于演示目的(这就是为什么它没有合适的主体)。有关主要方法的帮助,请参阅http://stackoverflow.com/questions/146576/why-is-the-java-main-method-static。 – 2014-09-12 12:40:55

+0

@Joachim谢谢!我错过了一些基本的东西,它意味着让一个方法变成静态的,以及'this.'如何工作。我的理解是,'this.'允许你调用一个方法或变量,这个方法或变量对于类的实例化版本是唯一的,允许另一个方法或变量版本存在,而不会调用'this.'。在一个简单的调用'Test.class'我有两个方法:'公共静态无效的主要()'和'公共测试()'我不能在方法之间传递信息,因为'main'是静态的,并且构造函数不能静态。我应该发布一个新问题吗? – dbconfession 2014-09-12 20:32:23

7

在挥杆的相当普遍编写实现ActionListener一类,并添加当前实例(即“本”),作为一个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!"); 
    } 

} 
47

以下是here副本&粘贴,但解释this关键字的非常好所有不同的用途:

定义:Java的this关键字用于在参考该方法的当前实例它被使用。

以下是使用这种方式:

  1. 要明确表示实例变量是用来代替静态或局部变量。也就是,

    private String javaFAQ; 
    void methodName(String javaFAQ) { 
        this.javaFAQ = javaFAQ; 
    } 
    

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

  2. This用于指构造函数

    public JavaQuestions(String javapapers) { 
        this(javapapers, true); 
    } 
    

    这调用它有两个参数相同的Java类的构造函数。

  3. This用于当前的Java实例传递的参数

    obj.itIsMe(this); 
    
  4. 类似上述这也可以用来返回当前实例

    CurrentClassName startMethod() { 
        return this; 
    } 
    

    注:这可能会导致在以上两点中用于内部课堂时会导致不良结果。因为这将引用内部类而不是外部实例。

  5. This可以用来获得当前类

    Class className = this.getClass(); // this methodology is preferable in java 
    

    的手柄虽然这可以通过

    Class className = ABC.class; // here ABC refers to the class name and you need to know that! 
    

一如往常进行,this与它的实例相关联,这在静态方法中不起作用。

+2

我希望我能够upvote 10次,尤其是第一和第五点。我一直努力了解'这个'的意义,直到我找到这个为止。精致! – 2014-01-13 13:01:41

6

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

35

是完整的,this也可用于指外对象

class Outer { 
    class Inner { 
     void foo() { 
      Outer o = Outer.this; 
    } 
    } 
} 
+0

这是我正在寻找的! ;) – forresthopkinsa 2017-06-27 18:32:29

3

对象有方法和属性被从类派生的(变量),以指定哪些方法和变量属于使用了一个特定的对象this保留字。在实例变量的情况下,理解隐式参数和显式参数之间的差异非常重要。看看fillTank呼叫audi对象。

Car audi= new Car(); 

audi.fillTank(5); // 5 is the explicit parameter and the car object is the implicit parameter 

在括号中的值是隐式的参数和对象本身是明确的参数,不具有明确的参数,使用隐式参数的方法,该方法fillTank同时具有显式和隐式参数。

让我们在fillTank方法在Car

public class Car() 
{ 
    private double tank; 

    public Car() 
    { 
     tank = 0; 
    } 

    public void fillTank(double gallons) 
    { 
     tank = tank + gallons; 
    } 

} 

仔细一看这节课,我们有一个实例变量“坦克”。可能有很多对象使用了tank实例变量,为了指定实例变量“tank”用于特定对象,在我们的例子中,我们使用了前面构建的“audi”对象,我们使用this保留关键字。对于实例变量方法中使用“this”指示实例变量(在本例中为“tank”)是隐式参数的实例变量。

java编译器会自动添加this保留字,所以您不必添加它,这是一个偏好问题。你不能使用没有点(。)的this,因为这些是java的规则(语法)。

综上所述。

  • 对象由类定义并具有方法和变量
  • 方法实例变量采用this表明,实例变量属于隐式参数,或者说,它是隐式参数的实例变量。
  • 隐式参数是在这种情况下调用方法的对象“audi”。
  • Java编译器自动将这个保留字,将其添加是偏好的问题
  • this不能没有点(。)这是句法无效
  • this还可以使用的局部变量来区分使用和具有相同名称的全局变量
  • this保留字也适用于方法,用于指示方法属于特定对象。
2

关键字被用于指一个块的当前可变的,例如考虑下面的代码(只是一exampple,所以不要指望标准Java代码):

Public class test{ 

test(int a) { 
this.a=a; 
} 

Void print(){ 
System.out.println(a); 
} 

    Public static void main(String args[]){ 
    test s=new test(2); 
    s.print(); 
} 
} 

那它。输出将是“2”。 如果我们没有使用这个关键字,那么输出将是:0

0

我也在寻找相同的答案,并以某种方式无法理解清楚的概念。但最后我明白了这一点link

这是Java中的一个关键字。它可以用在类的方法或构造函数中。它(this)用作对其方法或构造函数被调用的当前对象的引用。这个关键字可以用来从实例方法或构造函数中引用当前对象的任何成员。

检查在link的例子为一个清醒的认识

1

如果作为在构造函数中声明的变量,然后我们用实例变量相同的“本”来分配数据。

class Example{ 
    int assign;// instance variable 

    Example(int assign){ // variable inside constructor 
      this.assign=assign; 
    } 
} 

希望这有助于。

0

在Java中,“this”是一个预定义的变量。如果我们在方法中使用“this”,这意味着我们正在获取当前运行对象的引用(地址)。举一个例子。

this.age --->当前运行对象的年龄。