Java笔记(十二)……类中各部分加载顺序及存放位置问题
什么时候会加载类
使用到类中的内容时加载,三种情况:
- 创建对象:new StaticDemo();
- 使用类中的静态成员:StaticCode.num = 9; StaticCode.getNum();
- 在命令行中运行:java StaticDemo
类所有内容加载顺序及内存中的存储位置
语句分析
Person p = new Person(“Shawn”,20);
- 在栈内存中,开辟main函数的空间,建立main函数的变量p。
- 加载类文件:因为new要用到Person.class,所以要先从硬盘中找到Person.class类文件,并加载到内存中。
- 加载类文件时,除了非静态成员变量不会被加载,其他的都会被加载。
- 静态成员变量(类变量)------>方法区的非静态部分
- 静态方法------>方法区的静态部分
- 静态代码块------>方法区的静态部分
- 构造代码块------>方法区的静态部分
- 注意:在Person.class文件加载时,静态方法和非静态方法都会被加载到方法区中,只不过要调用非静态方法时需要先实例化一个对象,对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,所以才会让所有对象共享这些非静态方法
- 执行类中的静态代码块:如果有的话,对Person.class类进行初始化。
- 开辟空间:在堆内存中开辟空间,分配内存地址。
- 默认初始化:在堆内存中建立对象的特有属性,并进行默认初始化。
- 显式初始化:对属性进行显示初始化。
- 构造代码块:执行类中的构造代码块,对对象进行构造代码块初始化。
- 构造函数初始化:对对象进行对应的构造函数初始化。
- 将内存地址赋值给栈内存中的变量p。
p.setName(“Feng”);
- 在栈内存中开辟setName()方法的空间,里面有:对象的引用this,临时变量name
- 将p的值赋值给this,this就指向了堆中调用该方法的对象
- 将"Feng"赋值给临时变量name
- 将临时变量的值赋值给this指向的name
Person.showCountry();
- 在栈内存中,开辟showCountry()方法的空间,里面有:类名的引用Person
- Person指向方法区中的Person类的静态方法区的地址
- 调用静态方法区中的country,并输出
- 注意:
- 要想使用类中的成员,必须调用
- 通过什么调用?
- 类名,this,super。
静态代码块、构造代码块和构造函数的区别
静态代码块:用于给类初始化,类加载时就会被加载执行,只执行一次。
构造代码块:用于给对象初始化,只要建立对象该部分都会执行,优先于构造函数执行,每个对象只执行一次。
构造函数:给对象的对象初始化,建立对象是,选择相应的构造函数初始化对象
创建对象时,三者被加载执行顺序是:静态代码块--->构造代码块--->构造函数
1: class Person
2: {
3: //非静态变量,对象建立时存在于堆中
4: private int age = 0;
5: //静态变量,类加载时存在于方法区的静态部分
6: private static String country = "cn";
7: //静态代码块,类加载时,存在于方法区的静态部分
8: static
9: {
10: System.out.println("class load");
11: }
12: //构造代码块,类加载时,存在于方法区的静态部分
13: {
14: System.out.println("object load");
15: }
16:
17: Person(int age)
18: {
19: this.age = age;
20: }
21:
22: //静态方法,类加载时存在于方法区的静态部分
23: public static void showCountry()
24: {
25: System.out.println(country);
26: }
27: //非静态方法,类加载时存在于方法区的非静态部分
28: void print()
29: {
30: System.out.println(age);
31: }
32: }
总结
类加载
下列被加载:
- 类变量(静态成员变量)
- 静态和非静态方法
- 静态代码块和构造代码块
下列被执行:
- 类变量的默认初始化和显式初始化
- 静态代码块
对象加载
下列被加载:
- 如果类第一次被用到,则先加载上面类的相关内容
- 非静态成员变量
下列被执行:
- 非静态成员变量的默认初始化和显式初始化
- 如果类第一次被用到,则先执行上面类的相关内容
- 构造代码块
- 构造函数
存储位置

