实列+JVM讲解类的实列化顺序
刨根问底---类的实列化顺序
开篇三问
1什么是类的加载,类的加载和类的实列有什么关系,什么时候类加载
2类加载会调用构造函数吗,什么时候调用构造函数
3什么是实列化对象,实列化的对象有什么东西。
我们先做一个实验,截图来自:https://blog.csdn.net/u011517841/article/details/82657047
public class Text {
public static int k = 10;
public int a = print("a");
public static int b = print("b");
public static Text t1 = new Text("t1");
public static Text t2 = new Text("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
public int m = print("m");{
print("构造块");
}
static {
print("静态块");
} public int l = print("l");
public static int o = print("o"); public Text(String str) {
System.out.println("构造:" + (++k) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
} public static int print(String str) {
System.out.println("print:" + (++k) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
} public int p = print("p"); public static void main(String args[]) {
Text t = new Text("init");
}
}
结果:
print:11:b i=0 n=0
print:12:a i=1 n=1
print:13:j i=2 n=2
print:14:m i=3 n=3
print:15:构造块 i=4 n=4
print:16:l i=5 n=5
print:17:p i=6 n=6
构造:18:t1 i=7 n=7
print:19:a i=8 n=8
print:20:j i=9 n=9
print:21:m i=10 n=10
print:22:构造块 i=11 n=11
print:23:l i=12 n=12
print:24:p i=13 n=13
构造:25:t2 i=14 n=14
print:26:i i=15 n=15
print:27:静态块 i=16 n=99
print:28:o i=17 n=100
print:29:a i=18 n=101
print:30:j i=19 n=102
print:31:m i=20 n=103
print:32:构造块 i=21 n=104
print:33:l i=22 n=105
print:34:p i=23 n=106
构造:35:init i=24 n=107分析:
1.首先程序启动时会去找main函数吧,要想使用main函数首先会对有此main函数的类进行加载,验证,准备,初始 化。准备的时候会为类变量分配内存,初始化为默认值。因此准备的时候只会去加载静态变量。此阶段没有打印值2.初始化阶段:初始化阶段会为静态变量赋值和运行静态代码块。此阶段会print(b),然后new Text("text1).
在碰到new 的时候回去初始化一个Text对象。因此会打印a,j,m,会执行代码块打印构块,然后打印l,p最后再调用构造函数。紧接着new Test("text2)就同理了。然后紧接着又继续类的初始化阶段打印i,静态块,o 3.生成对象:就是初始化类的实列成员,然后调用构造函数的过程。
增加有父类的情况
public class JVMParent {public static int width = 100; public static int count; {
System.out.println("parent no static code block :" + count);
} static{
System.out.println("parent static's count:" + count);
} JVMParent(int a){
System.out.println("parent init one parameter");
} JVMParent(){
System.out.println("parent init");
} }
public class JVMSon extends JVMParent { {
System.out.println("son no static code block :" + count);
} static {
System.out.println("son static 1");
} public static int count1; JVMSon() {
System.out.println("son init:" + count);
} static {
System.out.println("son static 2");
} public static void main(String[] args) {
System.out.println("son main start");
JVMSon a = new JVMSon(); } }
答案
parent static's count:0
son static 1
son static 2
son main start
parent no static code block :0
parent init
son no static code block :0
分析
1.首先要加载Son类,因为它有main函数,但是它有父类,必须先加载父类。因此先加载父类,准备,初始化,然后解析。准备阶段打印:parent static's count。然后加载子类,打印son static 1,son static 2.现在类的准备阶段完毕。
2.执行main函数:打印son main start
3.实列化对象:先初始化父类,parent no static code block :0,调用父类的构造函数,然后初始化子类。
感觉这部分逻辑有问题。。。。。。
实列+JVM讲解类的实列化顺序的更多相关文章
- mybatis高级(2)_数据库中的列和实体类不匹配时的两种解决方法_模糊查询_智能标签
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...
- SQLite帮助类SQlitehelper 实现对SQLite数据的增删改查
public class SQLiteHelper { public const string sConn = "Data Source=" + @"path" ...
- 【优化】COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名)
[优化]COUNT(1).COUNT(*).COUNT(常量).COUNT(主键).COUNT(ROWID).COUNT(非空列).COUNT(允许为空列).COUNT(DISTINCT 列名) 1. ...
- 在论坛中出现的比较难的sql问题:6(动态行转列 考试科目、排名动态列问题)
原文:在论坛中出现的比较难的sql问题:6(动态行转列 考试科目.排名动态列问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 下面的几个问题,都是动态行转列的问题. ...
- pandas.DataFrame对行和列求和及添加新行和列
导入模块: from pandas import DataFrame import pandas as pd import numpy as np 生成DataFrame数据 df = DataFra ...
- WPF DataGrid某列使用多绑定后该列排序失效,列上加入 SortMemberPath 设置即可.
WPF DataGrid某列使用多绑定后该列排序失效 2011-07-14 10:59hdongq | 浏览 1031 次 悬赏:20 在wpf的datagrid中某一列使用了多绑定,但是该列排序失 ...
- JVM查找类文件的顺序(转)
配置classpath 根据path环境变量的原理,可以定义一个名为classpath环境变量,将要运行的class文件所在目录定义在该变量中. 例:set classpath=c:\ classpa ...
- jqm的多列布局demo,html5的多列布局demo,多列布局的具体解说,html5开发实例具体解释
因为移动设备屏幕宽度较小,所以一般不建议使用多列布局.但有时你可能须要并排放置一些元素(如button之类的). jQuery Mobile通过约定的类名ui-grid来提供了一种基于css的多列布局 ...
- SQLServer2016 之后增加了索引列数的限制 从 16个列 增加到了 32个列
创建带有包含列的索引 https://docs.microsoft.com/zh-cn/sql/relational-databases/indexes/create-indexes-with-inc ...
随机推荐
- Comet OJ - Contest #0 A题 解方程 (数学)
题目描述 小象同学在初等教育时期遇到了一个复杂的数学题,题目是这样的: 给定自然数 nn,确定关于 x, y, zx,y,z 的不定方程 \displaystyle \sqrt{x - \sqrt{n ...
- Comet OJ - Contest #2 B 她的想法、他的战斗(概率 + 数学)
题目描述 Takuru 是一名情报强者,所以他想利用他强大的情报搜集能力来当中间商赚差价. Takuru 的计划是让 Hinae 帮他去市场上买一个商品,然后再以另一个价格卖掉它.Takuru 会给 ...
- ubuntu进入纯命令行
启动按shfit 然后光标在第一行按e 倒数第二行末尾添加quiet splash $vt_handoff 3 然后按CTRL+X或F10引导系统,启动之后就是命令行模式了
- git log混乱之混乱操作
好几个分支 然后就混乱了 git log信息一坨屎 git 删除某次指定的提交 git reset只是在本地仓库中回退版本,而远程仓库的版本不会变化. 以删除master分支为例 #新建一个备份的分支 ...
- 第二组_学生会管理系统_APP端个人感想
一:相关链接 1.相关源码链接: 1.学生会管理系统APP端:Code 2.学生会管理系统WEB端:Code 3.学生会管理系统后台:COde 2.相关文档和博客: 1.前期接口文档以及需求文档Doc ...
- Django【第9篇】:Django之用户认证auth模块
用户认证--------------auth模块 一.auth模块 from django.contrib import auth 1 .authenticate() :验证用户输入的用户名和密码 ...
- vue制作分页
怎么制作分页?得先把思路路通顺了才可以. 我制作过程中遇到3个问题: 1,问:制作分页需要什么数据?怎么关联起来? 答:分页数据内容包含几部分, 1,当前是第几页?或则说当前默认是第几页. ...
- css3圆角边框
圆角边框 一.border-radius属性简介 为元素添加圆角边框,可以对元素的四个角进行圆角设置(属性不具有继承性) 二.border-radius定义方法 border-radius属性有两 ...
- [window] Pyhton轻便好用的spyder IDE如何去除E501 line too long提示
spyder 使用pep8作为代码规范的标准,默认单行长度是89个字符以内. 作为一个完美控,在使用spyer有的进行coding时,每当看到以下这个小小的warning时,心情都不是很爽: 89个字 ...
- Go实现分布式外部排序
Go实现分布式外部排序 项目路径: https://github.com/Draymonders/go_external_sort 默认读入文件: small.in 默认输出文件:small.out ...