java基础---类加载和对象创建过程
类中可以存在的成员:
class A{
静态成员变量;
非静态成员变量;
静态函数;
非静态函数;
构造函数 A(..){...}
静态代码块 static{...}
构造代码块 {...}
}
类加载过程:
1、JVM会先去方法区中找有没有类对应的.class存在,如果有,就直接使用;如果没有,就把对应类的.class加载到方法区;
2、将.class加载到方法区的时候,分为两部分,首先将非静态内容加载到方法区的非静态区域内;
3、再将静态内容加载到方法区的静态区域内,加载完成后,对所有的静态成员变量进行默认初始化;
4、所有静态成员变量默认初始化后,进行显示赋值;再执行静态代码块;(执行静态代码块和静态成员变量显示赋值无先后顺序,与代码顺序有关,谁在前面先执行谁)
5、如果有继承关系,加载子类的时候会先加载父类,在加载子类。
对象创建过程:
1、对象创建首先会在堆内存中开辟一块空间,并分配一个地址;
2、将对象的所有非静态成员加载到开辟的空间下,并为所有非静态成员变量进行默认初始化;
3、调用构造函数进栈执行,在执行构造函数的时候,首先会执行构造函数中的隐式三步,再执行构造函数中的代码;
隐式三步:
1、执行super语句,调用父类的构造函数;
2、对所有非静态成员变量进行显示赋值;
3、执行构造代码块;(非静态成员变量显示赋值和执行构造代码块无先后顺序,由代码顺序决定,谁在前先执行谁);
4、执行完隐式三步后,再执行构造函数中的代码,代码执行完后弹栈;
5、将堆内存中开辟的空间地址赋值给一个引用对象,对象创建完成。
下面用一段代码来验证一下类加载和对象创建过程(转载自某位大牛):
//父类
public class Insect {
private int i = printInit("Insect:i");
protected int j; protected static int x1 = printInit("static Insect.x1 initialized");
static{
System.out.println("Insect静态代码块");
x1=80;
}
Insect() {
System.out.println("基类构造函数阶段: i = " + i + ", j = " + j);
j = 39;
System.out.println(x1);
} static int printInit(String s) {
System.out.println(s);
return 47;
} }
//子类
public class Beetle extends Insect{
{
k=90;
}
private int k = printInit("Beetle.k initialized"); protected static int x2 = printInit("static Beetle.x2 initialized"); public Beetle() {
System.out.println(k);
} public static void main(String[] args) {
Beetle b = new Beetle();
} }
运行结果:

java基础---类加载和对象创建过程的更多相关文章
- java类加载、对象创建过程
类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加 ...
- Java内存区域与对象创建过程
一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...
- Java中类加载过程和对象创建过程
类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加 ...
- Java中对象创建过程
本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...
- Java基础-类加载机制与自定义类Java类加载器(ClassLoader)
Java基础-类加载机制与自定义类Java类加载器(ClassLoader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于类加载器的概念和分类我就不再废话了,因为我在之前的笔 ...
- Java基础4-面向对象概述;super();this()
昨日内容回顾 java基本数据类型: byte : 一个字节,-128 ~ 127 = 256 short : 两个字节, -32768 ~ 32767 int : 四个字节, long : 八个字节 ...
- Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)
Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...
- Java基础-IO流对象之字节流(Stream)
Java基础-IO流对象之字节流(Stream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在前面我分享的笔记中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现 ...
- 深入理解Java虚拟机(二)——HotSpot对象创建、内存、访问
对象的创建 虚拟机遇到一条字节码new指令时,开始对象创建过程. 首先去检查这个指令的参数是否能在常量池定位到一个类的符号引用: 检查这个符号引用代表的类是否已被加载.解析和初始化,如果没有就必须执行 ...
随机推荐
- 2038. [国家集训队]小Z的袜子【莫队】
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只 ...
- vue 项目项目启动时由于EsLint代码校验报错
今天在编写好vue项目代码时,在命令行输入npm start的时候出现了如下图所示的一大堆错误: 在网上查找资料说是缺少EsLint配置文件的问题,最终找到一篇由 hahazexia 编写的一篇博客文 ...
- _viewstart.cshtml的作用
在ASP.NET MVC 3.0及更高版本中,用Razor模板引擎新建项目后,Views目录下会出现一个这样的文件:_ViewStart.cshtml. _viewstart.cshtml的作用 1. ...
- 创建ROS工程結構
图像化显示目录工程结构:tree $ sudo apt install tree 1.创建ROS工作空间 $ mkdir -p catkin_ws/src # Create mutil-level d ...
- oracle 基本知识点
//创建临时表空间create temporary tablespace test_temp tempfile 'E:\oracle\product\10.2.0\oradata\testserver ...
- ping不通linux服务器排查
很久没启动linux了,今天打开试了下 ssh root@192.168.229.128 ping 一直超时 老规矩挨着来排查 检查网络设备器改为Net 模式 重启网络服务 service netw ...
- PAT乙级1010
1010 一元多项式求导 (25 分) 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为nxn−1.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不 ...
- js判断设备信息,安卓、ios、还是pc端
前端开发获取设备信息的代码if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { window.location.href =" ...
- dpkg安装失败解决过程
终于好了.搞到转钟3点都没搞定,耽误不少时间. 执行sudo port install dpkg 报错如下Error: org.macports.build for port gmp return ...
- iOS10--消息通知的基本使用
官方将通知单独放在了UserNotifications.framework,使用时需要导入框架.UserNotifications.framework主要类文件: UNCalendarNotifica ...