主动使用和被动使用Demo

1、创建工程一个Gradle工程

下一步

下一步

点击完成

2、创建类

public class MyTest1 {

    public static void main(String[] args) {
System.out.println(MyChild1.str);
}
} class MyParent1{
public static String str = "hello world"; static {
System.out.println("MyParent1 static block");
}
} class MyChild1 extends MyParent1{
static {
System.out.println("MyChild static block");
}
}

  输出结果:

MyParent1 static block
hello world

  会发现MyChild1的类静态块没有执行。

  总结:对于静态字段来说,只有直接定义了该字段的类才会被初始化。

修改后的类:

public class MyTest1 {

    public static void main(String[] args) {
System.out.println(MyChild1.str2);
}
} class MyParent1{
public static String str = "hello world"; static {
System.out.println("MyParent1 static block");
}
} class MyChild1 extends MyParent1{ public static String str2 = "hello world 2"; static {
System.out.println("MyChild static block");
}
}

  执行结果

MyParent1 static block
MyChild static block
hello world 2

 因为使用到了MyChild的类,它会被初始化。当一个类在初始化时,要求其父类全部都已经初始化完毕。最终打印结果如上面所示。 

3、上面1中,MyChild1没有被实例化,那MyChild类是否有被加载?

-XX:+TraceClassLoading, 用于追踪类的加载信息并打印出来
配置如下:

完整的代码

public class MyTest1 {

    public static void main(String[] args) {
System.out.println(MyChild1.str);
}
} class MyParent1{
public static String str = "hello world"; static {
System.out.println("MyParent1 static block");
}
} class MyChild1 extends MyParent1{ public static String str2 = "hello world 2"; static {
System.out.println("MyChild static block");
}
}

  

打印的结果

说明MyChild类也会被加载, 最先加载的是MyTest1类

JVM参数

-XX:+<option>, 表示开启option选项

-XX:+<option> 表示关闭options选项
-XX:<option>=<value>, 表示将option选项的值设置为value

4、首次主动使用例子

public class MyTest4 {

    public static void main(String[] args) {
MyParent4 myParent4 = new MyParent4();
System.out.println("-------------");
MyParent4 myParent5 = new MyParent4();
}
} class MyParent4{ static {
System.out.println("MyParent4 static block");
}

  打印结果:

MyParent4 static block
-------------

  说明在创建MyParent4 对象的时候,会初始化MyParent4, 但是第二次创建MyParent4的时候,就不会初始化MyParent4。所有只在主动首次使用才会初始化。

												

JVM 主动类和被动类的使用的更多相关文章

  1. JVM类载入过程及主动引用与被动引用

    了解类载入全过程,有助于了解JVM执行过程,以及更深入了解java动态性(解热部署,动态载入),提高程序灵活性. 类载入全过程: JVM将class文件字节码文件载入到内存中.并对数据进行校验解析和初 ...

  2. 深入剖析Classloader(一)--类的主动使用与被动使用

    原文地址:http://yhjhappy234.blog.163.com/blog/static/3163283220115573911607 我们知道java运行的是这样的,首先java编译器将我们 ...

  3. Java中对类的主动引用和被动引用

    1.遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,类如果没初始化就会被初始化,创建对象,读取或设置静态字段,调用静态方法. 2.反射 3.子类初始化前 ...

  4. JVM加载的初始化类

    首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默 ...

  5. JVM类加载器及Java类的生命周期

    预定义类加载器(三种): 启动(Bootstrap)类加载器: 是用本地代码实现的类装入器,它负责将<Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar) ...

  6. 深入了解java虚拟机(JVM) 第十一章 类的加载

    一.类加载机制概述 虚拟机把描述类的数据从class文件加载到内存并对数据进行效验,解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制. 二.类加载的机制 类加载的过程 ...

  7. Java基础12:深入理解Class类和Object类

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  8. 夯实Java基础系列9:深入理解Class类和Object类

    目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); register ...

  9. 【Network telemetry】谈谈网络遥感技术,从主动探测与被动探测再到Netflow与INT

    [前言] [本篇为原创]网络遥感,Network telemetry,为什么叫“telemetry”呢?我个人的理解是将网络中的数据进行一种“采集”,也就是实际上是一种网络数据的采集手段.由于工作需要 ...

随机推荐

  1. Android笔记(四十一) Android中的数据存储——SQLite(三)select

    SQLite 通过query实现查询,它通过一系列参数来定义查询条件. 各参数说明: query()方法参数 对应sql部分 描述 table from table_name 表名称 colums s ...

  2. 分布式结构化存储系统-HBase基本架构

    分布式结构化存储系统-HBase基本架构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在大数据领域中,除了直接以文件形式保存数据外,还有大量结构化和半结构化的数据,这类数据通常需 ...

  3. ISCC之web1

    由题意知,爆破可行. 简单说一下抓包过程,第一个抓到的POST包直接放掉,右键扫描站点,扫出来第二个POST包,第二个POST包cookie,验证码,密码均为空,于是我开始尝试去利用, 经过几次rep ...

  4. Git收藏

     Git Flow 的正确使用姿势 https://www.jianshu.com/p/41910dc6ef29 git合并分支上的commit为一条commit到master  https://ww ...

  5. linux系统编程综合练习-实现一个小型的shell程序(四)

    上节中已经对后台作业进行了简单处理,基本上要实现的功能已经完了,下面回过头来,对代码进行一个调整,把写得不好的地方梳理一下,给代码加入适当的注释,这种习惯其实是比较好了,由于在开发的时候时间都比较紧, ...

  6. python中的exec和eval

    exec 描述 exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码. 返回值 exec 返回值永远为 None. 需要说明的是在 ...

  7. 02 c++的封装性 (构造和析构)

    封装性: 关键字:public private protected 破坏封装:友元函数 friend 实现数据的隐藏:class类 默认是私有,结构体默认是公有. 类和对象:(定义类的注意事项) 在类 ...

  8. vue的组件名称问题

    如果组件名称中带有大写字母,那么会报错

  9. javascript单一复制粘贴

    <div id="copy-txt">内容内容</div> <button type="submit" onclick=" ...

  10. NOIP 2017 PJ

    T1:水 T2:水 T3:水 T4:水,二分+DP检测+单调队列优化,然而优化写炸了,还没暴力分高 所以爆炸 (民间)100 + 100 + 100 + 10 = 310 GAME OVER