Java 继承关系中:static,构造函数,成员变量的加载顺序
首先看下面的例子:
package simple.demo; /**
* @author Administrator
* @date 2019/01/03
*/
public class ClassA {
ClassB classB1 = new ClassB();
static {
System.out.println("ClassA static=========");
ClassB classB2 = new ClassB();
}
public ClassA(){
System.out.println("ClassA 构造函数=========");
}
}
package simple.demo; /**
* @author Administrator
* @date 2019/01/03
*/
public class ClassB {
static {
System.out.println("ClassB static=========");
}
public ClassB(){
System.out.println("ClassB 构造函数=========");
}
}
package simple.demo; /**
* @author Administrator
* @date 2019/01/03
*/
public class ClassC extends ClassA{
ClassB classB3 = new ClassB();
static {
System.out.println("ClassC static=========");
}
public ClassC(){
System.out.println("ClassC 构造函数=========");
} }
package simple.demo; /**
* @author Administrator
* @date 2019/01/03
*/
public class Test {
public static void main(String[] args){
ClassC classC = new ClassC();
}
}
如果没有看结果,你能猜想输出什么 吗?
输出结果为:
ClassA static=========
ClassB static=========
ClassB 构造函数=========
ClassC static=========
ClassB 构造函数=========
ClassA 构造函数=========
ClassB 构造函数=========
ClassC 构造函数=========
分析:
1、执行main方法的 ClassC classC = new ClassC(); 要实例化ClassC必须先加载ClassC,因为ClassC继承于ClassA,所以加载ClassC之前先加载ClassA,所以加载ClassA的时候,就执行ClassA的static块的内容。
先输出: System.out.println("ClassA static=========");
2、输出完1步的内容后,紧接着执行 ClassB classB2 = new ClassB(); 要实例化ClassB必须要先加载ClassB,所以ClassB的static块里面的内容要执行:System.out.println("ClassB static=========");
3、输出完2步的内容后,就要实例化ClassB了,所以执行ClassB的构造函数:System.out.println("ClassB 构造函数=========");
4、输出完3步的内容后,ClassA已经加载完毕,就应该加载ClassC了,所以输出:System.out.println("ClassC static=========");
5、输出完4步的内容后,ClassC已经加载完毕,就应该实例化ClassC了,要实例化ClassC就必须得先实例化ClassA, 因为子类的构造方法都会调用父类的构造方法。实例化ClassA之前必须先获取ClassA的所有属性,所以执行 ClassB classB1 = new ClassB();
6、 要执行ClassB classB1 = new ClassB(),必须先加载ClassB,因为ClassB已经在第2步的时候加载过,所以static快的内容不会再执行,只会执行ClassB的构造方法,输出:System.out.println("ClassB 构造函数=========");
7、输出完6步的内容后,已经获取了ClassA的所有属性,开始执行ClassA的构造函数了,输出:System.out.println("ClassA 构造函数=========");
8、输出完7步的内容后,ClassA已经实例化完毕,紧接着实例化ClassC,实例化ClassC之前要获取ClassC的所有属性,所要要执行:ClassB classB3 = new ClassB();
9、 要执行ClassB classB3 = new ClassB(),必须先加载ClassB,因为ClassB已经在第2步的时候加载过,所以static快的内容不会再执行,只会执行ClassB的构造方法,输出:System.out.println("ClassB 构造函数=========");
10、最后执行ClassC的构造函数,所以输出:System.out.println("ClassC 构造函数=========");
Java 继承关系中:static,构造函数,成员变量的加载顺序的更多相关文章
- 浅谈JAVA继承关系中的构造函数
话不多说直接上例子,我的例子中定义了两个类,TheSon和TheFather,TheSon继承了TheFather,如图: TheSon类的定义: TheFather类的定义: 当我们初始化The ...
- 跟着太白老师学python day10 名称空间,作用域和取值顺序,变量的加载顺序
名称空间分为3种: 1. 全局名称空间 2. 内置名称空间 3. 局部名称空间(临时) 作用域 全局作用域 1全局名称空间 2 内置名称空间 局部作用域 ...
- java web项目中classes文件夹下的class和WEB-INF/lib中jar里的class文件加载顺序
如果是发布到weblogic的话,可以在WebContent\WEB-INF\weblogic.xml里面配置.参考配置如下:<?xml version="1.0" enco ...
- Java web中listener、 filter、servlet 加载顺序
真正的加载顺序为:context-param -> listener -> filter -> servlet 加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 f ...
- SpringBoot中各配置文件的优先级及加载顺序
我们在写程序的时候会碰到各种环境(开发.测试.生产),因而,在我们切换环境的时候,我们需要手工切换配置文件的内容.这大大的加大了运维人员的负担,同时会带来一定的安全隐患. 为此,为了能更合理地重写各属 ...
- java继承关系中成员变量,构造方法,成员方法的关系
Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单写那个名字就访问那个名字! b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子 ...
- java中static修改成员变量和函数和其他使用
一.通过static修饰的成员变量初始化只会初始化一次 //静态变量初始化只会初始化一次 public class zuishuai { public static void main(String[ ...
- Java类中各种静态变量的加载顺序的学习
最近在补<thinking in java>...有一节提到了加载类需要做的一些准备...我照着书本敲了一下代码...同时稍微修改了一下书本上的代码.... package charpte ...
- Ubuntu环境变量(.profile)加载顺序
Ubuntu下启动的时候的的加载环境变量的过程大致为: /etc/enviroment /etc/profile -->/etc/bash.bashrc --> /etc/prof ...
随机推荐
- License 校验
1:了解keytool 的一些命令 http://www.micmiu.com/lang/java/keytool-start-guide/ 本人在github找的一个demo:https://gi ...
- egret 精简游戏项目
新建一个游戏项目,我们可以删除resource文件夹下除了default.thm.json和default.res.json文件,一旦删除,当新建皮肤exml文件时会报错 还可以删除src文件夹里除了 ...
- Putty全屏/退出全屏快捷键
- eclipse 自动生成json格式的toString()方法
文本代码 {"${member.name()}":"${member.value}", "${otherMembers}"}
- 趣味编程:FizzBuzz(Swift版)
func toFizzBuzzExpr(n: Int) -> String { return n % 3 == 0 && n % 5 == 0 ? "FizzBuzz& ...
- intelij创建MapReduce工程
1.创建一个maven工程 2.POM文件 <?xml version="1.0" encoding="UTF-8"?><project xm ...
- 必备 .NET - C# 脚本
作者:Mark Michaelis | 2016 年 1 月 Link: https://msdn.microsoft.com/zh-cn/magazine/mt614271.aspx 随着 Visu ...
- 漫谈四种神经网络序列解码模型【附示例代码】 glimpse attention
漫谈四种神经网络序列解码模型[附示例代码] http://jacoxu.com/encoder_decoder/ [视觉注意力的循环神经网络模型]http://blog.csdn.net/leo_xu ...
- mark_2017_2_27
工作总结web_acl 535 git clone “ssh://git@outergit.yonyou.com:49622/esn_web/web_acl.git" 600 git bra ...
- canvas 移动光速特效-
http://pan.baidu.com/s/1cHtABO 密码:istl