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; 

这是允许的,因为它是包含变量初始值设定项的字段声明