为什么我不能在一个方法之外做任务?
如果我尝试给一个类中的variables赋值,但是在一个方法外,我得到一个错误。
class one{ Integer b; b=Integer.valueOf(2); }
但是,如果我在创build过程中初始化它,它会起作用。
class one{ Integer b=Integer.valueOf(2); }
在一个方法中,它在两种情况下都起作用。
你需要做的
class one{ Integer b; { b=Integer.valueOf(2); } }
因为语句必须出现在一段代码中。
在这种情况下,块是一个初始化块,它被添加到每个构造函数中(或者在这种情况下是默认的构造函数)。在任何调用super()
之后,在任何构造函数的主代码块之前运行。
顺便说一句:你可以有一个静态的初始化块static { }
这是在类初始化时调用。
例如
class one{ static final Integer b; static { b=Integer.valueOf(2); } }
由于赋值 语句和语句只允许在代码块(方法,构造函数,静态初始值设定项等)
在这些之外只允许声明。
这个 :
class one{ Integer b=Integer.valueOf(2); }
是一个初始化的声明。 这就是为什么被接受
更一般的答案是,class级机构是关于声明 ,而不是声明 。 对于在正文中出现的语句有特殊的规定,但是必须将它们明确地标记为类初始化程序或实例初始化程序 。
在Java中,定义类时,可以使用默认值定义variables并添加方法。 任何可执行代码(例如赋值)必须包含在一个方法中。
这是java的工作方式,你不能在类里面添加非声明代码(对不起,我不知道正确的术语),那代码应该是里面的方法。
我认为术语明智,其他答案稍微closures。 声明也是声明。 实际上,它们被称为“声明陈述”,这是三种陈述之一。 赋值语句是“expression式语句”的一种forms,只能用于诸如方法,构造函数和初始化符之类的结构中。 查看这个Oracle教程链接中的Statements部分。
方法有责任在成员variables上执行突变。 如果成员variables需要被初始化,java提供了一个在构造,类定义(后一种情况)期间完成的方法。 但是定义过程中不能进行突变(前一种情况)。 通常在方法级完成。
对象是为了保持状态,而方法是为了在这个状态下运行。