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