如果我写下面的课程:
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
强制性的其他情况?
如果你没有在构造函数中写"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. } } }
如果你只是j
在构造函数中说,那么编译器会认为你的意思是两种情况下的参数.所以
j = j;
简单地将参数的值赋给j
参数j
(这是一个非常毫无意义但仍然有效的语句).
因此,为了消除歧义,您可以使用前缀this.
来表明您的意思是具有相同名称的成员变量.
另一种用法this
是当你需要将对当前对象的引用传递给某个方法时,例如:
someObject.addEventListener(this);
在此示例中,您需要将当前对象作为一个整体引用(而不仅仅是对象的成员).
如果你不写这个,那么你将参数分配给自己; 参数变量影响实例变量.
当您想要返回对象本身时,这非常有用
return this;
这很有用,因为如果一个类有例如Method1()和Method2(),两者都返回这个,你可以编写像这样的调用
object.Method1().Method2()
同样在方法内部,在调用期间将对象本身传递给另一个函数会很有用.
另一个有用的方法(虽然很少使用)是声明方法参数final:
以下块将无法编译,从而立即提醒您错误:
public Example(final int j, final int k) { j = j; k = k; }