java构造顺序_Java构造方法的执行顺序

1.如果类里边没有定义任何构造方法,则系统将添加一个默认的无参构造方法。

Class ThisClass{

}

默认隐式添加无参的构造方法,相当于

Class ThisClass{

public ThisClass(){

}

2.构造方法的执行顺序。

(1)如果构造方法中没有在第一条语句中显式调用父类的构造方法,也没有调用本类的重载构造方法,则系统会在执行该构造方法时默认添加调用父类无参构造方法。public ThisClass(){

}

默认隐式添加父类无参构造方法,相当于

public ThisClass(){

super();

}     (2)如果构造方法中在第一条语句调用了本类的重载构造方法,则执行该类的重载构造方法,执行的规则同上。

public ThisClass(){

this(3);

}

public ThisClass(int x){

}

当调用ThisClass的无参构造方法时,因其第一句调用本类的重载构造方法,所以程序进入有参的重载方法中执行,有参构造方法符合(1)的情况,所以隐式添加父类的构造方法。

注:

(1)显式调用父类的构造方法和调用本类的其他重载构造方法都要求必须放在构造方法的第一条语句,所以同一个构造方法中不能既调用父类的构造方法,又调用本类的其他重载构造方法。

6803416b7ce79106ed676bcd5608977b.png

(2)子类构造方法中没有显式调用父类构造方法时,系统默认调用父类无参构造方法,而如果父类没有无参构造方法,则出现编译错误。974093aaa8de140a2f4cfcda0ca430fe.png

附: 当new一个对象时,代码的执行顺序

public class Test {

public static void main(String[] args) {

System.out.println("×××××第一次new B对象×××××");

new B();

System.out.println("×××××第二次new B对象×××××");

new B();

}

}

class A {

{

System.out.println("父类A的自由块");

}

A() {

System.out.println("父类A的构造方法\n");

}

D d = new D("父类A的成员变量被初始化\n");

static {

System.out.println("父类A的静态自由块");

}

static D dd = new D("父类A的静态成员变量被初始化\n");

}

class B extends A {

static D ddd = new D("子类B的静态成员变量被初始化");

static {

System.out.println("子类B的静态自由块\n");

}

D dddd = new D("子类B的成员变量被初始化");

B() {

super();

System.out.println("子类B的构造方法");

}

{

System.out.println("子类B的自由块\n");

}

}

class D {

D(String str) {

System.out.println(str);

}

}

执行结果:×××××第一次new B对象×××××

父类A的静态自由块

父类A的静态成员变量被初始化

子类B的静态成员变量被初始化

子类B的静态自由块

父类A的自由块

父类A的成员变量被初始化

父类A的构造方法

子类B的成员变量被初始化

子类B的自由块

子类B的构造方法

×××××第二次new B对象×××××

父类A的自由块

父类A的成员变量被初始化

父类A的构造方法

子类B的成员变量被初始化

子类B的自由块

子类B的构造方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值