Java类的加载的一个小问题
前言
之前写了一篇文章专门介绍了一下类的加载和对象的创建流程,然后收到了一个博友的疑问,觉得蛮好的,在这里和大家分享下。
博文地址:【Java基础】Java类的加载和对象创建流程的分析
疑问
类在加载的时候,是不是就可以被实例化?
public class Test3 {
public static Test3 t = new Test3();
{
System.out.println("blockA");
}
static {
System.out.println("blockB");
}
public static void main(String[] args) {
Test3 t1 = new Test3();
}
}
运行结果
blockA
blockB
blockA
你对结果有疑问吗?和你认为的一样吗?
分析
其实这个问题如果理解了类的加载和对象的创建流程,其实很容易理解的。
类的加载
简单的流程是:
1. 先加载静态内容:静态成员变量,静态代码块,静态方法。(按代码书写顺序加载)
- 静态成员变量默认初始化,完成之后,静态成员变量显示初始化。
- 执行静态的代码块内容。先执行父类的静态代码块,再执行子类的静态代码块。
2. 静态内容加载完成之后,再加载非静态内容。
3. 所有的静态内容和非静态内容加载完成之后,类加载完成。
4. 类加载完成之后可以执行程序中具体的对象创建和代码。
对象的创建
1.给对象分配内存空间,其实就是分配内存地址。
2.对类中的的非静态的成员变量开始默认初始化。
3.加载对应的构造方法,执行隐式三步
①有个隐式的super(); ②显示初始化(给所有的非静态的成员变量) ③执行非静态构造代码块 之后才开始执行本类的构造方法中的代码
4.对象创建完成
解答
针对上面的代码示例,我们可以分析下打印结果:
1. 执行main()方法,由于JVM中之前没有Test3.class信息,因此需要加载类Test3的Class文件到JVM中。
2. 根据类的加载原理,先加载静态内容,再加载非静态内容,因此首先加载的就是
public static Test3 t = new Test3();
这是一个静态实例化的代码,根据对象的创建流程,一步一步的执行,会在加载对应的构造方法时,执行隐式三步:Test3无显示继承的父类(默认继承超类Object),无非静态的成员变量,有非静态的构造代码块 --> 执行非静态的构造代码块,打印 "blockA"。
3. 第一个static 加载完成之后,继续往下执行其他的static,执行静态代码块,打印 "blockB"。
4. 类的加载完成
5. 回来执行main()方法中的 Test3 t1 = new Test3(); 执行隐式三步,得到打印结果:"blockA"。
因此最终的输出结果为:
blockA
blockB
blockA
Java类的加载的一个小问题的更多相关文章
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...
- JVM(1):Java 类的加载机制
原文出处: 纯洁的微笑 java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang. ...
- Java类的加载、链接和初始化
一.Java的类加载机制回顾与总结: 我们知道一个Java类要想运行,必须由jvm将其装载到内存中才能运行,装载的目的就是把Java字节代码转换成JVM中的java.lang.Class类的对象.这样 ...
- java 类的加载,链接,初始化
本篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码 ...
- 【Java基础】Java类的加载和对象创建流程的详细分析
相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...
- JAVA类的加载、连接与初始化
JAVA类的加载.连接与初始化 类的声明周期总共分为5个步骤1.加载2.连接3.初始化4.使用5.卸载 当java程序需要某个类的时候,java虚拟机会确保这个类已经被加载.连接和初始化,而连接这个类 ...
- Java类的加载 链接 初始化
原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够 ...
- java类从加载、连接到初始化过程
类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个Class对象,存储在.class文件中,JV ...
随机推荐
- [翻译] AYVibrantButton
AYVibrantButton https://github.com/a1anyip/AYVibrantButton AYVibrantButton is a stylish button with ...
- Linux学习---Linux用户审计简单版
[root@localhost root]# vim /etc/profile # SHENJI history USER=`whoami` USER_IP=`who -u am i 2>/de ...
- Zabbix日常监控(触发器表达式、远程执行命令、宏简等)简单记录
主机的工作基本流程 Host group --> Host --> Application --> Item --> Trigger(OK-->PROBLEM,trigg ...
- RAC数据库的RMAN备份异机恢复到单节点数据库
1.首先在rac环境用rman备份数据库.[oracle@rac1 admin]$ rman target /run{allocate channel c1 device type disk conn ...
- [EffectiveC++]item26:尽可能延后变量定义式的出现时间
- App案例分析——XBMC
本文分析app的是安卓本地视频播放器:XBMC. 第一部分: 调研,评测 1.下载软件并使用起来,描述最简单直观的个人第一次上手体验. 第一次使用这个播放器,就很喜欢这个主界面,其他类似软件的主界 ...
- lambda表达式和groovy闭包的区别
groovy定义的闭包是 Closure 的实例,lambda表达式只是在特定的接⼝或者抽象类的匿名实现,他们之间最主要区别闭包可以灵活的配置代理策略⽽labmda表达式不允许
- JS日期比较大小 给定时间和持续时间计算最终时间
/* 往指定时间字符串上加时间间隔,获得新的时间字符串 * startDateStr:开始时间字符串,类似"2015-7-20 17:26:00" * durationN ...
- CSS3 新增颜色表示方式
一.CSS1&2颜色表示方式(W3C标准) 1.Color name 颜色名称方式(用颜色关键字表示对应的颜色.) 例如:red(红色).blue(蓝色).pink(粉色) 优点:方便快捷而 ...
- OSM
一.OSM是什么 开放街道图(OpenStreetMap,简称OSM)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图(wiki:http://wiki.openstreetm ...