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 ...
 
随机推荐
- AVAudioPlayer简易封装
			
AVAudioPlayer简易封装 [说明] AVAudioPlayer简易封装,仅仅支持播放,暂停,停止,暂停时候带有渐隐效果,自己用,没有参考价值. [源码] https://github.com ...
 - Linux echo命令详解
			
echo :输出文字到控制台 -n: 不换行输出 -e:解析转移字符 (-b: 退格 -n 换行 -t 空格) 常用的命令展示 echo {1..4} ==> seq -s " ...
 - 《C++ Primer Plus》读书笔记之八—对象和类
			
第十章 对象和类 1.面向对象编程(OOP)的特性:抽象.封装和数据隐藏.多态.继承.代码的重用性. 2.指定基本类型完成了3项工作:①决定数据对象需要的内存数量.②决定如何解释内存中的位(lon ...
 - zabbix 监控wind登录状态
			
参考博文:http://blog.51cto.com/qicheng0211/1694583 需求:监控win 2008 的用户登录状态,无论用户登录成功与否都要告警(也可以刷选指定用户.指定时间内) ...
 - php算法基础----时间复杂度和空间复杂度
			
算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上, ...
 - October 08th 2017 Week 41st Sunday
			
Talent wins games, but teamwork and intelligence wins championships. 才华让你赢得比赛,团队及智慧让你赢得冠军. But the m ...
 - Java8新特性 -- 四大内置的核心函数式接口
			
可以把这些函数式接口作为方法的参数. 1.0 核心内置函数式接口一: 消费型接口@FunctionalInterfacepublic interface Consumer<T> { voi ...
 - FWT背板笔记
			
板子 背板子.jpg \(Fwt\)用于解决这样的问题 \[C_i=\sum_{j\bigoplus k=i}A_j\times B_k\] 其中\(\bigoplus\)是一种二元运算符,如\(or ...
 - SVN 客户端使用
			
一.TortoiseSVN基本设置 1.1 客户端设置 1.1 语言设置 二.基本操作 2.1 浏览服务器 用户名跟密码,跟公司配置管理员人员获取,没有专门的 ...
 - CentOS部署Kubernetes1.13集群-1(使用kubeadm安装K8S)
			
参考:https://www.kubernetes.org.cn/4956.html 1.准备 说明:准备工作需要在集群所有的主机上执行 1.1系统配置 在安装之前,需要先做如下准备.三台CentOS ...