动手动脑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字段必须在声明时或构造器中进行初始化,并且一旦初始化后不能再修改其值。

浙公网安备 33010602011771号