Java笔记(十二)……类中各部分加载顺序及存放位置问题的更多相关文章
- Java 类中各成分加载顺序 和 内存中的存放位置
参加一个笔试,有一个关于类的静态代码块.构造代码块.构造函数的执行顺序的问题.不太清楚,网上百度了一下.在这里记录一下. 一.什么时候会加载类?使用到类中的内容时加载:有三种情况1.创建对象:new ...
- java类中属性的加载顺序,以及内存分配情况介绍
看下面例子及说明: /** 假如有外部类调用了该类,代码为:new StaticTest(); 那么下面是类属性的加载顺序 */ public class StaticTest{ public int ...
- 详解web.xml中元素的加载顺序
一.背景 最近在项目中遇到了启动时出现加载service注解注入失败的问题,后来经过不懈努力发现了是因为web.xml配置文件中的元素加载顺序导致的,那么就抽空研究了以下tomcat在启动时web.x ...
- 如果你还不知道如何控制springboot中bean的加载顺序,那你一定要看此篇
1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题.在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功 ...
- 服务器启动时Webapp的web.xml中配置的加载顺序
一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...
- 服务器启动时Webapp的web.xml中配置的加载顺序(转载)
一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...
- SpringBoot中的bean加载顺序
https://www.dazhuanlan.com/2019/10/22/5daebc5d16429/ 最近在做传统Spring项目到SpringBoot项目迁移过程中,遇到了一些bean加载顺序的 ...
- Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API
不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...
- 2、手把手教你Extjs5(二)项目中文件的加载过程
上一节中用sencha工具自动创建了一个项目,并且可以在浏览器中查看.现在我们来看看js类加载过程.如下图所示: 1、首先:浏览器中输入 localhost:1841 ,调用 index.html; ...
随机推荐
- Makefile 多目录自动编译
适用于多目录结构 C 工程自动编译. makefile 分成三类: 1. 工程根目录 makefile : 这个makefile执行分成两个阶段 a)递归进入每个子目录, 逐个执行子目录里面的 ma ...
- 说说对C语言指针的理解
指针困扰了一些学习编程的人,或许你的老师会告诉你,指针比较难理解. 我当时被老师的话唬住所以学习指针那章的时候都没心情听课.(说得像讲别的内容时我听了似的,开玩笑) 导致了学习链表的时候各种卧槽. * ...
- 全面认识UML类图元素
本节和大家一起学习一下UML类图元素,类图能出色地表示继承与合成关系.为了将UML类图作为一种高效的沟通工具使用,开发者必须理解如何将类图上出现的元素转换到Java中.请看本节详细介绍. 全面认识UM ...
- Extjs 更新数据集Ext.PagingToolbar的start参数重置的处理
问题:当翻页后,比如当前是第二页,start参数此时是5(初始为0),当切换左侧分类时,我们期望的是从所选分类下明细记录的第一条开始显示,结果发现不是这样,依然是从新数据的第二页开始显示,就是说ext ...
- Win8.1设置窗口背景颜色为护眼色
更改注册表 window+R --->输入regedit(点击确定后进入注册表编辑器) 需要修改以下两个地方,重启电脑生效: [HKEY_CURRENT_USER\Control Panel\C ...
- pywinauto简单介绍
Pywinauto是基于Python开发的,用于自动化测试的脚本模块,主要操作于Windows标准图形界面.它可以允许你很容易的发送鼠标.键盘动作给Windows的对话框和控件. 其中,最主要功能为对 ...
- DB天气app冲刺第七天
今天估计得分应该是最差的了. 今天因为完全没准备所以在界面UI上面根本就是相当于没弄.结果今天的各组报告里自己做得很不好.不过好在只是项目的中间期,不碍大事. 今天也完成了任务.可以说超额了也.因为吃 ...
- C#基础|面向对象之继承
面向对象的世界 在现实的世界里,发现事物可以进行分类,并且各个分类中又有这关系. 在面向对象的世界里,人们用类来模拟现实世界中的各种关系. 从大的范围来说,人属于人类,如果按照不同的身份将人类进行 ...
- 转:Java Annotation详解
转载自:http://william750214.javaeye.com/blog/298104 元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致 ...
- [转].NET程序在windows操作系统上独立运行的技术要点
发现一个不错的网站,转载一篇文章方便查看 转自 http://www.linuxdot.net/bbsfile-3354 ===================================== ...