动手动脑3
无法编译
原因:没有默认构造
推出结论:当你给类提供了一个自定义的构造方法,导致系统不在提供默认构造方法了,需要自己提供
初始化
测试
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字段必须在声明时或构造器中进行初始化,并且一旦初始化后不能再修改其值。