首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使使用子类型引用静态字段,也只初始化超类。

问即使使用子类型引用静态字段,也只初始化超类。
EN

Stack Overflow用户
提问于 2013-04-30 16:28:42
回答 3查看 270关注 0票数 0

我正在研究JAVA初始化过程。这里有一个很好的参考材料:在JVM中加载和初始化类时

在本页面中有这样一条规则: 3)如果由于访问静态字段而触发类初始化,则只初始化声明了静态字段的类,即使静态字段被类型子类、子类接口或接口的实现类引用,也不会触发超类或子类的初始化。

我真的不明白这个主意。如果静态字段是由Sub类引用的,那么这个字段当然需要创建子类对象或由sub类对象分配。因此,它肯定会触发子类初始化。

我的解释怎么了?

编辑

  1. 它确实触发了超类静态初始化。
  2. 如果静态字段是最终字段,而静态最终字段在声明时被初始化。然后,它既不会加载类,也不会初始化类,因为这个静态的最后字段是一个编译时常量。关注点:如果静态最终字段在静态块中初始化,则此语句不再有效。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-30 16:34:21

我想重点是在这样的情况下:

代码语言:javascript
复制
public class Superclass {
    public static long INIT_TIME = System.currentTimeMillis();

    static {
        System.out.println("Initializing Superclass");
    }
}

public class Subclass extends Superclass {
    static {
        System.out.println("Initializing Subclass");
    }
}

此代码:

代码语言:javascript
复制
long time = Subclass.INIT_TIME;

实际编译为:

代码语言:javascript
复制
long time = Superclass.INIT_TIME;

而且只有“初始化超类”会被打印出来,即使源代码引用了Subclass。

票数 3
EN

Stack Overflow用户

发布于 2013-04-30 16:34:31

举个例子:

代码语言:javascript
复制
class A {
   public static int nA = 0;
}

class B extends A {
   public static int nB = 1;
}

class C extends B {
   public static int nC = 2;
}

客户端:

代码语言:javascript
复制
int test = B.nA;

JVM将只初始化A类,而不是B类或C类。

票数 0
EN

Stack Overflow用户

发布于 2014-11-02 14:54:15

如上面所示,当我运行超类/子类示例时,在调用Subclass.INIT_TIME时,将调用超类和子类静态初始化器。

但是这里说只有“初始化超类”才会被打印出来。有人能澄清吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16304733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档