JAVA构造类的过程

本文代码块参考代码部分博客
本文JVM原理部分参考原理部分博客

JVM运行java代码原理部分

class HelloApp
{
 public static void main(String[] args)
 {
  System.out.println("Hello World!");
  for (int i = 0; i < args.length; i++ )
  {
   System.out.println(args[i]);
  }
 }
}

这里写图片描述
1.开始试图执行类HelloApp的main方法,发现该类并没有被虚拟机装载,也就是说虚拟机当前不包含该类的二进制代表(也就是javac后的class文件)。
2.虚拟机使用ClassLoader试图寻找这样的二进制代表。如果这个进程失败,则抛出一个异常。
3.类被装载后同时在main方法被调用之前,必须对类HelloApp与其它类型进行链接然后初始化。
链接包含三个阶段:检验,准备和解析。
3.1、检验检查被装载的主类的符号和语义
3.2、准备和创建类或接口的静态域以及把这些域初始化为标准的默认值,这部分就静态的默认初始化
3.3、解析负责检查主类对其它类或接口的符号引用,比如继承了父类。在这一步它是可选的。

类的初始化是对类中声明的静态初始化函数和静态域的初始化构造方法的执行。一个类在初始化之前它的父类必须被初始化

下面开始用程序验证这一个过程

public class Print {

     public Print(String s){
         System.out.print(s + " ");
     }
 }

  public class Test1 {

      public static Print obj1 = new Print("1");

      public Print obj2 = new Print("2");

      public static Print obj3 = new Print("3");

      static{
         new Print("4");
     }
     public static Print obj4 = new Print("5");

     public Print obj5 = new Print("6");

     public Test1(){
         new Print("7");
     }

 }

  public class Test2 extends Test1{

      static{
          new Print("a");
      }

      public static Print obj1 = new Print("b");

      public Print obj2 = new Print("c");

     public Test2(){
         new Print("d");
     }

     public static Print obj3 = new Print("e");

     public Print obj4 = new Print("f");

     public static void main(String [] args){
         Test1 obj1 = new Test2();
         Test1 obj2 = new Test2();
     }
 }

结果是:1 3 4 5 a b e 2 6 7 c f d 2 6 7 c f d
执行main方法,程序输出顺序为:
obj1: 1 3 4 5 a b e 2 6 7 c f d
obj2: 2 6 7 c f d
输出结果表明,程序的执行顺序为:
如果类还没有被加载:
1、先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。(输出1 3 4 5)
2、执行子类的静态代码块和静态变量初始化。(输出 a b e)
3、执行父类的实例变量初始化(输出 2 6)
4、执行父类的构造函数(输出 7)
5、执行子类的实例变量初始化(输出 c f)
6、执行子类的构造函数(输出d)
如果类已经被加载:
则静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法。(输出 2 6 7 c f d)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 构造过程通常包括以下几个步骤: 1. 分配内存空间:在创建对象之前,Java 虚拟机会先在堆上为对象分配足够的内存空间。 2. 初始化成员变量:在分配内存空间之后,Java 虚拟机会自动初始化对象的成员变量,通常会赋予默认值。 3. 调用构造器:在初始化成员变量之后,Java 虚拟机会调用构造器来初始化对象的状态,也就是给成员变量赋值。 4. 返回对象的引用:在构造器执行完毕之后,Java 虚拟机会将对象的引用返回给调用者,用于后续的对象操作。 下面是一个示例代码,展示了 Java 构造过程: ```java public class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; System.out.println("Person 构造器被调用了"); } public void sayHello() { System.out.println("Hello, my name is " + name + ", and I am " + age + " years old."); } public static void main(String[] args) { Person person = new Person("Tom", 20); // 创建 Person 对象 person.sayHello(); // 调用对象的方法 } } ``` 在上面的代码中,我们定义了一个名为 Person 的,它包含了两个属性:name 和 age。在构造器中,我们使用了关键字 this 来引用当前对象,以便于访问对象的属性和方法。在 main 方法中,我们创建了一个 Person 对象,并调用了它的 sayHello 方法。 运行上面的代码,可以看到控制台输出了 "Person 构造器被调用了" 和 "Hello, my name is Tom, and I am 20 years old.",这表明 Java 构造过程成功完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值