动手动脑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字段初始化的规律可以总结如下:

  1. 显式初始化:字段可以在声明时进行显式初始化。例如:
  int myField = 42;
  1. 构造器初始化:字段可以在类的构造器中进行初始化。这是最常见的字段初始化方式。当对象被创建时,构造器会执行相应的初始化操作。例如:
  public class MyClass {
  int myField;
   
  public MyClass() {
  myField = 42;
  }
  }
  1. 实例初始化块:字段可以在实例初始化块中进行初始化。实例初始化块在每次创建对象时都会执行,可以用来进行复杂的初始化逻辑。例如:
  public class MyClass {
  int myField;
   
  {
  // 实例初始化块
  myField = 42;
  }
   
  public MyClass() {
  // 构造器
  }
  }
  1. 静态初始化块:静态字段可以在静态初始化块中进行初始化。静态初始化块在类加载时执行,只执行一次。例如:
  public class MyClass {
  static int myStaticField;
   
  static {
  // 静态初始化块
  myStaticField = 42;
  }
  }
  1. 默认初始化:如果字段没有显式初始化,它们会被Java自动初始化为默认值。例如,整数字段会被初始化为0,布尔字段会被初始化为false,引用类型字段会被初始化为null。

  2. 构造器初始化的优先级高于默认初始化:如果字段同时进行了构造器初始化和默认初始化,构造器初始化会覆盖默认初始化的值。

  3. final字段:final字段必须在声明时或构造器中进行初始化,并且一旦初始化后不能再修改其值。

posted @ 2023-10-14 17:49  不会JAVA的小袁  阅读(1)  评论(0编辑  收藏  举报