Java 对象创建过程

在某些项目中,会使用到静态块,构造器中初始化其他对象。。。深刻理解了java类初始化过程,这些将不在是问题。

那java对象的步骤是什么呢?

假设现在有People类,未显示继承任何其他类,初始化过程是这样的。

1 java 解释器必须查找类路径,以定位People.class文件。在首次创建对象时(构造器是静态方法),或people类的静态方法/静态域首次被访问时。

2 载入People.class,静态初始化的所有动作都会执行,且静态初始化只在Class对象首次加载的时候进行一次。

3 当使用new People() 创建对象的时候,首先将在堆上为对象分配足够的存储空间。

4将存储空间初始化为二进制的零。

4 执行所有出现于属性定义处的初始化动作。

5 执行构造器。

看一个实例:

public class Bowl {
    Bowl(int marker) {
        System.out.println("Bowl (" + marker + ")");
    }

    void f1(int marker) {
        System.out.println("f1 (" + marker + ")");
    }

}
public class Table {
    static Bowl bowl1 = new Bowl(1);

    Table() {
        System.out.println("Table()");
        bowl2.f1(1);
    }

    void f2(int marker) {
        System.out.println("f2(" + marker + ")");
    }

    static Bowl bowl2 = new Bowl(2);

}
public class Cupboard {
    Bowl bowl3 = new Bowl(3);
    static Bowl bowl4 = new Bowl(4);

    Cupboard() {
        System.out.println("Cupboard()");
        bowl4.f1(2);
    }

    void f3(int marker) {
        System.out.println("f3(" + marker + ")");
    }

    static Bowl bowl5 = new Bowl(5);

}
public class StaticInitialization {
    public static void main(String[] args) {
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        table.f2(1);
        cupboard.f3(1);
    }

    static Table table = new Table();
    static Cupboard cupboard = new Cupboard();

}

运行结果如下:

初始化分析如下:

时间: 2024-10-04 02:02:42

Java 对象创建过程的相关文章

Java对象创建过程补遗

一.static修饰的东东是属于这个类的,是所有的该类的实例共享的,因此它们的初始化先于实例对象的初始化. 二.Java中没有静态构造方法,但是有静态代码块.当类中同时存在静态代码块和静态成员变量声明语句时,它们谁先执行? 答:按照类中定义的从上到下顺序,谁在前面谁先执行. 三.当类中同时存在非静态代码块和非静态成员变量声明语句时,它们谁先执行? 答:按照类中定义的从上到下顺序,谁在前面谁先执行. 四.含有赋值的非静态成员变量声明语句,如 int v=4,其实这个语句的执行要分成两步进行.首先创

Java对象创建过程

假设有个名为Dog的类 1.当首次创建型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件. 2.然后载入Dog.class(这将创建一个Class对象),有关静态初始化的动作都会执行.因此,静态初始化只在Class对象首次加载的时候进行一次. 3.当你用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间. 4.这块存储空间会被清零,这就自动地将Dog中的所有基本类型数据设置

Java中对象创建过程

本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过. 2.为新生对象分配内存 对象所需内存的大小在类加载完成后便可以完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来.划分的方法主要有两种: a.指针碰撞 如果java堆中内存是绝对规整的,所有用过的内存都放在一边,未使用的内存放在另一

深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式

内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的时候,首先会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号代表的类是否被加载.解析并初始化.如果没有完成这个过程,则必须执行相应类的加载. (二)在堆上为对象分配空间.对象需要的空间大小在类加载完成后便能确定.之后便是在堆上为该对象分配固定大小的空间.分配的方式也有两种:

深度理解java虚拟机读书笔记(二)HotSpot Java对象创建,内存布局以及访问方式

内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的时候,首先会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号代表的类是否被加载.解析并初始化.如果没有完成这个过程,则必须执行相应类的加载. (二)在堆上为对象分配空间.对象需要的空间大小在类加载完成后便能确定.之后便是在堆上为该对象分配固定大小的空间.分配的方式也有两种:

Java对象创建阶段的代码调用顺序

在创建阶段系统通过下面的几个步骤来完成对象的创建过程 为对象分配存储空间 开始构造对象 从超类到子类对static成员进行初始化 超类成员变量按顺序初始化,递归调用超类的构造方法 子类成员变量按顺序初始化,子类构造方法调用 本文重点演示第三步到第五步: Grandpa类 1 package com.xinye.test; 2 3 public class Grandpa { 4 { 5 System.out.println("执行Grandpa的普通块"); 6 } 7 static

Java对象创建的过程及对象的内存布局与访问定位

这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等. 1.对象创建的过程 类加载.解析.初始化:虚拟机遇到new时先检查此指令的参数是否能在常量池中找到类的符号引用,并检查符号引用代表的类是否被加载.解析.初始化,若没有则先进行类加载. 对象内存分配:类加载检查通过后,虚拟机为新生对象分配内存,对象所需内存大小在类加载完成后便可完全确定.分配内存的任务等同于从堆中分出一块确定大小的内存. 根据内存是否规整(即用的放一边,空闲的放另一边,是否如此与所使用的垃圾

【深入理解Java虚拟机】Java内存区域模型、对象创建过程、常见OOM

本文内容来源于<深入理解Java虚拟机>一书,非常推荐大家去看一下这本书.最近开始看这本书,打算再开一个相关系列,来总结一下这本书中的重要知识点.呃呃呃,说好的那个图片请求框架呢~  不要急哈,因为这个请求框架设计的内容还是比较广的,目前业余时间正在编写当中,弄好了之后就会放上来.在完成之前,咱还是先来学习一下其他知识. 1.内存模型 java虚拟机在执行java程序的过程中会把它说管理的内存划分为若干个不同的数据区域,如下图所示: 图片来源于网络 (1)程序计数器(Program Count

读《jvm虚拟机》- 对象创建过程

java是面向对象的语言,与对象息息相关, 无时无刻都在创建对象, 对于创建对象,最熟悉的就是new 一个对象出来. Object obj = new Object(); 那么这个new 的过程在虚拟机之中又是怎么实现的呢? 通过阅读<JVM虚拟机>2.3.1对象的创建,简单总结了一下对象创建的过程. 个人见解: 1.虚拟机接收new指令 2.虚拟机接收new指令,检查类加载情况: 当虚拟机遇到一个new指令的时候,首先会去检查该指令中的参数,看是否能在常量池中定位到一个类的符号引用. ps: