2 flyingzhlunasea FlyingZhLunasea 于 2017.08.29 20:42 提问

求解一个类加载机制的问题


public class SuperClass {
    static{
        System.out.println("superclass init");
    }

    public static int value = 123;

}


public class SubClass extends SuperClass{

    static{
        System.out.println("subclass init");
    }

}

public class Client {

    public static void main(String[] args) {
        System.out.println(SubClass.value);
    }
}

上面这段测试程序执行后,只会输出“superclass init”而不会输出“subclass init”,也就是没有触发子类的初始化,由于对类加载机制不甚了解,求大神解惑,谢谢

2个回答

caozhy
caozhy   Ds   Rxr 2017.08.29 23:59
zy841958835
zy841958835   Ds   Rxr 2017.08.30 08:30

根据think in java里面的讲法 For static fields, only the classes that define this field are initialized 说的是SubClass.value这个value值是
SubClass的父类的 所以只会去初始化SubClass的父类 不然 工程里面所有的静态关键字都要转载进jvm 有点低效率

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java中的ClassLoader 动态加载机制
前言: Android中的动态加载机制能更好的优化我们的应用,同时实现动态的更新,这就便于我们管理我们的应用,通过插件化来减轻我们的内存以及CPU消耗,在不发布新版本的情况下能更新某些模块。 当然这里要说的并不是android中的动态加载机制,而是java中的ClassLoader动态加载我们的class,虽然android是基于Dalvik,但是先了解java中JVM怎么来加载我们的clas
php类文件的自动加载机制
通常情况,在使用php面向对象开发的过程中,一个类的定义都是一个文件,这样子下来,当类与类之间需要相互引用的时候就需要include(require)相应的类文件,如此一来带来的一个不是问题的问题,就是每次需要用到某个类的时候就需要去手工include(require)。 在php5之后已经有了类的自动加载机制,可以定义__autoload函数,在使用到某个未定义的类,执行php会出错,但是
深入理解JVM-虚拟机加载机制-类加载过程
本文是基于周志明的《深入理解Java虚拟机》     虚拟机把描述类的数据从Class文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。     从类被加载到虚拟机内存中开始,到卸载出内存为止,类的生命周期包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resol
java 的 ClassLoader 类加载机制详解
一个程序要运行,需要经过一个编译执行的过程: Java的编译程序就是将Java源程序 .java 文件 编译为JVM可执行代码的字节码文件 .calss 。Java编译器不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。
【JAVA笔记——术】Java ClassLoader类加载机制详解
Java ClassLoader三种类加载器WIki : Java_ClassloaderJAVA类加载器实现了一部分 JRE加载JAVA CLASSES到 JVM 的功能。ClssLoader 实现了懒加载,并且使得JVM不必关心加载文件以及所使用的文件系统。 类加载器虽然只用于实现类的加载动作,但它在JAVA程序中所起到的作用远远不限于类加载阶段。对于任意一个类,都需要有由加载它的类加载
深入BREW模块加载机制.doc
深入BREW模块加载机制.doc,深入BREW模块加载机制.doc,深入BREW模块加载机制.doc,深入BREW模块加载机制.doc
最大子段和问题的动态规划求解
最大子段和问题的动态规划求解最大子段和问题的动态规划求解最大子段和问题的动态规划求解最大子段和问题的动态规划求解
其实类加载器的加载机制很简单
针对类加载器的分类与说明 一.类加载器的分类: 1.系统提供的类加载器                 1.BootStarp(引导类加载器):负责加载java核心类库,不继承自ClassLoader加载器; 2.Extension(扩展类加载器):负责加载java扩展库(例如sun公司专门为连接数据库设计的JDBC的一组API) 3.Application(系统类加载器):
Android中的动态加载机制
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势。本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病。 Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求。但是有些
类加载器的父亲委托机制深度详解
一、类加载器 1、父亲委托机制(Parent Delegation) 类加载器用来把类加载到Java虚拟机中。从JDK1.2版本开始,类的加载过程采用父亲委托机制,这种机制能够更好的保证java平台的安全,在此委托机制中,除了Java虚拟机自带的根类加载器外,其余的类加载器都有且只有一个父类加载器。当java程序请求加载器loader加载Sample类时,loader首先委托自己的父