Java对象的创建过程包括 类初始化(JVM类加载机制)和类实例化两个阶段。

一、Java对象创建时机

(1)使用new关键字创建对象

(2)反射创建对象

  使用Class类的newInstance方法

    Student student2 = (Student)Class.forName("Student类全限定名").newInstance();

  使用Constructor类的newInstance方法

    Constructor<Student> constructor = Student.class.getConstructor(Integer.class);

    Student stu3 = constructor.newInstance(123);

(3)使用Clone方法创建对象(实现Cloneable接口)

  无论何时我们调用一个对象的clone方法,JVM都会帮我们创建一个新的、一样的对象,特别需要说明的是,用clone方法创建对象的过程中并不会调用任何构造函数。

(4)使用(反)序列化机制创建对象(实现Serializable接口)

  当我们反序列化一个对象时,JVM会给我们创建一个单独的对象,在此过程中,JVM并不会调用任何构造函数。

二. Java 对象的创建过程

当一个对象被创建时,虚拟机就会为其分配内存来存放对象自己的实例变量及其从父类继承过来的实例变量(即使这些从超类继承过来的实例变量有可能被隐藏也会被分配空间)。

在为这些实例变量分配内存的同时,这些实例变量也会被赋予默认值(零值)。

主要涉及三种执行对象初始化的结构,分别是 实例变量初始化、实例代码块初始化、构造函数初始化。

编译器构造类的构造函数<init>()(按顺序执行):

  父类构造器

  实例变量初始化和实例代码块初始化相关代码

  本身构造函数

1、实例变量初始化和实例代码块初始化按照编程顺序来执行,不允许顺序靠前的实例代码块访问其后面定义的实例变量,但是可以赋值。

// 编译错误:代码块不可以访问其后定义的实例变量
public class InstanceInitializer {
{
j = i;
} private int i = 1;
private int j;
} // 没问题:代码块可以赋值其后定义的实例变量
public class InstanceInitializer {
{
j = 1;
} private int i = 1;
private int j;
}

2、每一个Java中的对象都至少会有一个构造函数,如果我们没有显式定义构造函数,那么它将会有一个默认无参的构造函数。

  Java强制要求所有对象(Object是Java的顶层对象,没有超类)构造函数的第一条语句必须是超类构造函数的调用语句或者是类中定义的其他的构造函数(super()/this()必须在第一句,且不能同时出现)。如果我们既没有调用其他的构造函数,也没有显式调用超类的构造函数,那么编译器会为我们自动生成一个对超类构造函数的调用

3、实例化一个类的对象的过程是一个典型的递归过程。

  首先实例化Object类,再依次对以下各类进行实例化,直到完成对目标类的实例化。

三、综合实例

// 父类
class Foo {
int i = 1; Foo() {
System.out.println(i);// -----------(1)
int x = getValue();
System.out.println(x);// -----------(2)
} {
i = 2;
} protected int getValue() {
return i;
}
} // 子类
class Bar extends Foo {
int j = 1; Bar() {
j = 2;
} {
j = 3;
} @Override
protected int getValue() {
return j;
}
} public class ConstructorExample {
public static void main(String... args) {
Bar bar = new Bar();
System.out.println(bar.getValue());// -----------(3)
}
} /*
* Output: 2 0 2
*/ //Foo类构造函数的等价变换:
Foo() {
i = 1;
i = 2;
System.out.println(i);
int x = getValue();// 在执行Foo的构造函数的过程中,由于Bar重载了Foo中的getValue方法,所以其调用的是Bar的getValue方法
System.out.println(x);
} //Bar类构造函数的等价变换
Bar() {
Foo();
j = 1;
j = 3;
j = 2
}

参考资料:

深入理解Java对象的创建过程:类的初始化与实例化

