new一个对象时Jvm做了哪些事情:

之前没有进行过类加载(1)类加载并初始化类中的静态属性(赋默认值,如果静态属性有自己赋值,则显示自己赋的值)

                                         (2)执行静态代码块

之前进行过类加载,则从第3步开始进行

                                         (3)初始化类中的非静态属性

                                         (4)调用父类的构造器(如果父类构造器中调用了子类重写后的父类方法,则调用子类的方法)

                                         (5)父类构造器执行完以后,如果自己声明的属性有显示的赋值,则覆盖默认值

                                         (6)执行匿名代码块

                                         (7)执行构造器

                                         (8)返回内存地址

class HelloA{
 public HelloA(){
 System.out.println("HelloA");
 }
 {System.out.println("I'm A class");}
 static {System.out.println("static A");}
 }
 public class HelloB extends HelloA{
     public HelloB() {
     System.out.println("HelloB");
     }
     {System.out.println("I'm B class");}
     static {System.out.println("static B");}
     public static void main(String[] args) {
 System.out.println("-----main start------");
 new HelloB();
 new HelloB();
 System.out.println("-----main end------");
 }
 }

以上程序的输出结果为:

static A
 static B
 -----main start------
 I'm A class
 HelloA
 I'm B class
 HelloB
 I'm A class
 HelloA
 I'm B class
 HelloB
 -----main end------

java程序的编译阶段是将.java文件翻译成.class文件,运行时将.class文件加载到内存中去解释执行。