Java实例变量在两个语句中声明和初始化
嗨,我在java中初始化有问题,下面的代码给我编译错误调用:expected instanceInt = 100; 但我已经宣布了。 如果这些东西与堆栈和堆的东西有关,请用简单的术语解释,我是java的新手,我对这些领域没有高级知识
public class Init { int instanceInt; instanceInt = 100; public static void main(String[] args) { int localInt; u = 9000; } }
你不能在课堂中使用语句。 它必须与您的声明在一个区块或同一行。
做你想做的通常的方法是:
-
声明期间的初始化
public class MyClass{ private int i = 0; }
通常,如果要为字段定义默认值,这是一个好主意。
-
构造函数块中的初始化
public class MyClass{ private int i; public MyClass(){ this.i = 0; } }
如果要在字段初始化期间使用某些逻辑(if / loops),则可以使用此块。 它的问题在于你的构造函数会相互调用一个,或者它们都具有基本相同的内容。
在你的情况下,我认为这是最好的方式。 -
方法块中的初始化
public class MyClass{ private int i; public void setI(int i){ this.i = i; } }
它不是真正的初始化,但您可以随时设置您的值。
-
实例初始化程序块中的初始化
public class MyClass{ private int i; { i = 0; } }
当构造函数不够时使用这种方式(请参阅构造函数块的注释),但通常开发人员倾向于避免使用此forms。
资源:
- JLS – 实例初始化器
在同一主题上:
- 在Java中使用Initializers与Constructors
- 实例初始值设定项与构造函数有何不同?
奖金:
这段代码是什么?
public class MyClass { public MyClass() { System.out.println("1 - Constructor with no parameters"); } { System.out.println("2 - Initializer block"); } public MyClass(int i) { this(); System.out.println("3 - Constructor with parameters"); } static { System.out.println("4 - Static initalizer block"); } public static void main(String... args) { System.out.println("5 - Main method"); new MyClass(0); } }
答案
把它放在初始化块中。
public class Init { int instanceInt; { instanceInt = 100; } public static void main(String[] args) { int localInt; int u = 9000; } }
或者只是在声明时初始化:
public class Init { int instanceInt = 100; public static void main(String[] args) { int localInt; int u = 9000; } }
参考文献:
- Java教程 – 初始化字段
- Java – 初始化程序块
您不能使用单独的语句将值分配给声明区域中的类成员。 您必须从函数(通常是类方法)执行此操作。
对于您的情况,请在申报后立即考虑进行分配。
你需要这样做:
int instanceInt = 100;
如果它是static
您可以在static
块中初始化。
根据Java语言规范 :
类主体可以包含类成员的声明,即字段(第8.3节),类(第8.5节),接口(第8.5节)和方法(第8.4节)。 类主体还可以包含实例初始值设定项(第8.6节),静态初始化程序(第8.7节)和类的构造函数声明(第8.8节)。
但是,声明
instanceInt = 100;
不是那些东西,因此它不被允许作为一个类体的一部分。 你需要做的是:
int instanceInt = 100;
这是允许的,因为它是包含变量初始值设定项的字段声明 。