“this”在java中是什么意思?

bbuxkriu  于 2021-06-27  发布在  Java
关注(0)|答案(17)|浏览(784)

通常,我用 this 仅在构造函数中。
我知道它是用来识别参数变量的(通过使用 this.something ),如果它与全局变量同名。
但是,我不知道这句话的真正含义是什么 this 如果我使用 this 无圆点( . ).

tf7tbtn2

tf7tbtn21#

this关键字用于引用块的当前变量,例如,请考虑以下代码(只是一个示例,因此不要期望使用标准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”。如果我们没有使用this关键字,那么输出将是:0

acruukt9

acruukt92#

为了完整, this 也可以用来指外部对象

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

monwx1rj3#

(我知道我迟到了,但嘘,我是个鬼鬼祟祟的家伙,你从没见过我)
在大多数面向对象编程语言中,this关键字(如果不是全部的话)意味着它是对该类的当前对象示例的引用。它本质上与通过名称从方法外部调用该对象是一样的。这可能毫无意义,因为我的解释太不周详了:
在类之外,为了调用对象示例中的某个对象,例如,假设您有一个名为object的对象,并且希望获得需要使用的字段

object.field

例如,您试图从类内部访问object.field,例如,您可以使用

this.field

在类内部调用this关键字时,它实际上会替换object name关键字。通常没有太多的理由在外部这样做如果你有两个同名的变量,其中一个是类的一个字段,另一个只是一个方法内部的一个变量,它有助于在这两个变量之间进行破译。例如,如果你有这个:(哈,明白了吗?这个?呵呵。。。。就我一个人?好的:(我现在就走)

public String Name;
//Constructor for {object} class
public object(String Name){
    Name = Name;
}

这将导致一些问题,编译器将无法知道在构造函数的参数中定义的name变量和类的字段声明中的name变量之间的差异,因此它将把name参数赋给。。。。name参数的值,它没有任何好处,也没有任何意义。这是大多数新程序都会遇到的常见问题,我也是其中的受害者。无论如何,定义此参数的正确方法是使用:

public String Name;
//Constructor for {object} class
public object(String Name){
    this.Name = Name;
}

这样,编译器就知道您试图分配的name变量是类的一部分,而不是方法的一部分,并正确地分配它,这意味着它将name字段分配给您在构造函数中输入的任何内容。
总而言之,它基本上引用了您正在处理的类的对象示例的一个字段,因此它是关键字“this”,意思是它的this object或this instance。在调用类的一个字段时使用这个方法是一个很好的实践,而不仅仅是使用名称来避免可能的bug,因为编译器在这些bug上运行时很难找到它们。

sbtkgmzw

sbtkgmzw4#

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

System.out.println(this);

请注意,您对“全局变量”的用法有些不正确。。。如果你用的是 this.variableName 那么根据定义,它不是一个全局变量-它是一个特定于这个特定示例的变量。

yuvru6vn

yuvru6vn5#

示例变量对于您创建的每个对象都是公共的。假设有两个示例变量

class ExpThisKeyWord{
int x;
int y;

public void setMyInstanceValues(int a, int b) {
    x= a;
    y=b;

    System.out.println("x is ="+x);
    System.out.println("y is ="+y);
}

}

class Demo{
public static void main(String[] args){

ExpThisKeyWord obj1 = new ExpThisKeyWord();
ExpThisKeyWord obj2 = new ExpThisKeyWord();
ExpThisKeyWord obj3 = new ExpThisKeyWord();

obj1.setMyInstanceValues(1, 2);
obj2.setMyInstanceValues(11, 22);
obj3.setMyInstanceValues(111, 222);

}
}

如果您注意到上面的代码,我们已经启动了三个对象,三个对象正在调用setmyinstancevalues方法。您认为jvm如何正确地为每个对象分配值?有一个诀窍,jvm不会看到上面显示的代码。相反,它将看到如下代码;

public void setMyInstanceValues(int a, int b) {
    this.x= a; //Answer: this keyword denotes the current object that is handled by JVM.
    this.y=b;

    System.out.println("x is ="+x);
    System.out.println("y is ="+y);
}
rlcwz9us

rlcwz9us6#

这可以在某些方法或构造函数中使用。
它返回对当前对象的引用。

vptzau2j

vptzau2j7#

它引用调用方法的示例

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
drkbr07n

drkbr07n8#

它引用特定对象的当前示例,因此您可以编写如下内容

public Object getMe() {
    return this;
}

一个常见的 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;
    }
}

在上面的示例中,我们希望使用参数的值指定字段成员。因为它们共享相同的名称,所以我们需要一种方法来区分字段和参数。 this 允许我们访问此示例的成员,包括字段。

public class Person {
    private final String name;

    public Person(String name) {
        this.name = name;
    }
}
v2g6jxz6

v2g6jxz69#

引用programming.guide上的一篇文章: this 在java程序中有两个用途。

1. 作为对当前对象的引用

这种情况下的语法通常类似于

this.someVariable = someVariable;

这里描述了这种用法:“this”引用(带示例)

2. 调用其他构造函数

本例中的语法通常类似于

MyClass() {
    this(DEFAULT_VALUE); // delegate to other constructor
}

MyClass(int value) {
    // ...
}

这里描述了这种用法:这个(…)构造函数调用(带示例)

1l5u6lss

1l5u6lss10#

this 是对当前对象的引用:http://download.oracle.com/javase/tutorial/java/javaoo/thiskey.html

cgyqldqp

cgyqldqp11#

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

因此,您可以有效地将其用于多种用途:
澄清你所说的是一个字段,同时还有其他与字段同名的内容
将当前对象作为一个整体引用
在构造函数中调用当前类的其他构造函数

nfeuvbwi

nfeuvbwi12#

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

}
yzxexxkh

yzxexxkh13#

这指的是你现在“在”的对象。换句话说,这是指接收对象。您可以用这个来说明您所指的是哪个变量。java\u白皮书第37页

class Point extends Object
{
    public double x;
    public double y;

    Point()
    {
        x = 0.0;
        y = 0.0;
    }

    Point(double x, double y)
    {
        this.x = x;
        this.y = y;
    }
}

在上面的代码示例中,this.x/this.y引用当前类,即点类x和y变量,其中(double x,double y)是从不同类传递的双值,用于将值赋给当前类。

sg24os4d

sg24os4d14#

下面是这里的复制粘贴,但是很好地解释了 this 关键字:
定义:java的 this 关键字用于引用使用它的方法的当前示例。
以下是使用方法:
具体表示使用示例变量代替静态或局部变量。也就是说,

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

这里它指的是示例变量。在这里,局部变量的优先级很高。因此 this 表示局部变量。如果作为参数名称的局部变量与示例变量不同,则不考虑 this 表示示例变量。 This 用于表示构造函数

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

这将调用具有两个参数的同一java类的构造函数。 This 用于将当前java示例作为参数传递

obj.itIsMe(this);

与上面类似,这也可以用于返回当前示例

CurrentClassName startMethod() {
     return this;
}

注意:这可能会导致不希望的结果,而在内部类中使用上述两点。因为这将引用内部类而不是外部示例。 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 与它的示例相关联,这在静态方法中不起作用。

cunj1qz1

cunj1qz115#

我也在寻找同样的答案,但不知怎么的,我无法清楚地理解这个概念。但我终于从这个环节明白了
这是java中的一个关键字

相关问题