Java中成员变量赋值和构造方法执行顺序是怎样的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1060个文字,预计阅读时间需要5分钟。
关于这个问题,我们可以使用JVM的工作原理来解释。首先,观察以下代码:
javaclass 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); }}
1. 类加载:当程序运行时,JVM会加载类X、Y和Z。类加载过程包括: - 加载:JVM查找并加载指定的类文件。 - 验证:确保类文件符合Java虚拟机规范。 - 准备:为类变量分配内存,并设置默认初始值。 - 解析:将符号引用转换为直接引用。
2. 初始化:在类加载完成后,JVM会执行类的初始化。对于类X和Z,初始化过程包括: - 初始化类变量:为类变量分配内存,并设置默认初始值。 - 执行静态初始化器:如果类中有静态初始化器,则按顺序执行。 - 执行构造器:创建对象时,会调用构造器。
3. 对象创建: - 创建Y对象:在类X中,有一个Y类型的引用变量b,它指向一个新的Y对象。 - 创建Z对象:在类Z中,有一个Y类型的引用变量y,它也指向一个新的Y对象。
4. 执行构造器: - 创建X对象:调用X的构造器,打印X。 - 创建Z对象:调用Z的构造器,打印Z。
5. 输出结果:按照上述步骤,程序输出XYXZ。
总结:通过分析JVM的工作原理,我们可以理解程序执行过程,并预测输出结果。
对于这个问题应该用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(); //结果是 YXYZ } }
这段代码的执行过程如下:
1.在栈内存定义变量此时为初始值,定义方法。基本数据类型为0 ,引用数据类型为null
2. 调用父类构造方法,定义父类的属性和方法(如果子类已经重写父类的方法 这时不会被覆盖,整个过程不会发生任何覆盖的情 况)
3. 给父类的变量赋值。(此处即new了一个Y对象)
4. 执行父类构造方法中其他语句(此时它自己变量已经初始化和赋值完成,貌似很合理)
5. 给自己变量赋值(在堆内存创建对象或常量)(此处也是new了一个Y对象)
6. 执行构造方法中其他语句
铺垫的小知识:
第一个:成员变量有基本类型和引用类型的。
class Demo { //基本类型 int x = 10; //引用类型 Student s = new Student(); }
第二个:类的初始化过程
加载class文件
堆中开辟空间
变量的默认初始化
变量的显示初始化
构造代码块初始化
构造方法初始化
第三个:遇到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=color; 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(); } }
以上这篇聊聊Java 成员变量赋值和构造方法谁先执行的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。
本文共计1060个文字,预计阅读时间需要5分钟。
关于这个问题,我们可以使用JVM的工作原理来解释。首先,观察以下代码:
javaclass 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); }}
1. 类加载:当程序运行时,JVM会加载类X、Y和Z。类加载过程包括: - 加载:JVM查找并加载指定的类文件。 - 验证:确保类文件符合Java虚拟机规范。 - 准备:为类变量分配内存,并设置默认初始值。 - 解析:将符号引用转换为直接引用。
2. 初始化:在类加载完成后,JVM会执行类的初始化。对于类X和Z,初始化过程包括: - 初始化类变量:为类变量分配内存,并设置默认初始值。 - 执行静态初始化器:如果类中有静态初始化器,则按顺序执行。 - 执行构造器:创建对象时,会调用构造器。
3. 对象创建: - 创建Y对象:在类X中,有一个Y类型的引用变量b,它指向一个新的Y对象。 - 创建Z对象:在类Z中,有一个Y类型的引用变量y,它也指向一个新的Y对象。
4. 执行构造器: - 创建X对象:调用X的构造器,打印X。 - 创建Z对象:调用Z的构造器,打印Z。
5. 输出结果:按照上述步骤,程序输出XYXZ。
总结:通过分析JVM的工作原理,我们可以理解程序执行过程,并预测输出结果。
对于这个问题应该用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(); //结果是 YXYZ } }
这段代码的执行过程如下:
1.在栈内存定义变量此时为初始值,定义方法。基本数据类型为0 ,引用数据类型为null
2. 调用父类构造方法,定义父类的属性和方法(如果子类已经重写父类的方法 这时不会被覆盖,整个过程不会发生任何覆盖的情 况)
3. 给父类的变量赋值。(此处即new了一个Y对象)
4. 执行父类构造方法中其他语句(此时它自己变量已经初始化和赋值完成,貌似很合理)
5. 给自己变量赋值(在堆内存创建对象或常量)(此处也是new了一个Y对象)
6. 执行构造方法中其他语句
铺垫的小知识:
第一个:成员变量有基本类型和引用类型的。
class Demo { //基本类型 int x = 10; //引用类型 Student s = new Student(); }
第二个:类的初始化过程
加载class文件
堆中开辟空间
变量的默认初始化
变量的显示初始化
构造代码块初始化
构造方法初始化
第三个:遇到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=color; 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(); } }
以上这篇聊聊Java 成员变量赋值和构造方法谁先执行的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。

