我可以使用我的实例变量作为构造函数参数吗?

时间:2013-09-06 00:36:22

标签: java constructor

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

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

class Myclass{
    int x;
    Myclass (x)
}

我也可以试试

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

回应我的第一个回答......这会有效吗?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以使用与实例变量同名的参数或局部变量,是。在这种情况下,参数或局部变量将遮蔽实例变量。要在这种情况下引用实例变量,请使用:

this.x

例如,看到这种模式很常见:

class MyClass {
    private int x;

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

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

答案 2 :(得分:0)

这将编译:

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

但是,执行此操作时,最终会得到两个具有相同名称的变量,实例变量x,它们可以在构造函数(或任何其他类方法)中显式引用为{{1} },以及构造函数本地的局部参数变量this.x。如果您只是在构造函数中引用x,那么您将获得本地的x。这被称为变量阴影。

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

尝试这样做的实验可能有助于理解这一点,即为变量提供不同的类型。例如,将实例变量设为boolean。然后你可以尝试不同的东西,看看它们确实是完全不同的变量,恰好具有相同的名称。

答案 3 :(得分: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!
    }
}

编译器会抱怨。