做了一个演示Demo,代码如下:
package com.java.text;
public class TextClass {
public static void main(String[] args) {
B b=new B();
}
}
class A{
//共有静态成员属性
public static C c=new C();
//私有静态成员属性
private static C c2=new C();
public C c3=new C();
String str;
static {
System.out.println("A 类中的静态代码块被执行");
}
//普通代码块1
{
System.out.println("A 类中的普通代码块1被执行");
}
//普通代码块2
{
System.out.println("A 类中的普通代码块2被执行");
}
public A() {
System.out.println("A 类中的构造方法被执行");
}
}
class B extends A{
//共有静态成员属性
public static D d=new D();
//私有静态成员属性
private static D d2=new D();
public D d3=new D();
static {
System.out.println("B 类中的静态代码块被执行");
}
//普通代码块1
{
System.out.println("B 类中的普通代码块1被执行");
}
//普通代码块2
{
System.out.println("B 类中的普通代码块2被执行");
}
public B() {
super();
System.out.println("B 类中的构造方法被被执行");
}
}
class C{
public C(){
System.out.println("C 类中的构造方法被执行");
}
}
class D{
public D(){
System.out.println("D 类中的构造方法被执行");
}
}
/**
*1.在单一的类中,属性的初始化是最靠前的,并且由于static所修饰的东西是属于类的,所以优先加载。
* 加载顺序为:初始化静态属性 -> 静态代码块 -> 初始化普通属性 -> 普通代码块 -> 构造方法。
*2.在有继承的情况下(两个类的继承),创建一个子类的对象,那么加载顺序为:
* 加载顺序为: 初始化父类中的静态属性 -> 父类中的静态代码块 -> 初始化子类中的静态属性 -> 子
* 类中的静态代码块 -> 父类中的普通属性初始化 -> 父类中的普通代码块 -> 父类中的
* 构造方法 -> 子类中的普通属性初始化-> 子类中的普通代码块 -> 子类中的构造方法。
*/
通过输出语句得出结论入上,但是有一个疑问,都说在创建子类对象的时候会在子类构造方法中调用父类的构造方法,可为什么子类和父类中的输出语句中不在一起(连续)输出呢?