java基础---类加载和对象创建过程
程序员文章站
2022-07-23 09:04:24
类中可以存在的成员: 类加载过程: 1、JVM会先去方法区中找有没有类对应的.class存在,如果有,就直接使用;如果没有,就把对应类的.class加载到方法区; 2、将.class加载到方法区的时候,分为两部分,首先将非静态内容加载到方法区的非静态区域内; 3、再将静态内容加载到方法区的静态区域内 ......
类中可以存在的成员:
class A{ 静态成员变量; 非静态成员变量; 静态函数; 非静态函数; 构造函数 A(..){...} 静态代码块 static{...} 构造代码块 {...} }
类加载过程:
1、JVM会先去方法区中找有没有类对应的.class存在,如果有,就直接使用;如果没有,就把对应类的.class加载到方法区;
2、将.class加载到方法区的时候,分为两部分,首先将非静态内容加载到方法区的非静态区域内;
3、再将静态内容加载到方法区的静态区域内,加载完成后,对所有的静态成员变量进行默认初始化;
4、所有静态成员变量默认初始化后,进行显示赋值;再执行静态代码块;(执行静态代码块和静态成员变量显示赋值无先后顺序,与代码顺序有关,谁在前面先执行谁)
5、如果有继承关系,加载子类的时候会先加载父类,在加载子类。
对象创建过程:
1、对象创建首先会在堆内存中开辟一块空间,并分配一个地址;
2、将对象的所有非静态成员加载到开辟的空间下,并为所有非静态成员变量进行默认初始化;
3、调用构造函数进栈执行,在执行构造函数的时候,首先会执行构造函数中的隐式三步,再执行构造函数中的代码;
隐式三步:
1、执行super语句,调用父类的构造函数;
2、对所有非静态成员变量进行显示赋值;
3、执行构造代码块;(非静态成员变量显示赋值和执行构造代码块无先后顺序,由代码顺序决定,谁在前先执行谁);
4、执行完隐式三步后,再执行构造函数中的代码,代码执行完后弹栈;
5、将堆内存中开辟的空间地址赋值给一个引用对象,对象创建完成。
下面用一段代码来验证一下类加载和对象创建过程(转载自某位大牛):
1 //父类 2 public class Insect { 3 private int i = printInit("Insect:i"); 4 protected int j; 5 6 protected static int x1 = printInit("static Insect.x1 initialized"); 7 static{ 8 System.out.println("Insect静态代码块"); 9 x1=80; 10 } 11 Insect() { 12 System.out.println("基类构造函数阶段: i = " + i + ", j = " + j); 13 j = 39; 14 System.out.println(x1); 15 } 16 17 static int printInit(String s) { 18 System.out.println(s); 19 return 47; 20 } 21 22 } 23 //子类 24 public class Beetle extends Insect{ 25 { 26 k=90; 27 } 28 private int k = printInit("Beetle.k initialized"); 29 30 31 protected static int x2 = printInit("static Beetle.x2 initialized"); 32 33 34 public Beetle() { 35 System.out.println(k); 36 } 37 38 39 public static void main(String[] args) { 40 Beetle b = new Beetle(); 41 } 42 43 }
运行结果: