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);
}
}
public class ClassB {
ClassB(){
System.out.println("ClassB");
}
}
/*
* 最终总结:
* 在非继承的情况下:
* 先加载子类的(静态代码块、静态变量),接下来执行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
子类无参构造函数
-------------------------------------------------------------------------------------------------------------------------------
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
子类有参构造函数