Java类实例化原理的更多相关文章

  1. Java类实例化时候的加载顺序

    面试试题中经常考到此问题,现在做进一步的总结: public class Student { public Student(String name){ System.out.println(name) ...

  2. java类什么时候加载?,加载类的原理机制是怎么样的?

    java类什么时候加载?,加载原理机制是怎么样的?   答: 很多人都不是很清楚java的class类什么时候加载在运行内存中,其实类加载的时间是发生在一下几种情况: 1.实例化对象时,就像sprin ...

  3. Java类的实例化的初始化过程

    A a = new A(); new 创建对象过程: 1.类加载     代码验证 2.给对象在内存(堆)中分配空间(给属性赋值): 3.属性赋默认值: byte,short.int,long -&g ...

  4. 一图详解java-class类文件原理

    摘要:徒手制作一张超大的类文件解析图,方便通过浏览这个图能马上回忆起class文件的结构以及内部的指令. 本文分享自华为云社区<[读书会第十二期]这可能是全网"最大".&qu ...

  5. 创建Java类并实例化的基本过程

    package com.sanguosha.java; /* * 面向对象实现的过程 * 1.创建类并设计类的成员(成员变量即属性and成员方法即方法) * 2.通过类来创建类的对象,也称类的实例化 ...

  6. 创建java类并实例化类对象

    创建java类并实例化类对象例一1.面向对象的编程关注于类的设计2.设计类实际上就是设计类的成员3.基本的类的成员,属性(成员变量)&方法 面向对象思想的落地法则一:1.设计类,并设计类的成员 ...

  7. Java类载入器原理分析

    一:Java虚拟机中能够安装多个类载入器,系统默认是三个基本的类载入器: Bootstrap  ExtClassLoader  AppClassLoader 类载入器也是Java类.由于其它Java类 ...

  8. Java类的定义及其实例化

    如果你不了解类和对象的概念,请猛击这里:Java类和对象的概念 类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: public cl ...

  9. Java类的定义与类的实例化

    目录 Java类的定义与类的实例化 类的定义 定义一个简单的类 定义一个成员变量 定义一个方法 定义一个构造器 类的实例化 创建对象及使用对象: 创建对象的过程在内存中的表现 Java类的定义与类的实 ...

随机推荐

  1. 【洛谷 P2147】 [SDOI2008]洞穴勘测(LCT)

    题目链接 LCT裸题.. #include <cstdio> #define R register int #define I inline void #define lc c[x][0] ...

  2. 基于canvas实现的fontawesome动态图标

    由于还没有全部实现,实现了一些demo,demo地址在 https://github.com/jiangzhenfei/canvas-fontawesome 实现了动态loading 实现动态电池充电 ...

  3. Sqlmap与burpsuite动态更新某些参数

    有如下注入点: http://localhost/id=1&order_nu=1 情况说明: id为注入点,  每一次注入时, order_nu不能跟上次的一样(假说这个order_nu为一个 ...

  4. tracert和traceroute使用

    Traceroute提取发 ICMP TTL到期消息设备的IP地址并作域名解析.每次 ,Traceroute都打印出一系列数据,包括所经过的路由设备的域名及 IP地址,三个包每次来回所花时间. 转自 ...

  5. RAID总结

    RAID-0: 这种模式若使用相同型号容量的磁盘来组成效果最佳.这种模式RAID会先将磁盘切出等量的区块chunk,当文件要存入RAID时先按照chunk的大小切割好,再依次存放到各个磁盘中去,由于磁 ...

  6. 19.Remove Nth Node From End of List---双指针

    题目链接 题目大意:删除单链表中倒数第n个节点.例子如下: 法一:双指针,fast指针先走n步,然后slow指针与fast一起走,记录slow前一个节点,当fast走到链表结尾,slow所指向的指针就 ...

  7. curl 发送请求的时候报错

    AWS HTTP error: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see ...

  8. java版云笔记(八)之关联映射

    Mybatis关联映射 通过数据库对象之间的关联关系,反映到到实体对象之间的引用. 加载多个表中的关联数据,封装到我们的实体对象中. 当业务对数据库进行关联查询. 关联 <association ...

  9. Codeforces 821C Okabe and Boxes(模拟)

    题目大意:给你编号为1-n的箱子,放的顺序不定,有n条add指令将箱子放入栈中,有n条remove指令将箱子移除栈,移出去的顺序是从1-n的,至少需要对箱子重新排序几次. 解题思路:可以通过把栈清空表 ...

  10. 《HBase权威指南》学习笔记

    第一章  简介 背景: GFS:集群存储海量数据,数据在节点间冗余复制,即使一台存储服务器发生故障,也不会影响可用性. GFS的缺点:适合存储少许非常大的文件,而不适合存储大量小文件,因为文件的元数据 ...