java类的主动使用/被动使用
对类的使用方式分为:主动使用、被动使用
所有的java虚拟机实现必须在每个类或接口被java程序“首次主动使用”时才初始化他们
ps:被动使用不会初始化类,但是有可能会加载类(JVM规范里没有说明)
并且,如果在加载的过程中,遇到了.class文件的缺失或者存在错误,类加载器只会在首次主动使用它们时才会报错,如果一直没有主动使用,则不会报错
主动使用:
创建类的实例、访问某个类或者接口的非final类型的静态变量/对该静态变量赋值、调用类的静态方法、反射、初始化一个类的子类、jvm启动时被标明为启动类的类(如Java Test、main方法所在的类)、jdk1.7开始提供动态语言的支持相关(很少使用)
ps:
初始化一个类的子类这条规则,不适用于接口,即:初始化一个类的子类,会先初始化它的父类,但是不一定会初始化它的接口。只有当首次使用该接口的静态变量时,才会初始化。
被动使用:
除了主动使用的其他使用方式
(1)通过子类引用父类的静态字段,为子类的被动使用,不会导致子类初始化
1 class Dfather{
2 static int count = 1;
3 static{
4 System.out.println("Initialize class Dfather");
5 }
6 }
7
8 class Dson extends Dfather{
9 static{
10 System.out.println("Initialize class Dson");
11 }
12 }
13
14 public class Test4 {
15 public static void main(String[] args) {
16 int x = Dson.count;
17 }
18 }
上面这个例子中,虽然是以Dson.count 形式调用的,但是因为count是Dfather的静态成员变量,所以只初始化Dfather类,而不初始化Dson类
(2)通过数组定义类引用类,为类的被动使用,不会触发此类的初始化
原因:其实数组已经不是E类型了,E的数组jvm在运行期,会动态生成一个新的类型,新类型为:
如果是一维数组,则为:[L+元素的类全名;二维数组,则为[[L+元素的类全名
如果是基础类型(int/float等),则为[I(int类型)、[F(float类型)等
1 class E{
2 static{
3 System.out.println("Initialize class E");
4 }
5 }
6
7 public class Test5 {
8 public static void main(String[] args) {
9 E[] e = new E[10];
10 }
11 }
(3)常量在编译阶段会存入调用方法所在的类的常量池中(这个例子存在F类的常量池中),本质上没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化
在本例子中,编译好了Test6后,类Test6和类F就完全没有关系了,甚至,你可以把类F的class文件删掉,也不影响程序的正常执行
1 class F{
2 static final int count = 1;
3 static{
4 System.out.println("Initialize class F");
5 }
6 }
7
8 public class Test6 {
9 public static void main(String[] args) {
10 int x = F.count;
11 }
12 }
如上例中,F类中定义的count是final对象,其在编译阶段就会存入调用类的常量池中
但是,如果把代码改成
1 class F{
2 static final String s = UUID.randomUUID().toString();
3 static{
4 System.out.println("Initialize class F");
5 }
6 }
7
8 public class Test6 {
9 public static void main(String[] args) {
10 String x = F.s;
11 }
12 }
则语句 "Initialize class F" 会打印出来,因为UUID.randomUUID().toString()这个方法,是运行期确认的,所以,这不是被动使用
java类的主动使用/被动使用的更多相关文章
- Java Web:主动和被动方式检测安全的框架
对于某些敏感的系统例如支付.交易需要为其加固,有必要将可能的攻击情况考虑进来加以防范,于是有了这么一个简易的安全框架.在前辈的代码上( 详见 :http://blog.csdn.net/zhongwe ...
- 深入剖析Classloader(一)--类的主动使用与被动使用
原文地址:http://yhjhappy234.blog.163.com/blog/static/3163283220115573911607 我们知道java运行的是这样的,首先java编译器将我们 ...
- 所有的Java虚拟机必须实现在每个类或接口被Java程序 “ 首次主动使用 ” 时才初始化他们
原文:https://www.cnblogs.com/fanjie/p/6916784.html Java程序对类的使用方式可分为两种– 主动使用– 被动使用 被动使用以后再讲,这里说说什么是主动使用 ...
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- 解析Java类和对象的初始化过程
类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...
- java类生命周期详细解析
(一)详解java类的生命周期 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前 ...
- Java类的生命周期详解
引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告 ...
- 【转】Java 类的生命周期详解
一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大 ...
- JVM中java类的加载时机(转载:http://blog.csdn.net/chenleixing/article/details/47099725)
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制.类从被加载到虚拟机内存中开始,到卸载出内 ...
随机推荐
- MySQL重做日志(redo log)
前面介绍了三种日志:error log.slow log.binlog,这三种都是 Server 层的.今天的 redo log 是 InnoDB引擎专有的日志文件. 为什么要有 redo log 用 ...
- vue中监视对象内部变化的三种方法
一,对整个对象监视 watch:{ obj:{ handler(newV,oldV){ console.log('obj changed') }, deep: true,//深度遍历 immediat ...
- 题解-[CEOI2017]Building Bridges
[CEOI2017]Building Bridges 有 \(n\) 个桥墩,高 \(h_i\) 重 \(w_i\).连接 \(i\) 和 \(j\) 消耗代价 \((h_i-h_j)^2\),用不到 ...
- webstorm实现手机预览页面
效果:在webstorm中开发页面,复制该页面在电脑中的浏览网址,发给手机,在手机上点击链接,可以直接访问本地开发的页面.并且,电脑上修改后保存,手机上刷新即可看到效果. 步骤: 1.webstorm ...
- memcached session会话共享
1 安装依赖包yum install libevent livevent-devel nc -y 2 yum 安装memcachedyum install -y memcached 3 启动memec ...
- nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
Mac上启动nginx报如上错误,原因是80端口已被占用,可能有些服务未能成功关闭. 解决:键入命令 sudo nginx -s stop ( 或 sudo nginx -s quit) ,然后 s ...
- 【网盘下载加速器】可爆破提取码 加速高达20M以上
[软件名称]:网盘下载加速 [软件版本]:1.0.0 [软件大小]:3.95MB [支持系统]:Android,4.4+及更高版本 [测试系统]:小米 [使用说明]:一款小巧的网盘 ...
- sqli-labs 54-65(CHALLANGES)
challenges less-54 less-55 less-56 less-57 less-58 less-59 less-60 less-61 less-62 less-63 less-64 l ...
- 云小课 | 需求任务还未分解,该咋整!项目管理Scrum项目工作分解的心酸谁能知?
温馨提醒:本文约3000字,需要阅读5分钟,共分为8个部分,建议分段阅读! 软件开发过程中,从产品概念形成到产品规划.往往要做详细的需求分析和项目规划等,因此,选对一款项目管理工具对开发者就显得尤为重 ...
- bbed工具安装
1.上传bbedus.msb bbedus.msg sbbdpt.o ssbbded.o四个文件到数据库服务器 [oracle@edgzrip1-PROD1 bbed_10g_src_x32]$ ...