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文件加载到内存中去解释执行。