繁体   English   中英

“ this”对象与非静态对象

[英]“this” objects vs non-static objects

考虑一下:

public class Test {

    public static int numberOfInstances = 0;
    public int myInstanceID;
    public String myInstanceName;

静态变量不需要在实例中调用,它在任何地方都可以使用,如下所示:

Test.numberOfInstances

创建实例时,我只在构造函数中执行此操作:

public Test(int id, String name) {
    myInstanceID = id;
    myInstanceName = name;
    numberOfInstances += 1;
}

我最近发现了this关键字,并注意到了它的一些用法:

public Test() {
    this(numberOfInstances + 1, "newInstance");
    numberOfInstances += 1;
}

据我所知, this关键字允许您调用该类的另一个构造函数。 它还允许您执行以下操作:

public Test(int x, int y) {
    this.x = x;
    this.y = y;
}

对于Java,我非常不同意这种风格。 相同的变量名,我看不到使用this ,特别是在查看docs示例之后。 我看这个:

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

但是,没有必要使用this关键字。 在我的代码中,我的类中有一个变量(例如xCoordinate ),其中没有使用this关键字(它不是静态的)。

我一直在努力理解的是,非静态变量与this变量之间的区别是什么。 有区别吗? 在我的一门课(乒乓球拍)中,我有以下内容:

public class Pong {
    public int xCoordinate;
    public int yCoordinate;

依此类推...我从来没有在任何地方使用this关键字,并且数据存储在它自己的实例中。

最重要的是,我的问题是非静态变量和this.变量有什么区别this. 变量。 这是标准的编码惯例吗? 为什么我会在非静态变量上使用this关键字?

如果通常,构造函数的参数变量名(例如x )与类的字段相同,则字段名将被传递的参数遮盖。

this是在这种情况下用来消除: this.x表示字段x 这是很合理的。 this意味着“引用当前实例”。

因此,这样的语句this.x = x; 很常见。

如果仍然不喜欢Java样式,并且对类字段采用m_x样式表示法,则可以编写m_x = x; 在您的构造函数中。 当你正确地指出, this是再不是必需的。

this也被用作符号委派构造函数,正如你指出。

关键字“ this”使您可以区分方法变量和实例变量:

public class Point {
    private int x;
    private int y;  

    public void add(int x, int y) {
        this.x += x;
        this.y += y;
    }
}

我想您可能几乎回答了您自己的问题。 您提供的功能

public Test(int x, int y) {
    this.x = x;
    this.y = y;
}

但是,如果您以这种方式编写它,会发生什么呢?

public Test(int x, int y) {
    x = x;
    y = y;
}

注意,我在第二个函数中删除了this 因此, xy只会引用局部xy变量。 this使您可以指定实际上要使用非静态类变量xy

没有this变量。 它只是用来告诉编译器要更改的变量是声明的字段,而不是局部变量(如果它们具有相同的名称)。

对于构造函数部分,这只是具有多个构造函数的类的快捷方式。 您只需编写一次代码,然后从备用构造函数中调用即可。

还有一个类似的关键字super ,它允许您调用超类的方法和构造函数:

public SomeClass(int x) {
    super(x);
    super.someMethod(); // even if we would have overridden someMethod(),
                        // this will call the one from the superclass
}

这是一个需要'this'关键字的实例:

public class Pong {
    public int xCoordinate;
    public int yCoordinate;

    public Pong (int xCoordinate, int yCoordinate) {
        this.xCoordinate = xCoordinate;
        this.yCoordinate = yCoordinate;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM