class Myclass{
int x;
Myclass (int i){
x = i;
}
}
那是我书中的代码。我想知道这段代码是否有效?
class Myclass{
int x;
Myclass (x)
}
我也可以试试
class Myclass{
int x;
Myclass (int x)
}
作为对我的第一个回答的回应……这行得通吗?
class Myclass{
int x;
Myclass (int i){
x = i;
}
}
那是我书中的代码。我想知道这段代码是否有效?
class Myclass{
int x;
Myclass (x)
}
我也可以试试
class Myclass{
int x;
Myclass (int x)
}
作为对我的第一个回答的回应……这行得通吗?
后面的代码不起作用,因为在 Java 中您必须显式声明类型。(没有隐式类型声明)
您可能有一个与实例变量同名的参数或局部变量,是的。在这种情况下,参数或局部变量将隐藏实例变量。要在这种情况下引用实例变量,请使用:
this.x
例如,这种模式很常见:
class MyClass {
private int x;
public MyClass(int x) {
this.x = x;
}
}
请注意,正如 Josh M 指出的那样,不可能省略类型。如果这就是你的问题,那么不,你可能不会。
这将编译:
class Myclass {
int x;
Myclass (int x) {
}
}
然而,当你这样做时,你最终会得到两个同名的变量,一个实例变量x
,它可以在构造函数(或任何其他类方法)中显式地引用为this.x
,以及构造函数本地的局部参数变量x
。如果你只是在构造函数中引用,x
你会得到本地的。这称为可变阴影。
即使您决定在源代码中为这两个变量赋予相同的名称,但在编译器生成的代码中它们完全不相关。您不妨将参数命名为 y。
一个可能有助于理解这一点的实验是赋予变量不同的类型。例如,使您的实例变量 a boolean
。然后你可以尝试不同的东西,看看它们真的是完全不同的变量,只是碰巧有相同的名字。
在@Chris Hayes 和@Samuel Edwin Ward 的回答之后,这里有一个技巧。
class MyClass {
private int x;
public MyClass(final int x) {
this.x = x;
}
}
final
修饰符告诉编译器不能修改 x
。如果你不小心写了
class MyClass {
private int x;
public MyClass(final int x) {
x = x; // Oopsie!
}
}
编译器会抱怨。