如果我写下面的课程:
public class Example {
int j;
int k;
public Example(int j, int k) {
j = j;
k = k;
}
public static void main(String[] args) {
Example exm = new Example(1,2);
System.out.println(exm.j);
System.out.println(exm.k);
}
}
程序编译,但是当我运行程序时,main方法将打印出两个0。我知道为了说我想在构造函数中初始化实例变量,我必须写:
this.j = j;
this.k = k;
但是如果我不写它,那么在构造函数中(在表达式的左侧和写入侧)评估(或考虑)哪个变量?是参数还是实例变量?它有所作为吗?
是否还有其他需要使用this
的情况?
答案 0 :(得分:30)
如果你没有在构造函数中写“this.variable”,并且你有一个局部变量(包括函数参数)与构造函数中的字段变量同名,那么将考虑局部变量;局部变量遮蔽了字段(也就是类变量)。
“这个”是唯一的出路:
class OuterClass {
int field;
class InnerClass {
int field;
void modifyOuterClassField()
{
this.field = 10; // Modifies the field variable of "InnerClass"
OuterClass.this.field = 20; // Modifies the field variable of "OuterClass",
// and this weird syntax is the only way.
}
}
}
答案 1 :(得分:10)
如果你在构造函数中只说j
,那么编译器会认为你的意思是两种情况下的参数。所以
j = j;
简单地将参数j
的值赋给参数j
(这是一个非常毫无意义,但仍然有效的陈述)。
因此,为了消除歧义,您可以在this.
前加上前缀,以明确表示具有相同名称的成员变量。
this
的另一个用途是当你需要将对当前对象的引用传递给某个方法时,例如:
someObject.addEventListener(this);
在此示例中,您需要将当前对象作为一个整体引用(而不仅仅是对象的成员)。
答案 2 :(得分:6)
如果你不写这个,那么你将参数分配给自己;参数变量影响实例变量。
答案 3 :(得分:5)
当你想要返回对象本身时,这很有用
return this;
这很有用,因为如果一个类有例如Method1()和Method2(),两者都返回这个,你可以编写像
这样的调用object.Method1().Method2()
同样在方法中,在调用期间将对象本身传递给另一个函数会很有用。
答案 4 :(得分:5)
另一种有用的方法(虽然很少使用)是声明方法参数final:
以下块将无法编译,从而立即提醒您错误:
public Example(final int j, final int k) {
j = j;
k = k;
}
答案 5 :(得分:3)
在构造函数代码中,您要为自己分配变量。 'j'是构造函数的参数中指定的j。即使它是上面定义的类变量j,那么你仍然说“j = j”......即j在左侧和右侧不会进行不同的评估。
public Example(int j, int k) {
this.j = j;
this.k = k;
}
答案 6 :(得分:3)
您遇到的问题称为variable shadowing。请查看different kinds of variables in Java的此概述。
一般来说:Java编译器使用它可以为赋值找到的最近变量。在一个方法中,它将首先尝试查找局部变量,然后将其搜索焦点扩大到类和实例变量。
我个人认为好的一个习惯(其他人不喜欢它)是使用m_为成员变量添加前缀,并使用不改变其值的CONSTANT_VARIABLES的大写字母。有意使用变量阴影的代码非常(!)难以调试和使用。
答案 7 :(得分:2)
在示例中将参数分配给自身。
更一般地说:如果你没有在你的变量前面添加一个范围,那么假定当前的范围 - 这是你的情况下的函数。 'this.j'告诉jre在对象范围内使用变量j - 对象的成员变量。
答案 8 :(得分:1)
就像罗伯特·格兰特所说的那样,'这个'就是你如何明确指出你是指成员变量而不是局部变量。
答案 9 :(得分:1)
要回答follow-up question about this with method,inner class mentioned by Srikanth is still a valid example of using this:(此次使用方法)
public class OuterClass
{
void f() {System.out.println("Outer f()");};
class InnerClass {
void f() {
System.out.println("Inner f()");
OuterClass.this.f();
}
}
}
您与anonymous class具有相同的情况:
您可以通过以下方式引用外部类的方法:
MyOuterClass.this.yOuterInstanceMethod()
,MyOuterClass.myOuterInstanceMethod()
,- 或只是
myOuterInstanceMethod()
,如果没有歧义 。
答案 10 :(得分:0)
这并不能完全回答您的问题,但如果您使用Eclipse,您可能会发现“分配无效”设置很有用。我相信这也将在其他IDE中。
答案 11 :(得分:0)
您可能需要查看What is the advantage of having this/self
pointer mandatory explicit?
虽然在Java中使用this
并不是强制性的,因为您注意到我确信它会对在Java中使用this
的主题有所了解。
答案 12 :(得分:0)
要避免这种情况,请使用IDE(如Eclipse),在这种情况下会生成警告。
此外,除非绝对不能,否则请将您的字段设为最终字段。这样做有很多原因(除此之外)。