欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java基础---类加载和对象创建过程

程序员文章站 2022-04-20 12:09:19
类中可以存在的成员: 类加载过程: 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 }

运行结果:

java基础---类加载和对象创建过程