浅谈Java 类中各成分加载顺序和内存中的存放位置
发布时间 - 2026-01-10 23:11:43 点击率:次一、什么时候会加载类?

使用到类中的内容时加载:有三种情况
1.创建对象:new StaticCode();
2.使用类中的静态成员:StaticCode.num=9; StaticCode.show();
3.在命令行中运行:java StaticCodeDemo
二、类所有内容加载顺序和内存中的存放位置
利用语句进行分析:
1.Person p=new Person("zhangsan",20);
该句话所做的事情:
1.在栈内存中,开辟main函数的空间,建立main函数的变量 p。
2.加载类文件:因为new要用到Person.class,所以要先从硬盘中找到Person.class类文件,并加载到内存中。
加载类文件时,除了非静态成员变量(对象的特有属性)不会被加载,其它的都会被加载。
记住:加载,是将类文件中的一行行内容存放到了内存当中,并不会执行任何语句。---->加载时期,即使有输出语句也不会执行。
静态成员变量(类变量)----->方法区的静态部分
静态方法 ----->方法区的静态部分
静态代码块 ----->方法区的静态部分
非静态方法(包括构造函数)----->方法区的非静态部分
构造代码块 ----->方法区的静态部分
注意:
在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象,
对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,
所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。
3.执行类中的静态代码块:如果有的话,对Person.class类进行初始化。
4.开辟空间:在堆内存中开辟空间,分配内存地址。
5.默认初始化:在堆内存中建立 对象的特有属性,并进行默认初始化。
6.显示初始化:对属性进行显示初始化。
7.构造代码块:执行类中的构造代码块,对对象进行构造代码块初始化。
8.构造函数初始化:对对象进行对应的构造函数初始化。
9.将内存地址赋值给栈内存中的变量p。
2.p.setName("lisi");
1.在栈内存中开辟setName方法的空间,里面有:对象的引用this,临时变量name
2.将p的值赋值给this,this就指向了堆中调用该方法的对象。
3.将"lisi" 赋值给临时变量name。
4.将临时变量的值赋值给this的name。
3.Person.showCountry();
1.在栈内存中,开辟showCountry()方法的空间,里面有:类名的引用Person。
2.Person指向方法区中Person类的静态方法区的地址。
3.调用静态方法区中的country,并输出。
注意:要想使用类中的成员,必须调用。通过什么调用?有:类名、this、super
三、静态代码块、构造代码块和构造函数的区别
静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。
构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。
构造函数: 给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。
创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数
class Person
{
private String name;
private int age=0;
private static String country="cn";
Person(String name,int age)
{
this.name=name;
this.age=age;
}
static
{
System.out.println("静态代码块被执行");
}
{ System.out.println(name+"..."+age); }
public void setName(String name)
{
this.name=name;
}
public void speak()
{
System.out.println(this.name+"..."+this.age);
}
public static void showCountry()
{
System.out.println("country="+country);
}
}
class StaticDemo
{
static
{
System.out.println("StaticDemo 静态代码块1");
}
public static void main(String[] args)
{
Person p=new Person("zhangsan",100);
p.setName("lisi");
p.speak();
Person.showCountry();
}
static
{
System.out.println("StaticDemo 静态代码块2");
}
}
输出结果:
StaticDemo 静态代码块1
StaticDemo 静态代码块2
静态代码块被执行
null...0 //构造代码块
lisi...100 //speak()
country=cn //showCountry()
以上这篇浅谈Java 类中各成分加载顺序和内存中的存放位置就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# java类加载顺序
# 基于Java中字符串内存位置详解
# java 字符串内存分配的分析与总结(推荐)
# 浅谈java+内存分配及变量存储位置的区别
# 解决Java导入excel大量数据出现内存溢出的问题
# Java实现获取cpu、内存、硬盘、网络等信息的方法示例
# 详解Java内存泄露的示例代码
# 详解Java字符串在内存中的存储位置
# 加载
# 类中
# 区中
# 给大家
# 要先
# 就会
# 什么时候
# 希望能
# 要想
# 要用
# 会让
# 时就
# 所做
# 这篇
# 句话
# 浅谈
# 所有内容
# 进行分析
# 小编
# 命令行
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
图册素材网站设计制作软件,图册的导出方式有几种?
海南网站制作公司有哪些,海口网是哪家的?
Laravel怎么实现验证码(Captcha)功能
Bootstrap整体框架之CSS12栅格系统
Laravel如何实现一对一模型关联?(Eloquent示例)
如何快速搭建高效简练网站?
php打包exe后无法访问网络共享_共享权限设置方法【教程】
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何在云主机快速搭建网站站点?
python中快速进行多个字符替换的方法小结
JavaScript实现Fly Bird小游戏
高端建站三要素:定制模板、企业官网与响应式设计优化
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
简单实现Android文件上传
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel如何自定义分页视图?(Pagination示例)
Laravel如何保护应用免受CSRF攻击?(原理和示例)
如何在VPS电脑上快速搭建网站?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
Python自动化办公教程_ExcelWordPDF批量处理案例
高防服务器租用首荐平台,企业级优惠套餐快速部署
HTML 中如何正确使用模板变量为元素的 name 属性赋值
如何在IIS中配置站点IP、端口及主机头?
做企业网站制作流程,企业网站制作基本流程有哪些?
在线教育网站制作平台,山西立德教育官网?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Bootstrap CSS布局之列表
如何快速搭建二级域名独立网站?
高端云建站费用究竟需要多少预算?
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
如何在建站之星网店版论坛获取技术支持?
网站建设要注意的标准 促进网站用户好感度!
微信小程序 canvas开发实例及注意事项
如何快速生成可下载的建站源码工具?
如何在七牛云存储上搭建网站并设置自定义域名?
Python文件操作最佳实践_稳定性说明【指导】
如何用美橙互联一键搭建多站合一网站?
微信小程序 HTTPS报错整理常见问题及解决方案

