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 ...
随机推荐
- as3 连接mysql
http://www.cnblogs.com/yili16438/archive/2011/04/23/2025936.html
- linux控制台批量杀进程
-| cd /app/tomcat8/bin/ ./startup.sh
- python 2 类与对象
1.类与对象的概念 类即类别.种类,是面向对象设计最重要的概念,从一小节我们得知对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体. 那么问题来了,先有的一个个具体存在的对象(比如一 ...
- UI5-文档-4.17-Fragment Callbacks
现在我们已经集成了对话框,是时候添加一些用户交互了.用户肯定希望在某个时候再次关闭对话框,因此我们添加一个按钮来关闭对话框并分配一个事件处理程序. Preview The dialog now has ...
- struts2的异常配置
1:当我们出现异常我们浏览器会直接暴露我们的技术结构,会给我们的项目带来一些安全隐患.2:当这种错误出现,给用户感觉是非常不友好.3:怎么解决 1:如果处理找不到action方法的错误呢? 在Stru ...
- java多线程实例
import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.concurr ...
- Appuim学习路-Appuim介绍
(学一个东西,总的知道它支持什么.为什么要选择它吧?所以我就去看github上的介绍了.发现大家介绍的来源大多来自于此) Appium是一个开源的自动化框架,是跨平台的,允许所有平台使用同一套AP ...
- pymongo的常用操作
环境:pymongo3.0.3,python3 以下是我整理的一些关于pymongo的操作,网上很多是用pymongo.Connecion()去连接数据库的,但是我这里连接一直提示没有这个包,如果大家 ...
- IE低版本浏览器兼容问题
head标签中填写如下代码 <meta name="renderer" content="webkit"/> <meta name=" ...
- Linux 查看当前时间
一.查看和修改Linux的时区1. 查看当前时区命令 : "date -R"2. 修改设置Linux服务器时区方法 A命令 : "tzselect"方法 B 仅 ...