打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Java类中各成分加载顺序和内存中的存放位置

java有四个内存块:

1.code区域:存放java类的非静态方法

2.static区域:存放静态成员变量、 静态方法、静态代码块、构造代码块

3.stack区域:存放正在执行的方法代码,以及基本类型数据和引用类型

4.heap区域:新建对象时候用于存放类的成员变量。

《深入理解Java虚拟机》这样分解java类存区域

如果必须说的更统一,可以更细的划分为以下5各区域

1.code区域中非static区域:存放java类的非静态方法

2.code区域中static区域:存放静态成员变量、 静态方法、静态代码块、构造代码块

3.stack区域中数据栈:基本类型数据和引用类型

4.heap区域:新建对象时候用于存放类的成员变量。

5.本地方法栈:使用native关键字或者jvm调用本地操作系统的方法区域。


以下内容摘自博客

一、什么时候会加载类?
使用到类中的内容时加载:有三种情况
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
  
三、静态代码块、构造代码块和构造函数的区别
静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。
构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。
构造函数:  给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。
 创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数
 
//利用代码进行测试 例题:06--06:StaticCodeDemo.java

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()

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java笔记(一)
徐葳【2019版最新】40小时掌握Java语言之03面向对象
Java类的加载和代码执行顺序
面试中的 Singleton
Java中static关键字的作用
C#基本知识点
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服