Java-从JVM的角度重新理解面向对象(OOP)
背景
在初次学习面向对象的时候,我时时为那些抽象的概念所迷茫,如今从Jvm虚拟机运行原理重新理解面向对象,属实打开了一扇新世界的大门,理解了Java面向对象的内存机制,一切面向对象的概念在我眼中犹如透明
目录
什么是JVM
JVM虚拟机机制是Java跨平台兼容性的支撑,在任何安装了JVM虚拟机的平台,你的JAVA代码就能在任意平台无限切换,JVM虚拟机一般是在主机内存中专门开辟一块空间,在这个空间内处理Java代码
JVM的常见内存结构
在运行java程序时,JVM会将不同类型的数据放入不同类型的数据结构,本文涉及的仅有栈、堆
在jvm中,内存被分为堆与栈
- 栈:容量小,存取速度快,适合存储生命周期短的数据,存储变量(局部变量)与方法,先进后出(想象成一个瓶子,最先扔进去的一定在栈底,它一定最后才能出来)
- 堆:容量大,存取速度慢,适合存储生命周期长的数据,堆适合存储对象,对象一般在参数中是引用数据类型传递
从JVM角度看面向对象多场景
学会了JVM的内存机制,你再去看看继承、接口、多态、static、等等东西,它们在你眼里就是透明的了,我们不用再去琢磨那些乱七八糟的概念,眼里直接就有这些概念的背后逻辑,因为Java概念本身依赖就是JVM虚拟机机制
以下介绍了面向对象主要概念的JVM视角,看完你便能够举一反三,理解面向对象其他那些犄角旮旯的内容
程序运行
我们的Java程序未编译是一个.java文件,经过编译是一个.class文件,存储在硬盘中
这时如何我运行一个.class文件,且看内存如何执行
- 开辟一块内存空间,称JVM
- 将.class文件中的数据提取到JVM
- CPU调度运行
常量与变量判定
当数据加载到内存中时,我们按着运行期数据的是否变化把数据分成常量和变量
常量有如:圆周率Π、重力系数(9.8)
变量有如:mp3文件,其在内存中运行是时刻变化的
方法调用(值传递)的内存结构
示例代码
以下面这段代码为例,讲解jvm内存的运行机制
public class test01 {
public static void main(String[] args) {
int i = 1 ;
print(i);
}
public static void print(int i ){
System.out.println(i);
}
}
方法调用(值传递)内存结构图
- 在内存中,开辟一块JVM的空间
- 在JVM中,开辟栈空间与数据共享区空间
- 将类与类中方法调入数据共享区
- 在栈中开辟一块内存空间,主方法入
- 主方法空间中,开辟一块空间,主方法中的数据(int i = 1 )入
- 主方法调用print方法,在主方法空间中开辟一块空间,print方法入
- print方法空间中,未其方法的参数开辟一块空间(几个参数几块空间),参数入
- 将主方法中的int空间的值传给print方法中int空间
经过以上分析,很显然,主方法传入的实参与print方法的实参是两块不同的内存空间,这也从底层解释了值传递后,在方法中改变参数的值,并不会影响主方法中的参数值
引用数据类型的内存结构
数组
数组作为参数去传递是一个典型的引用数据类型传递的过程
我们说引用数据类型一般存储在堆中
示例代码
public class test01 {
public static void main(String[] args)