Java-从JVM的角度重新理解面向对象(OOP)

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文件,且看内存如何执行

  1. 开辟一块内存空间,称JVM
  2. 将.class文件中的数据提取到JVM
  3. 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);
    }
}


方法调用(值传递)内存结构图

  1. 在内存中,开辟一块JVM的空间
  2. 在JVM中,开辟栈空间数据共享区空间
  3. 将类与类中方法调入数据共享区
  4. 在栈中开辟一块内存空间,主方法入
  5. 主方法空间中,开辟一块空间,主方法中的数据(int i = 1 )入
  6. 主方法调用print方法,在主方法空间中开辟一块空间,print方法入
  7. print方法空间中,未其方法的参数开辟一块空间(几个参数几块空间),参数入
  8. 将主方法中的int空间值传给print方法中int空间

经过以上分析,很显然,主方法传入的实参与print方法的实参是两块不同的内存空间,这也从底层解释了值传递后,在方法中改变参数的值,并不会影响主方法中的参数值

引用数据类型的内存结构

数组

数组作为参数去传递是一个典型的引用数据类型传递的过程

我们说引用数据类型一般存储在堆中

示例代码
public class test01 {
   
    public static void main(String[] args) 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值