值传递和引用传递

一、JVM内存的划分

1. 虚拟机栈

虚拟机栈是Java方法执行的内存模型,栈中存放着栈帧,每个栈帧分别对应一个被调用的方法,方法的调用过程对应栈帧在虚拟机中入栈到出栈的过程。

栈是线程私有的,也就是线程之间的栈是隔离的;当程序中某个线程开始执行一个方法时就会相应的创建一个栈帧并且入栈(位于栈顶),在方法结束后,栈帧出栈。

栈帧:是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。

每个栈帧中包括:

(1)局部变量表:用来存储方法中的局部变量(非静态变量、函数形参)。当变量为基本数据类型时,直接存储值,当变量为引用类型时,存储的是指向具体对象的引用。

(2)操作数栈:Java虚拟机的解释执行引擎被称为"基于栈的执行引擎",其中所指的栈就是指操作数栈。

(3)指向运行时常量池的引用:存储程序执行时可能用到常量的引用。

(4)方法返回地址:存储方法执行完成后的返回地址。

2. 堆

堆是用来存储对象本身和数组的,在JVM中只有一个堆,因此,堆是被所有线程共享的。

3. 方法区

方法区是一块所有线程共享的内存逻辑区域,在JVM中只有一个方法区,用来存储一些线程可共享的内容,它是线程安全的,多个线程同时访问方法区中同一个内容时,只能有一个线程装载该数据,其它线程只能等待。

方法区可存储的内容有:类的全路径名、类的直接超类的权全限定名、类的访问修饰符、类的类型(类或接口)、类的直接接口全限定名的有序列表、常量池(字段,方法信息,静态变量,类型引用(class))等。

4. 本地方法栈

本地方法栈的功能和虚拟机栈是基本一致的,并且也是线程私有的,它们的区别在于虚拟机栈是为执行Java方法服务的,而本地方法栈是为执行本地方法服务的。

5. 程序计数器

线程私有的。
记录着当前线程所执行的字节码的行号指示器,在程序运行过程中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能都需要依赖计数器完成。

二、数据在内存中的存储


1、什么是基本类型和引用类型?
(1)基本类型:就是值类型,变量所对应的内存区域中存储的是值。

(2)引用类型:就是地址类型,变量所对应的内存区域中存储的是地址,真正的数据存放在地址           对应的内存区域里。

2、在方法中声明的变量(局部变量)
每当程序调用方法时,系统都会为该方法建立一个方法栈,在方法中声明的变量,即局部变量就放在方法栈中,方法结束后,系统会释放方法栈,在方法中声明的变量随着栈的销毁而结束,这就是局部变量只能在方法中有效的原因。

在方法中声明的变量可以是基本类型变量,也可以是引用类型变量。

(1)当声明基本类型变量时,其变量名和值是放在栈中。

(2)当声明引用类型变量时,该变量会存储一个内存地址,该内存地址指向所引用的对象。引用           变量名是放在栈中,指向的对象是放在堆中。

3、在类中声明的变量(成员变量)
也叫全局变量是放在堆中的,不会随着某个方法执行结束而销毁。 

同样在类中声明的变量可以是基本类型变量,也可以是引用类型变量。

(1)当声明基本类型变量时,其变量名和值是放在堆中。

(2)当声明引用类型变量时,引用变量名和指向的对象都是放在堆中。

三、形参与实参

1、形参:方法被调用时需要传递进来的参数,如:func(int a)中的a,它只有在func被调用期间a才有意义,也就是会被分配内存空间,在方法func执行完成后,a就会被销毁释放空间,也就是不存在了

2、实参:方法被调用时是传入的实际值,它在方法被调用前就已经被初始化并且在方法被调用时传入。

四、值传递和引用传递

1、值传递

值传递很好理解,就是类似于把自己的值复制传给形参,而传入的参数存放在栈中,随方法的结束而消失,不会影响到main方法中的实参。

2、引用传递

 引用类型传递又分为两种情况,一种是类似于数组这种存放堆内存的,另外一种就是对象。数组传递到方法中的是地址值,所以是可以直接修改的。

对于对象又有两种不同情况:

(1)String和基本数据类型包装类这种用final修饰过,不可以被修改,如果被修改的话相当于创建一个新的对象,即指向了一个新的地址,如果是在main方法中调用一个方法,就变成了指向不同两个地址的变量(这里注意是main方法调用另一个方法,两个里面就都是局部变量,所以即使都是相同的变量名,也不一样);

(2)自己定义的一个类,里面定义了一个成员变量,因为没有final修饰,所以是可以改变变量值的(这里注意是调用的类有没有被final修饰),如果在方法中再次初始化之后,就又生成了一个新的对象,指向了另一个地方,所以随着方法的结束,会被回收,不会影响main方法内的值。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Night-Monkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值