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

类中可以存在的成员:

classA{

静态成员变量;

非静态成员变量;

静态函数;

非静态函数;

构造函数 A(..){...}

静态代码块static{...}

构造代码块 {...}

}

类加载过程:

1、JVM会先去方法区中找有没有类对应的.class存在,如果有,就直接使用;如果没有,就把对应类的.class加载到方法区;

2、将.class加载到方法区的时候,分为两部分,首先将非静态内容加载到方法区的非静态区域内;

3、再将静态内容加载到方法区的静态区域内,加载完成后,对所有的静态成员变量进行默认初始化;

4、所有静态成员变量默认初始化后,进行显示赋值;再执行静态代码块;(执行静态代码块和静态成员变量显示赋值无先后顺序,与代码顺序有关,谁在前面先执行谁)

5、如果有继承关系,加载子类的时候会先加载父类,在加载子类。

对象创建过程:

1、对象创建首先会在堆内存中开辟一块空间,并分配一个地址;

2、将对象的所有非静态成员加载到开辟的空间下,并为所有非静态成员变量进行默认初始化;

3、调用构造函数进栈执行,在执行构造函数的时候,首先会执行构造函数中的隐式三步,再执行构造函数中的代码;

隐式三步:

1、执行super语句,调用父类的构造函数;

2、对所有非静态成员变量进行显示赋值;

3、执行构造代码块;(非静态成员变量显示赋值和执行构造代码块无先后顺序,由代码顺序决定,谁在前先执行谁);

4、执行完隐式三步后,再执行构造函数中的代码,代码执行完后弹栈;

5、将堆内存中开辟的空间地址赋值给一个引用对象,对象创建完成。

下面用一段代码来验证一下类加载和对象创建过程(转载自某位大牛):

1 //父类

2 public classInsect {3 private int i = printInit("Insect:i");4 protected intj;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 intprintInit(String s) {18 System.out.println(s);19 return 47;20 }21

22 }23 //子类

24 public class Beetle extendsInsect{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 publicBeetle() {35 System.out.println(k);36 }37

38

39 public static voidmain(String[] args) {40 Beetle b = newBeetle();41 }42

43 }

运行结果:

a9164a4f4884f667aba629b8321763d2.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值