类加载过程:

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

2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容

3, 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内

4, 加载静态内容:

4.1、把.class中的所有静态内容加载到方法区下的静态区域内

4.2、静态内容加载完成之后,对所有的静态变量进行默认初始化

4.3、所有的静态变量默认初始化完成之后,再进行显式初始化

4.4、执行静态代码块(注:静态代码块与静态变量显式初始化无先后顺序,与代码顺序相关,如静态代码块在上,则先加载代码块)

5,整个类的加载就完成了。

对象创建过程:

1, 在堆内存中开辟一块空间

2, 给开辟空间分配一个地址

3, 把对象的所有非静态成员加载到所开辟的空间下

4, 所有的非静态成员加载完成之后,对所有非静态成员变量进行默认初始化

5, 所有非静态成员变量默认初始化完成之后,调用构造函数

6, 在构造函数入栈执行时,分为两部分:先执行构造函数中的隐式三步,再执行构造函数中书写的代码

6.1、隐式三步:

1,执行super语句

2,对开辟空间下的所有非静态成员变量进行显式初始化

3,执行构造代码块(注:代码块与非静态成员变量显示初始化无先后顺序,与代码顺序相关,如代码块在上,则先加载代码块)

6.2、在隐式三步执行完之后,执行构造函数中书写的代码

7,在整个构造函数执行完并弹栈后,把空间分配的地址赋值给一个引用对象

总结类中能书写的成员

栈: 用来运行函数。可以存储局部信息

特点:先进后出

堆:用来存储实体(被new创建出来的)。

特点:

1,  每一个实体所开辟的空间都有一个地址

2,  每一个实体中存储的数据都有一个默认初始值

方法区:存放class和static。 方法区其实是由N多个小的区域构成。有存放非静态内容的非静态区域,还有存放静态内容的静态区域,还有存放常量的常量池 等

class  ABC

{

非静态成员变量

静态成员变量

非静态成员函数

静态成员函数

构造函数:ABC(...){...}

静态代码块: static {...}

构造代码块 :  {...}

}

图解调用过程:

父子类加载及创建对象过程代码实例:

  1. //子类
  2. public class Insect {
  3. private int i = printInit("Insect:i");
  4. protected int j;
  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 int printInit(String s) {
  18. System.out.println(s);
  19. return 47;
  20. }
  21.  
  22. }
  23. //父类
  24. public class Beetle extends Insect{
  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. public Beetle() {
  35. System.out.println(k);
  36. }
  37.  
  38.  
  39. public static void main(String[] args) {
  40. Beetle b = new Beetle();
  41. }
  42.  
  43. }

运行结果:

对象创建过程代码和注释:

  1. class Person {
  2. int age;
  3. Person(int age) {
  4. this.age = age;
  5. }
  6. }
  7. class Student extends Person {
  8. // 2,对开辟空间下的所有非静态成员变量进行显式初始化
  9. String school = "abc";
  10. Student(String school, int age) {
  11. // 1,执行super语句
  12. super(age);
  13. // 4、在隐式三步执行完之后,执行构造函数中书写的代码
  14. this.school = school;
  15. }
  16. {
  17. // 3,执行构造代码块
  18. System.out.println("Student code block");
  19. }
  20. }

java类加载、对象创建过程的更多相关文章

  1. Java中对象创建过程

    本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...

  2. Java中类加载过程和对象创建过程

    类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加 ...

  3. java基础---类加载和对象创建过程

    类中可以存在的成员: class A{ 静态成员变量: 非静态成员变量: 静态函数: 非静态函数: 构造函数 A(..){...} 静态代码块 static{...} 构造代码块 {...} } 类加 ...

  4. Java的对象初始化过程

    成员变量(字段)初始化顺序 在一个类里初始化的顺序是由成员变量在类里面的定义的顺序来决定的.即使成员变量大量散布于类的各个方法定义的中间,那些成员变量仍会在调用任何方法之前得以初始化,甚至在构造函数调 ...

  5. Java Object 对象创建的方式 [ 转载 ]

    Java Object 对象创建的方式 [ 转载 ] @author http://blog.csdn.net/mhmyqn/article/details/7943411 显式创建 有4种显式地创建 ...

  6. COM对象创建过程

    在客户端需要调用COM组件时,通常调用windowAPI函数: STDAPI CoCreateInstance( REFCLSID rclsid, //创建的Com对象的类标识符(CLSID) LPU ...

  7. 从一道面试题来认识java类加载时机与过程

    说明:本文的内容是看了<深入理解Java虚拟机:JVM高级特性与最佳实践>后为加印象和理解,便记录了重要的内容. 1  开门见山 以前曾经看到过一个java的面试题,当时觉得此题很简单,可 ...

  8. java类加载时机与过程

    转自:http://www.tuicool.com/articles/QZnENv 说明:本文的内容是看了<深入理解Java虚拟机:JVM高级特性与最佳实践>后为加印象和理解,便记录了重要 ...

  9. 从一道面试题来认识java类加载时机与过程【转】

    说明:本文的内容是看了<深入理解Java虚拟机:JVM高级特性与最佳实践>后为加印象和理解,便记录了重要的内容. 1  开门见山 以前曾经看到过一个java的面试题,当时觉得此题很简单,可 ...

随机推荐

  1. ClickHouse实战

    1.概述 最近有被留言关于ClickHouse的使用问题,今天笔者将为大家分享一下ClickHouse的安装细节和使用方法. 2.内容 首先安装环境如下所示: Linux:CentOS7 ClickH ...

  2. (总结)Linux下su与su -命令的本质(转)

    转载地址:http://www.ha97.com/4001.html 本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户 ...

  3. hdu 1027 Ignatius and the Princess II(正、逆康托)

    题意: 给N和M. 输出1,2,...,N的第M大全排列. 思路: 将M逆康托,求出a1,a2,...aN. 看代码. 代码: int const MAXM=10000; int fac[15]; i ...

  4. python进阶(22)pydantic--数据类型校验

    pydantic库的作用 pydantic库是一种常用的用于数据接口schema定义与检查的库. Pydantic 在运行时强制执行类型提示,并在数据无效时提供用户友好的错误信息. pydantic安 ...

  5. Cobar SQL审计的设计与实现

    背景介绍 Cobar简介 Cobar 是阿里开源的一款数据库中间件产品. 在业务高速增长的情况下,数据库往往成为整个业务系统的瓶颈,数据库中间件的出现就是为了解决数据库瓶颈而产生的一种中间层产品. 在 ...

  6. vue配置请求拦截器和响应拦截器

    首先确保我们已经设置的store.js进行值的存取,这时候我们需要配置请求和响应的拦截器设置 main.js import Vue from 'vue' import App from './App' ...

  7. k8s之mutating webhook + gin

    1.知识准备 1.Webhook 是一种用于接收准入请求并对其进行处理的 HTTP 回调机制 2.Webhook 接收来自apiserver的回调,对回调资源做一些校验.注入.修改元数据等工作 3.来 ...

  8. PTA7-2 愿天下有情人都是失散多年的兄妹

    呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚? 输入格式: 输入 ...

  9. ExtJS 去除水印

    在路径(根目录/ext/classic(或者modern)/theme-base/sass/etc/all.scss)文件中修改\(ext-trial: true !default; 为\)ext-t ...

  10. 1组-Alpha冲刺-3/6

    一.基本情况 队名:震震带着六菜鸟 组长博客:https://www.cnblogs.com/Klein-Wang/p/15544334.html 小组人数:7人 二.冲刺概况汇报 王业震 过去两天完 ...