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

Java 我可以使用实例变量作为构造函数参数吗?,java,constructor,Java,Constructor,这就是我书中的密码。我想知道这个代码是否有效 class Myclass{ int x; Myclass (int i){ x = i; } } 我也可以试试 class Myclass{ int x; Myclass (x) } 作为对我第一个答案的回应……这行得通吗?后一个代码行不通,因为在Java中必须显式地声明类型。(没有隐式类型声明)您可能有一个与实例变量同名的参数或局部变量,是的。在这种情况下,参数或局部变量将隐藏实例变量

这就是我书中的密码。我想知道这个代码是否有效

class Myclass{
    int x; 
    Myclass (int i){
        x = i;
    }
}
我也可以试试

class Myclass{
    int x;
    Myclass (x)
}

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

后一个代码行不通,因为在Java中必须显式地声明类型。(没有隐式类型声明)

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

this.x

例如,常见的模式是:

class Myclass{
    int x;
    Myclass (int x)
}
请注意,正如Josh M指出的,不可能省略该类型。如果这就是你的问题所在,那么不,你可以不回答。

这将编译:

class MyClass {
    private int x;

    public MyClass(int x) {
        this.x = x;
    }
}
但是,当您这样做时,您会得到两个同名的变量,实例变量
x
,它可以在构造函数(或任何其他类方法)中显式引用为
this.x
,以及局部参数变量
x
局部到构造函数。如果您只参考构造函数中的
x
,您将得到本地构造函数。这称为变量阴影

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


一个可能有助于理解这一点的实验是给变量赋予不同的类型。例如,将实例变量设置为布尔值。然后你可以尝试不同的事情,发现它们确实是完全不同的变量,只是碰巧有相同的名称。

在@Chris Hayes'和@Samuel Edwin Ward的答案之后,这里有一个技巧

class Myclass {
    int x;
    Myclass (int x) {
    }
}
final
修饰符告诉编译器不能修改
x
。如果你不小心写了

class MyClass {
    private int x;

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

编译器会抱怨。

试试看。。。测试这一点很容易,我不明白你为什么要这么做。我不能让java在我的计算机上运行,否则我会从这本书中学到更多乐趣。@user2752603我已经正确格式化了你的代码。为了便于将来参考,您可以通过突出显示代码并单击“{}”按钮来格式化代码。另外,任何缩进四个空格的行都被格式化为代码。谢谢,我不知道用四个空格隔开第一行,我现在知道了,我很感激你的Java安装发生了什么?你安装了JDK吗?您是否将
JAVA\u HOME
环境变量设置为安装目录?您是否将
%JAVA\u HOME%\bin
添加到您的
路径
(或
$JAVA\u HOME/bin
,如果您使用OSX或Linux)?是的,它可以工作。构造函数的第一行很可能是
this.x=x
class MyClass {
    private int x;

    public MyClass(final int x) {
        x = x;  // Oopsie!
    }
}