主动使用和被动使用Demo

1、创建工程一个Gradle工程

下一步

下一步

点击完成

2、创建类

  1. public class MyTest1 {
  2.  
  3. public static void main(String[] args) {
  4. System.out.println(MyChild1.str);
  5. }
  6. }
  7.  
  8. class MyParent1{
  9. public static String str = "hello world";
  10.  
  11. static {
  12. System.out.println("MyParent1 static block");
  13. }
  14. }
  15.  
  16. class MyChild1 extends MyParent1{
  17. static {
  18. System.out.println("MyChild static block");
  19. }
  20. }

  输出结果:

  1. MyParent1 static block
  2. hello world

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

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

修改后的类:

  1. public class MyTest1 {
  2.  
  3. public static void main(String[] args) {
  4. System.out.println(MyChild1.str2);
  5. }
  6. }
  7.  
  8. class MyParent1{
  9. public static String str = "hello world";
  10.  
  11. static {
  12. System.out.println("MyParent1 static block");
  13. }
  14. }
  15.  
  16. class MyChild1 extends MyParent1{
  17.  
  18. public static String str2 = "hello world 2";
  19.  
  20. static {
  21. System.out.println("MyChild static block");
  22. }
  23. }

  执行结果

  1. MyParent1 static block
  2. MyChild static block
  3. hello world 2

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

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

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

完整的代码

  1. public class MyTest1 {
  2.  
  3. public static void main(String[] args) {
  4. System.out.println(MyChild1.str);
  5. }
  6. }
  7.  
  8. class MyParent1{
  9. public static String str = "hello world";
  10.  
  11. static {
  12. System.out.println("MyParent1 static block");
  13. }
  14. }
  15.  
  16. class MyChild1 extends MyParent1{
  17.  
  18. public static String str2 = "hello world 2";
  19.  
  20. static {
  21. System.out.println("MyChild static block");
  22. }
  23. }

  

打印的结果

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

JVM参数

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

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

4、首次主动使用例子

  1. public class MyTest4 {
  2.  
  3. public static void main(String[] args) {
  4. MyParent4 myParent4 = new MyParent4();
  5. System.out.println("-------------");
  6. MyParent4 myParent5 = new MyParent4();
  7. }
  8. }
  9.  
  10. class MyParent4{
  11.  
  12. static {
  13. System.out.println("MyParent4 static block");
  14. }

  打印结果:

  1. MyParent4 static block
  2. -------------

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

  1.  

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. 01-HTML基本介绍

    本篇主要介绍HTML相关标签的使用,以及其常用标签的作用等介绍. 一.HTML的介绍 HTML是 HyperText Mark-up Language 的首字母简写,意思是超文本标记语言,超文本指的是 ...

  2. HAProxy-1.8.x版本源码编译

    源码编译HAProxy:  官网下载HAProxy包,并解压包,切换到haproxy包目录下 [root@centos17haproxy-1.8.20]#tar xvf haproxy-1.8.20. ...

  3. [daily][archlinux] pacman 安装软件时404的问题

    时常,我们在archlinux上pacman安装一个软件时,会遇见如图这样的问题: “The requested URL returned error: 404”  [classic_tong @ 2 ...

  4. Kotlin构造方法详解与初始化过程分析

    在上一次https://www.cnblogs.com/webor2006/p/11192025.html已经初识了Kolin的面向对象,先来回顾一下: 介绍了primary 构造方法,其特点回忆一下 ...

  5. oracle删除重复数据,只保留一条

    比如,某个表要按照id和name重复,就算重复数据 delete from 表名 where rowid not in (select min(rowid) from 表名 group by id,n ...

  6. 八.Protobuf3更新消息类型(添加新的字段)

    Protobuf3 更新消息类型 如果现有的消息类型不满足你的所有需求——例如,你希望消息格式有一个额外的字段——但是你仍然希望使用用旧格式创建的代码,别担心!在不破坏任何现有代码的情况下更新消息类型 ...

  7. PPT扁平化设计总结

    注:以下内容基本都来自知乎,由于已经不记得网址了,所以未能附上所有相关链接,抱歉. PPT扁平化设计原则一.亲密:意思相近的内容放在一起二.对齐:页面上的某两个元素之间总是围绕一条直线对齐三.对比:有 ...

  8. python链接oracle数据库以及数据库的增删改查实例

    初次使用python链接oracle,所以想记录下我遇到的问题,便于向我这样初次尝试的朋友能够快速的配置好环境进入开发环节. 1.首先,python链接oracle数据库需要配置好环境. 我的相关环境 ...

  9. C++语言第一课的学习

    // HelloApp.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include ...

  10. 计数 luogu 4223 期望逆序对

    https://www.luogu.org/problemnew/show/P4223 期望乘以\(\binom {n}{2}^k\)变成了计数问题 我们考虑每一组数\((A, B)\)产生的贡献CC ...