"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
关键字允许您调用另一个 class' 构造函数。它还允许您执行此操作:
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
关键字的使用不是必需的;在我的代码中,我的 class(例如 xCoordinate
)中有一个变量,我不使用 this
关键字(它不是静态的)。
我一直在努力理解的是非静态变量和 this
变量之间的区别。有区别吗?在我的 classes 之一(乒乓球拍)中,我有这个:
public class Pong {
public int xCoordinate;
public int yCoordinate;
等等...
我从不在任何地方使用 this
关键字,数据存储在它自己的实例中。
最重要的是,我的问题是非静态变量和 this.
变量之间的区别是什么。这是标准的编码实践吗?为什么我会在非静态变量上使用 this
关键字?
这是您需要 'this' 关键字的一个实例:
public class Pong {
public int xCoordinate;
public int yCoordinate;
public Pong (int xCoordinate, int yCoordinate) {
this.xCoordinate = xCoordinate;
this.yCoordinate = yCoordinate;
}
}
如果像典型的那样,构造函数的参数变量名称(例如 x
)与 class 的字段相同,则字段名称会被传递的参数遮蔽。
this
在这种情况下用于消除歧义:this.x
表示字段x
。这是完全有道理的。 this
表示 "reference to the current instance".
所以,像 this.x = x;
这样的语句很常见。
如果您仍然不喜欢 Java 样式,并且对 class 字段采用 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
允许您指定您实际想要使用非静态 class 变量 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
}
考虑一下:
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
关键字允许您调用另一个 class' 构造函数。它还允许您执行此操作:
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
关键字的使用不是必需的;在我的代码中,我的 class(例如 xCoordinate
)中有一个变量,我不使用 this
关键字(它不是静态的)。
我一直在努力理解的是非静态变量和 this
变量之间的区别。有区别吗?在我的 classes 之一(乒乓球拍)中,我有这个:
public class Pong {
public int xCoordinate;
public int yCoordinate;
等等...
我从不在任何地方使用 this
关键字,数据存储在它自己的实例中。
最重要的是,我的问题是非静态变量和 this.
变量之间的区别是什么。这是标准的编码实践吗?为什么我会在非静态变量上使用 this
关键字?
这是您需要 'this' 关键字的一个实例:
public class Pong {
public int xCoordinate;
public int yCoordinate;
public Pong (int xCoordinate, int yCoordinate) {
this.xCoordinate = xCoordinate;
this.yCoordinate = yCoordinate;
}
}
如果像典型的那样,构造函数的参数变量名称(例如 x
)与 class 的字段相同,则字段名称会被传递的参数遮蔽。
this
在这种情况下用于消除歧义:this.x
表示字段x
。这是完全有道理的。 this
表示 "reference to the current instance".
所以,像 this.x = x;
这样的语句很常见。
如果您仍然不喜欢 Java 样式,并且对 class 字段采用 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
允许您指定您实际想要使用非静态 class 变量 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
}