如果我尝试为类中的变量赋值,但在方法之外我会收到错误消息。
class one{
Integer b;
b=Integer.valueOf(2);
}
但是,如果我在创建过程中初始化它,它就可以工作。
class one{
Integer b=Integer.valueOf(2);
}
在方法内部,它在两种情况下都有效。
你需要做
class one{
Integer b;
{
b=Integer.valueOf(2);
}
}
因为语句必须出现在代码块中。
在这种情况下,该块是一个 initailiser 块,它被添加到每个构造函数(或本例中的默认构造函数)它在对
super()
的任何调用之后和任何构造函数中的主代码块之前运行。
顺便说一句:你可以有一个带有
static { }
的静态初始化块,它在类初始化时被调用。
例如
class one{
static final Integer b;
static {
b=Integer.valueOf(2);
}
}
因为assignments是statements和statements允许仅在代码块(方法,构造函数,静态初始化器等)中
在这些之外,只允许声明。
这个:
class one{
Integer b=Integer.valueOf(2);
}
是带有初始值设定项的声明。这就是为什么被接受
一个更笼统的答案是类主体是关于declarations,而不是statements。对于出现在类主体中的语句有特殊规定,但它们必须明确标记为 class initializers 或 instance initializers.
在Java中,在定义类时,可以定义具有默认值的变量和添加方法。任何可执行代码(例如赋值)都必须包含在方法中。
这就是 java 的工作方式,你不能在类中添加非声明代码(抱歉我不知道正确的术语),该代码应该在方法内部。
我认为就术语而言,其他几个答案略有偏差。声明也是声明。实际上,它们被称为“声明语句”,是三种语句中的一种。赋值语句是“表达式语句”的一种形式,只能用于方法、构造函数和初始值设定项等构造中。查看此 Oracle 教程链接中的语句部分。
方法有责任对成员变量执行突变。如果需要初始化成员变量,java提供了一种在构造、类定义(后一种情况)期间进行初始化的方法。但是在定义期间不能执行突变。(前例)。它通常在方法级别完成。
对象是用来保存状态的,而方法是用来操作那个状态的。