父类:
public class A {
static {
System.out.println("执行A静态块");
}
{
System.out.println("执行A构造块");
}
protected A() {
System.out.println("执行A构造函数");
}
public A(String s) {
System.out.println("执行A带参构造函数");
}
}
子类:
public class B extends A{
static {
System.out.println("执行B静态块");
}
{
System.out.println("执行B构造块");
}
public B() {
System.out.println("执行B构造函数");
}
public B(String s) {
System.out.println("执行B带参构造函数");
}
}
运行一:
public class Test {
public static void main(String[] args) {
new B();
}
}
结果:
执行A静态块
执行B静态块
执行A构造块
执行A构造函数
执行B构造块
执行B构造函数
运行二:
public class Test {
public static void main(String[] args) {
new B("");
}
}
结果:
执行A静态块
执行B静态块
执行A构造块
执行A构造函数
执行B构造块
执行B带参构造函数
总结:
静态块、静态变量、静态方法、静态类会在加载该类时加载进入内存的静态区,同时静态块会执行唯一一次;
什么时候加载该类呢?
当需要调用该类的方法和成员变量时,比如new 个对象,调用静态成员变量和方法等;
所以执行顺序是:
静态块--------构造块-------构造函数;
调用构造函数时,构造块会执行一次,如果有父类,则父类优先!
注意:
子类的不带参和带参构造函数默认都有一个super(),只是没写出来而已,写出来作用也是一样的,意思是默认会先执行父类的不带参构造函数。
好了,又可以愉快玩啥了。
本文详细解析了Java中父类和子类构造过程中的执行顺序,包括静态块、构造块及构造函数的执行时机,并通过示例代码展示了具体流程。
1万+

被折叠的 条评论
为什么被折叠?



