Java中一个对象创建分为两个步骤: 加载类,创建对象。

加载类是将所写的程序.java文件编译生成的.class文件加载到内存中,保证了对象创建的预置环境。类加载完毕后才可以创建该类的对象。

第一步:加载类

1. 当开始运行一个类,虚拟机首先试图访问指定启动类的 .main() 方法,加载该类的 .class 文件。

2. 如果该类有父类,那么继续加载其父类,以此类推,直到加载出所有与main入口类相关的类(它的父类,父类的父类等)。

3. 接着,从其顶级父类开始,对其static域按照顺序进行初始化!直至初始化完所有类的static域。>将static域放到静态存储区。

4. 至此类的加载工作完毕了,下面就进入main函数,执行main函数。一般main函数中来创建类的对象,如果发现要创建的类没有被加载,则继续加载该类)

第二步:对象创建

1. 为对象获取内存,然后将内存全部置为0,此时对象中的所有属性都是被赋予0的默认值(内存为0时候的默认值:null-对象引用,0-int,false-boolean...)> 在堆中生成对象所需空间,全部初始化为0,具体成员属性值为堆上对应内存子块--正是因为这种机制,所以java可以保证所有的类对象的属性都会被初始化,但是局部不会被初始化。

这里需要注意的是:一个对象内部组合了另一个对象,那么在堆中其实存的也是一个引用,这个引用指向被组合对象的堆内存地址(另外再创建)。

当引用在内存的二进制数据都为0的时候,他的表现形式是null;当他指向的数据内容内存区数据都是0的时候,他的值为0,"",False等初始标准值。所谓初始化就是修改内存区的二进制数据,因为对象在创建时候第一步就将内存清0,所以保证了所有属性都能至少被初始化为标准初值!

但是局部变量不一样,你不初始化,只是申明,那么开辟的内存区在栈中值会是一个未知数据(一旦使用该引用的话,使用的可能是你没有初始化而瞎几把乱指的地址)所以Java会代码检验的时候发现你使用了未初始化的引用,直接给予不通过,直接杜绝了这种可能性的发生。

综上,Java中使用任何变量或引用,必须初始化,初始化就是将内存中旧的二进制数据要么清0,要么赋予你要赋的值!

2. 从顶级父类开始,按照申明顺序将给顶级父类的非static的成员属性初始化(static的只初始化一次在类加载阶段)> 用属性定义的值覆盖0值。

3. 调用顶级父类的构造函数,如果有成员属性初始化则覆盖前一个申明时初始化值。> 构造函数再次初始化,覆盖前面申明时初始化。

4. 以此类推,将所有的父级(先初始化属性,在调用构造,一层一层的构造完毕) 构造完成

5. 最后,初始化当前类的非static属性,再调用当前类的构造函数,完成所有初始化工作。

注意:

1、类中static部分是发生在类加载时期的,并且只初始化一次。因为类只加载一次,加载完后创建对象过程中不会再去初始化static部分的东西,所以之后根本不会再走那块初始化代码,又怎么初始化第二次呢?

2、static的优先级是高于main函数执行的,因为它是在类加载时期初始化。当static作用的东西都加载完了才执行main,当然main是第一个被使用的static方法,但是虚拟机只是找到这个方法的位置,并不会先去执行里面的内容。

2、对于类的普通成员属性初始化三个步骤:先全初始化为0,再用申明时候初始化值进行初始化,再调用构造函数进行初始化。

实例程序:(来源于Thinking in Java)

//: reusing/Beetle.java

// The full process of initialization.

import static net.mindview.util.Print.*;

class Insect {

private int i = 9;

protected int j;

Insect() {

print("i = " + i + ", j = " + j);

j = 39;

}

private static int x1 =

printInit("static Insect.x1 initialized");

static int printInit(String s) {

print(s);

return 47;

}

}

public class Beetle extends Insect {

private int k = printInit("Beetle.k initialized");

public Beetle() {

print("k = " + k);

print("j = " + j);

}

private static int x2 =

printInit("static Beetle.x2 initialized");

public static void main(String[] args) {

print("Beetle constructor");

Beetle b = new Beetle();

}

}/* Output:

static Insect.x1 initialized

static Beetle.x2 initialized //1.类加载和初始化静态x1,x2:只会初始化一次!

Beetle constructor //2.进入main函数

i = 9, j = 0

//3.new Beetle(),先初始化父类>申请父类内存>初始化为0>初始化i=9,j=0>调用Insect()构造函数>输出ij值>初始化j=39

Beetle.k initialized //4.初始化子类>申请子类内存>..>初始化k,输出改行>调用构造Beetle()>输出下面的k,j

k = 47

j = 39

*///:~

