Java中类加载过程和对象创建过程
类加载过程:
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 {...}
构造代码块 : {...}
}
图解调用过程:
对象创建过程代码和注释:
- class Person {
- int age;
- Person(int age) {
- this.age = age;
- }
- }
- class Student extends Person {
- // 2,对开辟空间下的所有非静态成员变量进行显式初始化
- String school = "abc";
- Student(String school, int age) {
- // 1,执行super语句
- super(age);
- // 4、在隐式三步执行完之后,执行构造函数中书写的代码
- this.school = school;
- }
- {
- // 3,执行构造代码块
- System.out.println("Student code block");
- }
- }
Java中类加载过程和对象创建过程的更多相关文章
- Java中对象创建过程
本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...
- java基础---类加载和对象创建过程
类中可以存在的成员: class A{ 静态成员变量: 非静态成员变量: 静态函数: 非静态函数: 构造函数 A(..){...} 静态代码块 static{...} 构造代码块 {...} } 类加 ...
- java类加载、对象创建过程
类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加 ...
- COM对象创建过程
在客户端需要调用COM组件时,通常调用windowAPI函数: STDAPI CoCreateInstance( REFCLSID rclsid, //创建的Com对象的类标识符(CLSID) LPU ...
- 【JAVA零基础入门系列】Day11 Java中的类和对象
今天要说的是Java中两个非常重要的概念--类和对象. 什么是类,什么又是对象呢?类是对特定集合的概括描述,比如,人,这个类,外观特征上,有名字,有年龄,能说话,能吃饭等等,这是我们作为人类的相同特征 ...
- 深入理解Java中的不可变对象
深入理解Java中的不可变对象 不可变对象想必大部分朋友都不陌生,大家在平时写代码的过程中100%会使用到不可变对象,比如最常见的String对象.包装器对象等,那么到底为何Java语言要这么设计,真 ...
- java 中类加载器
jar 运行过程和类加载机制有关,而类加载机制又和我们自定义的类加载器有关,现在我们先来了解一下双亲委派模式. java 中类加载器分为三个: BootstrapClassLoader 负责加载 ${ ...
- Java程序设计基础笔记 • 【第7章 Java中的类和对象】
全部章节 >>>> 本章目录 7.1 理解类和对象 7.1.1 对象 7.1.2 抽象与类 7.1.3 类与对象的关系: 7.2 Java中的类和对象 7.2.1 类的定义 ...
- Java学习笔记十三:Java中的类和对象
Java中的类和对象 一:什么是对象: 总的来说就是"万物皆对象",客观存在的事物皆为对象.是计算机所关注的具体信息. 对象(object)是一件事.一个物体.一个名词,或可以获得 ...
随机推荐
- java编译通过,为什么运行却提示找不到或无法加载主类?
java编译通过,为什么运行却提示找不到或无法加载主类? https://www.zhihu.com/question/36537093 这边提供一个关于程序中含有package关键字,使用“终端”运 ...
- CORS跨域
一:简介 为什么会出现跨域问题? 受同源策略影响,不同域名之间不可以进行访问.同源策略(Same-Origin Policy).所谓的 同源 是指域名.协议.端口号 相同.不同的客户端脚本(JavaS ...
- 分库分表之后全局id怎么生成
数据库自增id: 这个就是说你的系统里每次得到一个id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个id.拿到这个id之后再往对应的分库分表里去写入. 这个方案的好 ...
- Lazy<T> 延迟加载
namespace ConsoleAppTest { class Program { static void Main(string[] args) { Lazy<Student> stu ...
- (转载)Memcached和Redis简介
转载自: Memcached和Redis简介 博主的Redis资料列表.http://www.cnblogs.com/programlearning/category/1003158.html 前言: ...
- Typescript知识梳理
概述 TypeScript简称TS,具有类型系统,且是JavaScript的超集. 它可以编译成普通的JavaScript代码.TypeScript支持任意浏览器,任意环境,任意系统并且是开源的.通过 ...
- libsecp256k1 与 openssl ecdsa
1. 历史 区块链节点在接收到的用户发送的交易时,首先会验证交易所涉及utxo的可用性.方法是验证用户签名的合法性,涉及的签名算法就是secp256k1,一种椭圆曲线加密算法. 长期以来,实现了该算法 ...
- jenkins(2): jenkins定时构建项目
参考:http://blog.sina.com.cn/s/blog_b5fe6b270102v7xo.html https://blog.csdn.net/xueyingqi/article/deta ...
- es6 promise对象
function next(){ return new Promise( function( resolve, reject ){ var num =7 // Math.floor( Math.ran ...
- javaNIO的总结
放大1.5倍查看 使用NIO对文件进行COPY操作 public class TestNIOCopyFile { public static void main(String[] args) thro ...