java 静态代码块、静态变量、成员变量、构造代码块、构造方法的执行顺序
来源:互联网 发布:windows显示后缀名 编辑:程序博客网 时间:2024/04/28 03:09
先给出几个用到的类。分析写在了注释里。
父类ClassA:
public class ClassA {
{
System.out.println("父类构造代码块1");
}
{
System.out.println("父类构造代码块2");
}
ClassB b = new ClassB();
static
{
System.out.println("父类静态代码块1");
}
public ClassA() {
System.out.println("父类无参构造函数");
}
public ClassA(String str)
{
System.out.println("父类有参构造函数" + str);
}
}
ClassB:
public class ClassB {
ClassB(){
System.out.println("ClassB");
}
}
未继承ClassA的类:
/*
* 最终总结:
* 在非继承的情况下:
* 先加载子类的(静态代码块、静态变量),接下来执行main函数,
* 创建调用构造方法之前会先调用(构造代码块、成员变量)。括号中的,按代码先后顺序执行。
* 且在【每次】调用某个类的构造方法之前,【都】一定会先(成员变量、构造代码块)。
* 即:(静态代码块、静态变量)> (构造代码块、成员变量)> 构造方法。
* ps:对于这中间用到(加载的)的其他类,同样遵循上述顺序。
* */
public class ConstructorDemo{
private ClassA classTestA = new ClassA();
{
System.out.println("子类构造代码块1");
}
static
{
System.out.println("子类静态代码块1");
}
private static ClassA classTestB = new ClassA("classTestB");
{
System.out.println("子类构造代码块2");
}
static
{
System.out.println("子类静态代码块2");
}
public ConstructorDemo() {
System.out.println("子类无参构造函数");
}
public static void main(String[] args)
{
ConstructorDemo demo = new ConstructorDemo();
}
}
执行结果:
子类静态代码块1
父类静态代码块1
父类构造代码块1
父类构造代码块2
ClassB
父类有参构造函数classTestB
子类静态代码块2
父类构造代码块1
父类构造代码块2
ClassB
父类无参构造函数
子类构造代码块1
子类构造代码块2
子类无参构造函数
-------------------------------------------------------------------------------------------------------------------------------
继承父类ClassA的类:
public class ConstructorExtendDemo extends ClassA{
/*
* 先加载静态文件,之后执行main方法,但是(成员变量、构造代码块)在构造方法之前执行。
* 由ClassB的出现情况可以看出每一次执行该类的构造方法之前,都会先(成员变量、构造代码块)。
*
* 最终总结:
*在继承的情况下,会先加载父类静态代码块或者静态变量,然后加载子类中的静态代码块或者静态变量,
*再接着执行main函数,创建对象时,先调用(成员变量、构造代码块),在调用构造方法。
*但是main函数中的执行,在【每次】调用某个类的构造方法之前,【都】一定会先(成员变量、构造代码块)。
*即:(静态代码块、静态变量)> (构造代码块、成员变量)> 构造方法。
*注意,静态文件只加载一次!
*/
public ConstructorExtendDemo(String str) {
super(str);
System.out.println("子类有参构造函数");
}
private ClassA classTestA = new ClassA();
{
System.out.println("子类构造代码块1");
}
static
{
System.out.println("子类静态代码块1");
}
private static ClassA classTestB = new ClassA("classTestB");
{
System.out.println("子类构造代码块2");
}
static
{
System.out.println("子类静态代码块2");
}
public static void main(String[] args)
{
ClassA a = new ClassA();
ConstructorExtendDemo demo = new ConstructorExtendDemo("childClass");
}
}
执行结果:
父类静态代码块1
子类静态代码块1
父类构造代码块1
父类构造代码块2
ClassB
父类有参构造函数classTestB
子类静态代码块2
父类构造代码块1
父类构造代码块2
ClassB
父类无参构造函数
父类构造代码块1
父类构造代码块2
ClassB
父类有参构造函数childClass
父类构造代码块1
父类构造代码块2
ClassB
父类无参构造函数
子类构造代码块1
子类构造代码块2
子类有参构造函数
- java 静态代码块、静态变量、成员变量、构造代码块、构造方法的执行顺序
- Java静态变量 静态代码块 主函数 成员变量 构造代码块 构造函数的执行顺序
- 静态代码块、静态变量、构造代码块、构造方法的执行顺序
- Java普通代码块,构造代码块,静态代码块,成员变量的执行顺序的代码实例
- 静态成员变量静态代码块和构造方法的执行顺序
- Java的静态变量,成员变量,静态代码块,构造块的加载顺序
- Java中静态块,静态成员变量,构造块,普通成员变量,构造方法的执行顺序
- 【JAVA】探究JAVA父类子类静态代码块、静态变量、构造方法的执行顺序
- 探究JAVA父类子类静态代码块、静态变量、构造方法的执行顺序
- JAVA父类子类静态代码块、静态变量、构造方法的执行顺序
- JAVA父类子类静态代码块、静态变量、构造方法的执行顺序
- 变量初始化,构造代码块,静态代码块,执行顺序
- 关于静态变量,静态代码块,实例变量,实例代码块,构造函数的执行顺序
- java 静态代码块,构造代码块,构造方法,普通代码块的执行顺序
- java 继承时子类父类的静态非静态成员变量,构造方法,静态代码块的初始化顺序
- Java 成员变量 静态块 构造块 构造方法执行顺序测试
- 构造函数,this关键字,及静态方法,静态变量成员变量,静态代码块,构造代码块的问题
- Java初始化顺序总结及其程序执行过程图- 静态变量、静态代码块、成员变量、构造函数
- JDK工具(1) jps
- Hard 380题 Insert Delete GetRandom O(1)
- Ubuntu下显卡管理
- javascript判断浏览器和终端类型,js如何区分手机、电脑终端和浏览器
- leetcode 1 Two Sum 两数之和
- java 静态代码块、静态变量、成员变量、构造代码块、构造方法的执行顺序
- <Learning SQL> O'REILLY_Chap. 1_背景知识
- MySQL错误代码大全
- JAVA 数值转换函数记录
- Core Java Tutorials/核心Java教程
- C++多态原理探究
- pip install _inputthread broken
- 指针,野指针,空指针,赋值?
- 数学内容总结