博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在JAVA中将NEW一分为2,分步进行[反射机制产生类]
阅读量:6877 次
发布时间:2019-06-26

本文共 845 字,大约阅读时间需要 2 分钟。

  hot3.png

class TestOne{      static{         System.out.println("静态代码块运行");      }      TestOne(){         System.out.println("构造方法");      }  }

首先这是一个类,如上代码。

对于这个类,有一个静态代码块,有一个构造方法。

看这段代码:

Testone to = new Testone();

输出结果是什么?肯定是:

静态代码块运行构造方法

静态代码块在JVM加载类的时候就会被调入内存,构造方法在创建对象的时候也会被调入内存调用。因此输出结果如上,毫无疑问。

但是,请看下面的代码:

Class cla = Class.forName("Testone");Testont to = cla.newInstance();

如果中间有代码隔开,在输出中我们轻而易举地发现:

当第一句代码执行后,输出

静态代码块执行

当第二句代码执行后,输出:

构造方法

 

那么,这是为什么呢?

在进行Class.forName("com.TestOne")的时候,实际上是对com.TestOne进行类加载,这时候,会把静态属性、方法以及静态代码块都加载到内存中。所以这时候会打印出"静态代码块运行"。但这时候,对象却还没有产生。所以"构造方法"这几个字不会打印。当执行cla.newInstance()的时候,就是利用反射机制将Class对象生成一个该类的一个实例。这时候对象就产生了。所以打印"构造方法"。当执行到TestOne two=new TestOne()语句时,又生成了一个对象。但这时候类已经加载完毕,静态的东西已经加载到内存中,而静态代码块只执行一次,所以不用再去加载类,所以只会打印"构造方法",而"静态代码块运行"不会打印。【注意:生成多个对象时,静态代码块只被执行一次】

 

 

转载于:https://my.oschina.net/qkmc/blog/863806

你可能感兴趣的文章
最新推出SAP ECC EHP7最新版本IDES带演示数据,带开发ACCESS KEY。
查看>>
详细探究Spark的shuffle实现
查看>>
云桌面技术展望
查看>>
openstack 制作winserver2008_R2镜像 用cloudbase-init 实现第一次创建就注入密码(需登录)...
查看>>
Tengine (淘宝nginx ) + tomcat 安装整合 后篇+ 高可用和负载均衡
查看>>
『AngularJS』创建 Service
查看>>
linux 修改桌面背景
查看>>
Quick Test Professional(UFT)Web Service 测试入门
查看>>
Ubuntu上手动安装sbt
查看>>
facebook首席运营谈成功经验
查看>>
资本倍增
查看>>
DataQL 的表达式编译(自创的一种表达式编译算法)
查看>>
9.29PMP每日一题
查看>>
ORACLE 学习笔记1
查看>>
vmware格式转换
查看>>
PHP操作文件函数大全
查看>>
【Practical API Design学习笔记】工厂方法由于构造函数
查看>>
beego mysql in查询
查看>>
git 回退版本
查看>>
Dynamo:亚马逊的高可用性键-值存储(翻译)
查看>>