java简述对象的组合_Java程序运行和对象创建过程简述相关推荐

  1. java 启动加载顺序_Java 程序的加载运行过程 | 学步园

    为了叙述方便,我写了个小例子 class Three{ private static int s3 = getS3(); private int y = getY(); public Three(){ ...

  2. 导入Java文件还是class文件_java程序运行的时候,是把所有的class文件都加载到内存吗?还是用的什么加载什么?...

    这一块还没有深入了解,不敢误人子弟. 我知道的,虚拟机在运行的时候,会预先加载一个常用的class,比如java.lang包下面的. 至于你在程序中自己引用的class文件/jar包之类的,是有一个加 ...

  3. java生成cmd jar包_Java程序运行机制及cmd编译运行探究(二) cmd编译运行Java程序并打成jar包...

    目标:写一个RandomUtils.java工具类,返回一个随机数,并把这个类的字节码文件打成jar包 在Java运行机制及cmd编译运行探究(一)准备工作一文中,我总结了一部分要用到的cmd及编译运 ...

  4. Android字体占有内存,android随意创建字体对象引发的应用程序运行时占用内存过大...

    android随意创建字体对象引发的应用程序运行时占用内存过大 在实际开发android项目过程中,由于是初次设置android系统没有的字体,所以用到了一个外部文件FounderFineRoundS ...

  5. java导出jar包后,程序运行时读取图片、音乐资源文件

    java导出jar包后,程序运行时读取图片.音乐资源文件 运行时程序就可以把图片.音乐资源加载进入了 start jre/bin/java -jar 名称.jar

  6. java能够运行的原理_JAVA程序运行原理分析(一)

    作为JAVA的开发人员,需要知道JAVA是如何运行的,这个需要好好思考下. (一)class文件内容 class文件包含JAVA程序执行的字节码,也就是说程序的执行是通过class里面的内容进行执行的 ...

  7. java对象组合_java并发编程(三): 对象的组合

    对象的组合: 如何将现有的线程安全组件,组合成我们想要的更大规模的程序. 设计线程安全的类: 设计线程安全类的三个要素: 1.找出构成对象状态的所有变量: 2.找出约束状态变量的不变性条件: 3.建立 ...

  8. java运行慢_Java程序运行一段时间后越来越慢

    我有一个java程序,它是典型的机器学习算法,通过一些方程来更新某些参数的值: for (int iter=0; iter<1000; iter++) { // 1. Create many t ...

  9. java 程序运行出错_java 程序运行错误怎么办?

    展开全部 看是发生了什么错误,大多数错误都可以通过改写原编码来解决. 程序的错误可以抽象分为三32313133353236313431303231363533e78988e69d83313333656 ...

最新文章

  1. pandas语法乱、API多?你需要整理一下!|知乎讨论
  2. 二、创作网站 (三) Creating custom content types
  3. Android中使用File文件进行数据存储
  4. iOS iphone屏幕分析(岂止而大)
  5. raid配置ssd为缓存_超融合硬件选配推荐指南 | 第三期:SSD 与 HDD
  6. ant中的table行列不对齐问题,以及换行,隐藏等问题
  7. MySQL日期处理函数实现博客按年月份进行分组
  8. Unlock Music音乐解锁源码
  9. 视觉SLAM十四讲学习记录 第三讲
  10. 02325《计算机系统结构》自考复习重点目录
  11. openstreetmap_kubernetes中的openstreetmap tile服务器
  12. MATLAB实现混淆矩阵
  13. WXGA TFT和XGA TFT的区别
  14. 微信app支付功能-服务端的实现-python3版
  15. 什么是看门狗(watchdog)?看门狗有什么作用?
  16. android scrcpy 源代码分析,Scrcpy投屏原理浅析-设备控制篇
  17. ie开始屏蔽旧的java插件_IE将開始屏蔽旧版ActiveX控件
  18. 使用APICloud AVM框架开发预约应用
  19. 【第83期】10 款你不知道的 Linux 环境下的替代工具!
  20. excel如何将数字由文字格式转换为数字格式

热门文章

  1. LCAOSCF自洽场氟化氢HF斯莱特函数
  2. 神经网络初始化与集体无意识
  3. 深度学习机器学习大牛
  4. 机器学习中的评价指标--1[F,P,R]
  5. 【Matlab 控制】模仿绘制动态图像 保存动态图 GIF
  6. 3.11 程序示例--逻辑运算-机器学习笔记-斯坦福吴恩达教授
  7. STM32 基础系列教程 15 - SPI
  8. 【工具】云文档办公利器!腾讯文档好评!
  9. Linux数据报文接收发送总结3
  10. 示波器到底选择多大的带宽合适