深入类加载器二----主动引用和被动引用
来源:互联网 发布:我与网络强国演讲稿 编辑:程序博客网 时间:2024/05/21 22:46
深入类加载器(二)--主动引用和被动引用
JVM类加载的全过程值之初始化的时机,类的主动引用和被动引用,静态初始化块执行顺序问题。
我们已经知道了类加载的初始化阶段就是类构造器的初始化。所谓的类构造器就是
将静态变量的初始化动作和静态块中的所有的内容合并起来。在静态变量和静态块的初始化过程
在多线程的环境中肯定是线程安全的。肯定会有同步和等待。并且如果发现父类还没有进行初始化的时候,那么就先初始化父类。这是要注意的。
package com.lg.test;
public class Demo01 {
static {
System.out.println("静态初始化Demo01");
}
public static void main(String[] args){
System.out.println("Demo01中的main方法");
ADemo a=new ADemo();
System.out.println(a.width);
ADemo a2=new ADemo();
}
}
class ADemo extends ADemo_Father{
public static int width=300;
static{
System.out.println("静态初始化类A");
width=100;
}
public ADemo(){
System.out.println("创建A类的对象");
}
}
class ADemo_Father{
static{
System.out.println("静态初始化A_Father");
}
}
运行的结果如下:
静态初始化Demo01
Demo01中的main方法
静态初始化A_Father
静态初始化类A
创建A类的对象
100
创建A类的对象
从这个的输出我们可以看到:这个过程是先加载了Demo01,并且初始化了static块域。然后执行到main方法中的内容。
然后输出一句话。接着,发现要用到A类了。在这里我们可以看到类只有在使用的时候才会被加载。但是又发现ADemo类的父类
还没有被加载,于是开始加载ADemo类的父类,并且进行初始化。接着进行加载和初始化ADemo类。如果我们在new一个
ADemo 的对象,我们发现,类初始化的过程没有执行了。这就说明了,类只有在使用的时候才会被加载,并且只会被
加载和初始化一次。这是要注意的。
接下来我们要聊的就是类的主动引用和被动引用。
主动引用的时候,类会被初始化。
被动引用的时候,类不会被初始化。
package com.lg.test;
public class Demo01 {
static {
System.out.println("静态初始化Demo01");
}
public static void main(String[] args) throws ClassNotFoundException{
//主动引用,类会被初始化
//1 创建一个对象
//new ADemo();
//2 引用一个域的时候
//System.out.println(ADemo.width);
//3 通过反射调用的时候
//Class.forName("com.lg.test.ADemo");
//4 main方法所在的类
//当虚拟机启动的时候,说白了就是main方法中的类一定会被初始化。
//被动引用,类不会被初始化
//这个static变量被final修饰的时候。这样的话,就从常量池直接取过来使用了
//System.out.println(ADemo.MAX);
//通过数组来引用的时候
//ADemo[] array=new ADemo[2];
//只有真正声明这个域的类才会被初始化
// System.out.println(BDemo.width);
}
}
class BDemo extends ADemo{
static{
System.out.println("静态初始化BDemo");
}
}
class ADemo extends ADemo_Father{
public static final int MAX=100;
public static int width=300;
static{
System.out.println("静态初始化类A");
width=100;
}
public ADemo(){
System.out.println("创建A类的对象");
}
}
class ADemo_Father{
static{
System.out.println("静态初始化A_Father");
}
}
从上往下的执行的结果如下:
1.
静态初始化Demo01
静态初始化A_Father
静态初始化类A
创建A类的对象
2.
静态初始化Demo01
静态初始化A_Father
静态初始化类A
100
3
静态初始化Demo01
静态初始化A_Father
静态初始化类A
4
静态初始化Demo01
5
静态初始化Demo01
100
6
静态初始化Demo01
7
静态初始化Demo01
静态初始化A_Father
静态初始化类A
100
- 深入类加载器二----主动引用和被动引用
- JVM类加载过程及主动引用与被动引用
- 深入理解jvm--Java类的初始化及主动引用和被动引用完全解析
- Java 中对类的主动引用和被动引用
- Java 中对类的主动引用和被动引用
- Java中对类的主动引用和被动引用
- Java 中对类的主动引用和被动引用
- 深度剖析类加载器系列文章:二、类的主动使用和被动使用
- Java虚拟机深入详解JVM之类加载器深度剖析、类的主动使用、被动使用
- Java类加载器深度剖析 类的主动和被动使用
- ftp 主动和被动
- Java300StudyNote(7)-JVM核心机制(2)-初始化时机-类的主动引用、被动引用、静态初始化块执行顺序问题
- 主动FTP和被动FTP
- ftp主动和被动模式
- 主动FTP和被动FTP
- 主动攻击和被动攻击
- 主动句子和被动句子
- 深入biztalk消息引用和引用计数
- [2016ACM多校] HDU5829 卷积 NTT
- Markdown编辑器对比分析
- linux多线程编程详解
- 以Hozz工具来管理hosts从而达到访问Google等部分合谐网站的目的
- Objective-c——理解与特性
- 深入类加载器二----主动引用和被动引用
- CodeForces 703D Mishka and Interesting sum (树状数组处理异或和)
- 趣好玩开发日志 02-day
- const常量
- 入门算法之冒泡排序
- POJ 1330 Nearest Common Ancestors(LCA,在线处理三种方式)
- AndroidDeveloper Weekly NO.4
- Ubuntu16.04下载编译Android6.0源码以及我所踩的坑
- tomcat运行程序失败:更改端口号方法,Several ports (8005, 8080, 8009)