0
class Myclass{
    int x; 
    Myclass (int i){
        x = i;
    }
}

那是我书中的代码。我想知道这段代码是否有效?

class Myclass{
    int x;
    Myclass (x)
}

我也可以试试

class Myclass{
    int x;
    Myclass (int x)
}

作为对我的第一个回答的回应……这行得通吗?

4

4 回答 4

1

后面的代码不起作用,因为在 Java 中您必须显式声明类型。(没有隐式类型声明)

于 2013-09-06T00:37:28.343 回答
0

您可能有一个与实例变量同名的参数或局部变量,是的。在这种情况下,参数或局部变量将隐藏实例变量。要在这种情况下引用实例变量,请使用:

this.x

例如,这种模式很常见:

class MyClass {
    private int x;

    public MyClass(int x) {
        this.x = x;
    }
}

请注意,正如 Josh M 指出的那样,不可能省略类型。如果这就是你的问题,那么不,你可能不会。

于 2013-09-06T00:38:35.250 回答
0

这将编译:

class Myclass {
    int x;
    Myclass (int x) {
    }
}

然而,当你这样做时,你最终会得到两个同名的变量,一个实例变量x,它可以在构造函数(或任何其他类方法)中显式地引用为this.x,以及构造函数本地的局部参数变量x。如果你只是在构造函数中引用,x你会得到本地的。这称为可变阴影。

即使您决定在源代码中为这两个变量赋予相同的名称,但在编译器生成的代码中它们完全不相关。您不妨将参数命名为 y。

一个可能有助于理解这一点的实验是赋予变量不同的类型。例如,使您的实例变量 a boolean。然后你可以尝试不同的东西,看看它们真的是完全不同的变量,只是碰巧有相同的名字。

于 2013-09-06T00:45:34.833 回答
0

在@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!
    }
}

编译器会抱怨。

于 2013-09-06T00:50:10.273 回答