use*_*155 7 java this variable-assignment
如果我写下面的课程:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
程序编译,但是当我运行程序时,main方法将打印出两个0.我知道为了说我想在构造函数中初始化实例变量,我必须写:
this.j = j;
this.k = k;
Run Code Online (Sandbox Code Playgroud)
但是如果我不写它,那么在构造函数中(在表达式的左侧和写入侧)评估(或考虑)哪个变量?是参数还是实例变量?这有什么不同吗?
是否存在使用this强制性的其他情况?
Sri*_*nth 31
如果你没有在构造函数中写"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.
}
}
}
Run Code Online (Sandbox Code Playgroud)
Joa*_*uer 10
如果你只是j在构造函数中说,那么编译器会认为你的意思是两种情况下的参数.所以
j = j;
Run Code Online (Sandbox Code Playgroud)
简单地将参数的值赋给j参数j(这是一个非常毫无意义但仍然有效的语句).
因此,为了消除歧义,您可以使用前缀this.来表明您的意思是具有相同名称的成员变量.
另一种用法this是当你需要将对当前对象的引用传递给某个方法时,例如:
someObject.addEventListener(this);
Run Code Online (Sandbox Code Playgroud)
在此示例中,您需要将当前对象作为一个整体引用(而不仅仅是对象的成员).
当您想要返回对象本身时,这非常有用
return this;
Run Code Online (Sandbox Code Playgroud)
这很有用,因为如果一个类有例如Method1()和Method2(),两者都返回这个,你可以编写像这样的调用
object.Method1().Method2()
Run Code Online (Sandbox Code Playgroud)
同样在方法内部,在调用期间将对象本身传递给另一个函数会很有用.
另一个有用的方法(虽然很少使用)是声明方法参数final:
以下块将无法编译,从而立即提醒您错误:
public Example(final int j, final int k) {
j = j;
k = k;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9392 次 |
| 最近记录: |