无法编译
原因:没有默认构造
推出结论:当你给类提供了一个自定义的构造方法,导致系统不在提供默认构造方法了,需要自己提供
初始化
测试
package org.example;
public class InitializeBlockClass {
public int field=100;
{
field=200;
}
public InitializeBlockClass(int field) {
this.field = field;
}
public InitializeBlockClass() {
}
public static void main(String[] args) {
InitializeBlockClass obj=new InitializeBlockClass();
System.out.println(obj.field);
obj=new InitializeBlockClass(300);
System.out.println(obj.field);
}
}
测试结果
package org.example;
public class InitializeBlockClass {
{
field=200;
}
public int field=100;
public InitializeBlockClass(int field) {
this.field = field;
}
public InitializeBlockClass() {
}
public static void main(String[] args) {
InitializeBlockClass obj=new InitializeBlockClass();
System.out.println(obj.field);
obj=new InitializeBlockClass(300);
System.out.println(obj.field);
}
}
测试结果
可见顺序也能队初始化有影响,以后一定避免这种多次初始化的操作
Java字段初始化的规律可以总结如下:
- 显式初始化:字段可以在声明时进行显式初始化。例如:
int myField = 42;
- 构造器初始化:字段可以在类的构造器中进行初始化。这是最常见的字段初始化方式。当对象被创建时,构造器会执行相应的初始化操作。例如:
public class MyClass {
int myField;
public MyClass() {
myField = 42;
}
}
- 实例初始化块:字段可以在实例初始化块中进行初始化。实例初始化块在每次创建对象时都会执行,可以用来进行复杂的初始化逻辑。例如:
public class MyClass {
int myField;
{
// 实例初始化块
myField = 42;
}
public MyClass() {
// 构造器
}
}
- 静态初始化块:静态字段可以在静态初始化块中进行初始化。静态初始化块在类加载时执行,只执行一次。例如:
public class MyClass {
static int myStaticField;
static {
// 静态初始化块
myStaticField = 42;
}
}
-
默认初始化:如果字段没有显式初始化,它们会被Java自动初始化为默认值。例如,整数字段会被初始化为0,布尔字段会被初始化为false,引用类型字段会被初始化为null。
-
构造器初始化的优先级高于默认初始化:如果字段同时进行了构造器初始化和默认初始化,构造器初始化会覆盖默认初始化的值。
-
final字段:final字段必须在声明时或构造器中进行初始化,并且一旦初始化后不能再修改其值。