我们都知道,创建对象是由 new关键字调用构造方法 返回类实例(实际上还可以通过反射来创建实例)。

例如 : Person jack = new Person();

这句话到底做了什么事情呢 ? 其实就是讲对象的初始化过程。

  • 1、 new 用到了Person.class,所以会先找到Person.class文件,并加载到内存中(用到类中的内容类就会被加载)
  • 2、执行该对象的static代码块(静态初始块)。(如果有的话,给Person.class类进行初始化)
  • 3、在堆内存中开辟空间,分配内存地址
  • 4、在堆内存中建立对象特有属性,并进行默认初始化
  • 5、对属性进行显示初始化(声明成员属性并赋值)
  • 6、执行构造块
  • 7、执行构造函数
  • 8、将内存地址赋值给栈内存中的jack变量

如下图:

下面我们来看两个案例

案例一

以下代码的输出结果是什么?


public class B {public static B t1 = new B();public static B t2 = new B();{System.out.println("构造块");}static {System.out.println("静态块");}public static void main(String[] args) {B t = new B();}
}

答案是:

构造块
构造块
静态块
构造块

答案分析:JVM先加载B这个类,初始化静态域(静态变量、静态块和静态方法,按照代码先后顺序初始化),先初始化t1,t2,所以先输出构造块 构造块;然后执行静态块,所以输出静态块;最后执行new B()输出构造块

案例二

一下代码的输出结果是什么?


public class B {static {i = 100;}public static int i = 1;public static void main(String[] args) {System.out.println(i);}
}

答案是:1

答案分析:静态变量是在类初始化时首先被加载的,JVM会去查找类中所有的静态声明,然后分配空间,注意这时候只是完成了地址空间的分配,还没有赋值,之后JVM会根据类中静态赋值(包括静态类赋值和静态块赋值)的先后顺序来执行。对于程序来说,就是先声明了int类型的地址空间,并把地址传递给了i,然后按照类中的先后顺序执行赋值动作,首先执行静态块中i=100,接着执行i=1,那最后的结果就是i=1了。

【JAVA基础篇】对象初始化过程相关推荐

  1. Java 父类子类的对象初始化过程

    转载自 Java 父类子类的对象初始化过程 摘要: Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: ...

  2. 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)

    菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...

  3. 菜鸟学习笔记:Java基础篇2(变量、运算符、流程控制语句、方法)

    菜鸟学习笔记:Java基础篇2 变量 基本概念 变量作用域 final关键字 运算符 算术运算符 比较运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 运算符优先级 Java三种流程控制语句 顺序 ...

  4. Java基础篇--设计模式

    目录 前言 设计模式 创建型模式 单例模式 工厂方法模式 抽象工厂模式 建造者模式 原型模式 结构型模式 适配器模式 桥接模式 组合模式 装饰模式 外观模式 亨元模式 代理模式 行为型模式: 访问者模 ...

  5. Android面试题Java基础篇

    Android面试题Java基础篇,由本人整理汇总,后续将继续推出系列篇,如果喜欢请持续关注和推荐,更多精彩内容可以关注微信公众号(Android高级编程):android-tech 系列文章目录: ...

  6. java基础篇---第一天

    今日开始在心中正式开始在培训班开始培训.一下是在培训的过程中发现自己在自学过的过程中发现的问题.这篇是java基础篇. 第一天 : 1)配置java环境变量 1.在系统变量中新建JAVA_HOME:j ...

  7. 【Java基础篇】封装(Encapsulation)

    [Java基础篇]封装(Encapsulation) 1. 封装含义 2. private(私有)关键字 3. 构造函数 3.1 什么是构造函数 3.2 构造函数的重载 3.3 构造函数的调用 3.4 ...

  8. 《Java 后端面试经》Java 基础篇

    <Java 后端面试经>专栏文章索引: <Java 后端面试经>Java 基础篇 <Java 后端面试经>Java EE 篇 <Java 后端面试经>数 ...

  9. Java基础篇--面向对象(Object Oriented)

    Java基础篇--面向对象(Object Oriented) 1. 面向对象概念 1.1 什么事面向对象 1.2 理解面向对象 1.3 面向对象的特点 1.4 面向对象开发设计特征 2. 类与对象 2 ...

  10. Java基础篇 学习笔记

    List item Java基础篇 学习笔记 java基础篇 第1章 计算机.程序和java概述 学习笔记 1.1什么是计算机 简单来说:计算机就是 ' 存储 ' 和 ' 处理 ' 数据的电子设备. ...

最新文章

  1. Udacity机器人软件工程师课程笔记(六)-样本搜索和找回-基于漫游者号模拟器-优化和样本找回
  2. Python开发笔记之正则表达式的使用
  3. linux嵌套字幕工具,Linux(NAS通用)下自动匹配射手字幕脚本
  4. 利用fstream进行文件拷贝测试
  5. 博弈之 取石子1——6)
  6. “已删除的应用” 流量高
  7. 一些软件设计的原则【转】——本来想自己总结,结果发现个更全的,
  8. Java使用TCP实现群聊 聊天室(多线程和tcp的使用)
  9. matlab 获取系统时间now,date
  10. springmvc是什么_当一个http请求来临时,SpringMVC究竟偷偷帮你做了什么?
  11. 现代软件工程系列 学生的精彩文章 (4) 为用户服务
  12. 1.Spring Boot入门
  13. centos7 zabbix
  14. 今天碰到的angular 中的一个小坑
  15. struts的体系结构
  16. [转]关于PSP的3.52 M33-2自制系统七大热点问题
  17. .doc文件不显示word图标
  18. Gossip费氏数列
  19. 台式计算机驱动程序未被安装,Win7 提示未能成功安装设备驱动程序,无法安装USB驱动程序的解决方法!...
  20. IDA 中怎么查看函数的调用关系

热门文章

  1. java实现短信上行源码_Java 发送短信验证码 示例源码
  2. c语言动态规划公共字符串,最长公共子串 C语言 动态规划
  3. 如何快速学好python语言_如何快速的学习Python语言
  4. mysql写偏斜_【MySQL】探究之常用SQL
  5. JFrog Artifactory 7.27 上传应用到私服和从maven私服下载制品
  6. linux环境安装LFTP_02
  7. 服务器漏洞处理_wildfly禁用https和8443端口
  8. unoconv 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件功能环境搭建
  9. 大事件后台管理系统开发实战(下)
  10. Java-异常03 自定义异常