java先执行static还是构造函数_Java中成员变量赋值和构造函数谁先执行? 总结java的类在jvm生成的顺序...

//父类

class Fu

{

//父类构造方法

Fu()

{

this.getNum();

}

public void getNum()

{

System.out.println("sdasdads");

}

}

//子类

class Zi extends Fu

{

private int num=4;

//构造函数

public Zi()

{

super();//结果0

System.out.println("子类构造函数中"+this.num);//结果4

}

public void getNum()

{

System.out.println("getNum方法"+this.num);

}

}

public class Demo34

{

public static void main(String[] args)

{

new Zi();

}

}

这是一个有趣问题。我用new一个对象时jvm的工作步骤来解释。

在栈内存定义变量此时为初始值,定义方法。基本数据类型 int 0 。引用数据类型为null;

2. 调用父类构造方法,定义父类的属性和方法(如果子类已经重写父类的方法 这时不会被覆盖,整个过程不会发生任何覆盖的情况)。

父类的private方法是不能被重写的,你把父类的getNum改成protected 和private结果是不一样的!!

3. 给父类的变量赋值。

4. 执行父类构造方法中其他语句(此时它自己变量已经初始化和赋值完成,貌似很合理)。

5. 给自己变量赋值(在堆内存创建对象或常量)。

6.  执行构造方法中其他语句。

按照这个规则你分析一下你的代码。就是这个结果了。

这同时能解释为什么在构造函数里super()必须写在最前。这符合jvm的处理流程。子类构造方法里只能调用一种父类构造方法。

同时也得出一个值得注意的地方,构造方法里尽量避免使用非private的方法。

还有因为泛型的原因  子类重写的

············成员变量与定义与初始化块先于构造函数执行·········

当涉及到继承时,按照如下顺序执行

1、执行父类的静态成员变量定义与静态初始化块,执行子类的静态成员变量定义与静态初始化块

2、执行父类的非静态成员变量定义与动态初始化块,执行父类构造方法

3、执行子类的非静态成员变量定义与动态初始化块,执行子类构造方法

另:父类构造方法中用到的方法如果已被子类重写,那么在构造子类对象时在调用父类构造函数中使用子类重写的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值