有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中数据字段初始化的类顺序

在下面的代码中,数据字段的初始化顺序是什么?java对数据成员和成员函数遵循的一般规则是什么

public class TestClass 
{
  int j=10;
  static int h=5;

  public static void main(String[] args)
  {
     TestClass obj= new TestClass();       
  }
}

共 (3) 个答案

  1. # 1 楼答案

    一般而言:

    1)静态字段成员(通常为静态初始值设定项)

    2)非静态字段成员

    3)建造商

    但是,您可以使用以下代码片段对其进行测试:

    public class TestClass {
        int i = 10;
        static int j = 20;
        public TestClass() {
            // TODO Auto-generated constructor stub
            System.out.println(i);
            i = 20;
            System.out.println(i);
        }
        public static void main(String[] args) {
            new TestClass();
        }
    }
    

    引用伟大的“Java思维”一文:

    Within a class, the order of initialization is determined by the order that the variables are defined within the class. The variable definitions may be scattered throughout and in between method definitions, but the variables are initialized before any methods can be called—even the constructor. ................................... There’s only a single piece of storage for a static, regardless of how many objects are created. You can’t apply the statickeyword to local variables, so it only applies to fields. If a field is a staticprimitive and you don’t initialize it, it gets the standard initial value for its type. If it’s a reference to an object, the default initialization value is null.


    总结创建对象的过程,考虑一个名为Boo:

    的类。
    1. 尽管它没有显式使用static关键字,但构造函数实际上是一个 静态方法。所以第一次创建Dog类型的对象,或者第一次创建 访问类Dog的静态方法或静态字段时,Java解释器必须 找到狗。类,它通过在类路径中搜索来执行此操作

    2. 像狗一样。类被加载(创建一个类对象,稍后您将了解它),所有 它的静态初始值设定项正在运行。因此,静态初始化只发生一次,因为 类对象是第一次加载的

    3. 创建新的Dog()时,首先要执行Dog对象的构造过程 为堆上的Dog对象分配足够的存储空间

    4. 该存储被擦除为零,自动设置该狗中的所有原语 对象的默认值(数字为零,布尔和 char)和对null的引用

    5. 执行在字段定义点发生的任何初始化

    6. 构造函数被执行。这实际上可能涉及相当多的活动,特别是在涉及继承的情况下

  2. # 2 楼答案

    这是订单

    1. 静态字段初始化和静态块在类加载时执行,它们将按照它们声明的相同顺序初始化
    2. 将字段设置为默认初始值(0、false、null)
    3. 调用对象的构造函数(但不要执行构造函数的主体)
    4. 调用超类的构造函数
    5. 使用初始值设定项和初始化块初始化字段
    6. 执行构造函数的主体
  3. # 3 楼答案

    我认为您只是缺少了section 12.4.2个JLS,其中包括:

    接下来,按照文本顺序执行类的类变量初始值设定项和静态初始值设定项,或者执行接口的字段初始值设定项,就像它们是单个块一样

    “按文本顺序”部分是重要的一点

    如果将m从静态变量更改为实例变量,则该字段将不会通过类初始化进行初始化-它将仅通过实例初始化进行初始化(即,在构造实例时)。目前,这将导致堆栈溢出-创建一个实例需要创建另一个实例,这需要创建另一个实例,等等

    最后,这里是您要搜索的顺序:

    初始化块按它们在程序中出现的顺序运行。 静态初始化块在类首次加载到JVM时运行 每当创建类的新实例时,实例初始化块就会运行