聊聊Java 成员变量赋值和构造方法谁先执行的问题

网友投稿 279 2022-11-18


聊聊Java 成员变量赋值和构造方法谁先执行的问题

对于这个问题应该用JVM的工作步骤来解释,首先看如下代码

class X {

Y b = new Y();

X() {

System.out.print("X");

}

}

class Y {

Y() {

System.out.print("Y");

}

}

public class Z extends X {

Y y = new Y();

Z() {

System.out.print("Z");

}

public static void main(String[] args) {

new Z(); http:////结果是 YXYZ

}

}

这段代码的执行过程如下:

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

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

3. 给父类的变量赋值。(此处即new了一个Y对象)

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

5. 给自己变量赋值(在堆内存创建对象或常量)(此处也是new了一个Y对象)

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

铺垫的小知识:

第一个:成员变量有基本类型和引用类型的。

class Demo {

//基本类型

int x = 10;

//引用类型

Student s = new Student();

}

第二个:类的初始化过程

加载class文件

堆中开辟空间

变量的默认初始化

变量的显示初http://始化

构造代码块初始化

构造方法初始化

第三个:遇到extends,就要知道,先初始化父类数据,然后初始化子类数据。

分层初始化。

super在这里仅仅表示要先初始化父类数据。

补充知识:java 设计一个Dog类,有名字、颜色、年龄等属性,定义构造方法来初始化类的这些属性,定义方法输出Dog信息。编写应用程序使用Dog类。

我就废话不多说了,大家还是直接看代码吧~

class Dog{

private String name,color;

private int age;

public Dog(String name,String color,int age){

this.name=name;

this.color=colorhttp://;

this.age=age;

}

public void print(){

System.out.println("名字:"+name+" 颜色:"+color+" 年龄:"+age+"岁");

}

}

public class DogTest{

public static void main(String args[]){

Dog d=new Dog("哈士奇","白色",5);

d.print();

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java父类继承中的static和final用法
下一篇:浅谈Java方法调用的优先级问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~