[英]“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
。 因此, x
和y
只会引用局部x
和y
变量。 this
使您可以指定实际上要使用非静态类变量x
和y
。
没有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.