Java引用传递和值传递栈内存与堆内存的指向操作

值传递:

(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

引用传递:

(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。

现有如下代码

class Person{
 private String name;
 private int age;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
}

public class Neicunzhixiang {
 public static void main(String[] args) {
  Person simth;
  simth=new Person();
  simth.setName("史密斯");
  simth.setAge(12);
 }
}

现只看主方法中部分

public class Neicunzhixiang {
 public static void main(String[] args) {
  Person simth;
  simth=new Person();
  simth.setName("史密斯");
  simth.setAge(12);
 }
}

下面用一张图来解释每行代码栈内存与堆内存之间的关系

将左边紫色部分看为栈内存,右边蓝色部分看为堆内存,下边绿色部分为当前图示所代表的代码。

当person simth时 并没有在堆内存中开辟空间,所以simth没有指向

当simth=new person时,在堆内存中开辟了空间,所以栈内存simth指向了堆内存;

当simth.name=“史密斯”时,定义了堆内存中name的属性,所以name=“史密斯”;

当simth.age=12时,定义了堆内存中age的属性,所以age=12。

以上这篇Java引用传递和值传递栈内存与堆内存的指向操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 一文秒懂java到底是值传递还是引用传递

    首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语.按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址.一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值. 它用来描述各种程序设计语言(不只是 Java)中方法参数传递方式. Java 程序设计语言总是采用按值调用.也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参

  • 浅谈Java中真的只有值传递么

    回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法. 1.基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递. 2.Java中只有值传递. 关于这个问题应该是存在争议的.根据测试出来的结果和我们自己的经验,以及口口相传或是上学时老师讲的,我们认为是第一种.但第二种说法的呼声也很高,渐渐地我们也认为第2中才是对的.那么下面我们就来分析一下这个问题. 在谈这个问题之前我们先了解值传递和引用传递的概念及现象.我还记得,值传递和引用传递这些概念是大学里学Jav

  • JAVA参数传递方式实例浅析【按值传递与引用传递区别】

    本文实例讲述了JAVA参数传递方式.分享给大家供大家参考,具体如下: 首先要明确的是JAVA中没有引用传递, 全部是按值调用 令大家所费解的 当对象引用作为参数时  函数为什么能修改真实的对象呢?这不是引用传递的特征吗? 尤其先学习C++再学习JAVA的同学(比如说我自己)会这样认为, 用白话解释就是: 引用传递指针时, 连函数操作的指针都是原来的指针,比如C++传入对象时直接用传入的指针操作 而JAVA的引用传进函数时 , 会复制一个引用与实参指向同一对象的引用, 操作的不是同一个引用, 如果

  • Java参数传递及值传递实现原理详解

    java方法参数的传递有两种,值传递和引用传递. 1.按值传递: 参数类型是int,long等八大基本数据类型时,参数传递的过程是按值拷贝的过程 如下代码 public static void main(String[] args) { int a = 5; fun(a); System.out.println(a);// 输出结果为5 } private static void fun(int a) { a += 1; } 2.按引用传递 参数类型为引用类型,参数传递的过程采用拷贝引用的方式

  • 浅谈从Java中的栈和堆,进而衍生到值传递

    简述Java中的栈和堆,变量和对象的地址存放和绑定机制 初学java的小白,很多人都搞不清楚java中堆和栈的概念,我们都知道计算机只能识别二进制字节码文件,如果分不清楚对象和变量在内存的地址分配,也就是堆和栈的问题,很多问题比如绑定机制.静态方法.实例方法.局部变量的作用域就会搞不清楚. 首先记住结论: 基本数据类型.局部变量.String类型的直接赋值都是存放在栈内存中的,用完就消失. new创建的实例化对象.String类型的构造方法new出来的对象及数组,是存放在堆内存中的,用完之后靠垃

  • Java引用传递和值传递栈内存与堆内存的指向操作

    值传递: (形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值. 引用传递: (形式参数类型是引用数据类型参数):也称为传地址.方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数. 现有

  • 探讨Java中函数是值传递还是引用传递问题

    相信有些同学跟我一样,曾经对这个问题很疑惑.在网上也看了一些别人说的观点,评论不一.有说有值传递和引用传递两种,也有说只有值传递的,这里只说下个人见解 先给大家介绍下概念 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值. 引用传递:(形式参数类型是引用数据类型参数):也称为传地址.方法调用时,实际参数是对象(或数组),这时实际参数与

  • java通过实例了解值传递和引用传递

    这篇文章主要介绍了java通过实例了解值传递和引用传递,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.java中的值传递的问题 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public static void main(String[] args) { int a=1; change(a); System.out.println("交换a后的值:"+a); } private static void change(

  • 全面理解Java中的引用传递和值传递

    目录 1.基本类型和引用类型在内存中的保存 2.变量的基本类型和引用类型的区别 3.引用传递和值传递 4.结论 关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型的

  • JS引用传递与值传递的区别与用法分析

    本文实例讲述了JS引用传递与值传递的区别与用法.分享给大家供大家参考,具体如下: 这里详细解释JS值传递和引用传递以及二者的区别. 我们先来解释一下这两个的基本概念吧. 函数调用中,传递是一个数值,我们称为 "值传递". 函数调用中,传递是对象,一般称为 "引用传递". 现在这里总体上说明,这二者的本质区别就在于传递的数据类型不一样,值传递传递的是一个值,而引用传递传递的是一个对象. 看一下代码以及代码中的注释. 一.引入 function func(a) { a+

  • PHP数组传递是值传递而非引用传递概念纠正

    在调用函数时通过将PHP数组作为实参赋给形参,在函数中修改,并不会影响到数组本身. 说明此过程中的传递为值传递,数组变量并非是指向此数组本身的引用,PHP数组本身以值的形式存在,同时形参是对数组的拷贝. 这点与其他一些语言不同(如c.Js等)很不相同,值得注意! 复制代码 代码如下: $arr = array( 'name' => 'corn', 'age' => '24', ); test_arr($arr); function test_arr($arr){ $arr['name'] =

  • String类型传递是值传递,char[]类型传递是引用传递的实现

    如下所示: package com.lstc.test; public class TestDemo3 { String str = new String("hello"); char[] ch = { 'a', 'b' }; public static void main(String[] args) { TestDemo3 t = new TestDemo3(); t.change(t.str, t.ch);//String是封装类,是值传递,char数组是引用传递 System.

  • python 引用传递和值传递详解(实参,形参)

    python中函数参数是引用传递(不是值传递).对于不可变类型,因变量不能被修改,所以运算时不会影响到变量本身:而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量. 形参: 函数需要传递的参数 实参:调用函数时传递的参数 补充知识:python函数方法实参给形参传值时候的隐形'陷阱' 众所周知,在python函数里面参数分为形参,实参两种.形参当然了就是形式参数,而实参是我们需要给这个函数传入的变量,在我们给实参传入变量之后,调用函数,实参则自动会把数值或则变量赋予形参,从而通过函数得

  • javascript数组与php数组的地址传递及值传递用法实例

    本文实例讲述了javascript数组与php数组的地址传递及值传递用法.分享给大家供大家参考.具体如下: javascript数组为地址传递/引用传递,而php数组为值传递 实例代码如下: 复制代码 代码如下: <?php $arr = array(3,9,4); function test($arr){  $arr[0] = 30; } test($arr); foreach($arr as $val){  echo $val." "; } ?> <script

  • 详解JavaScript栈内存与堆内存

    内存分配 在编译阶段,除了声明变量和函数,查找环境中的标识符这两项工作之外,还会进行内存分配.不同类型的数据会分配到不同的内存空间: 栈内存:引擎执行代码时工作的内存空间,除了引擎,也用来保存基本值和引用类型值的地址. 堆内存:用来保存一组无序且唯一的引用类型值,可以使用栈中的键名来取得. 示意图: 赋值与赋址 引擎不能直接操作堆内存中的数据,这就造成了对同一个变量赋不同类型的值,会出现完全不同的效果:为一个变量赋基本值时,实际上是创建一个新值,然后把该值赋给新变量,可以说这是一种真正意义上的"

随机推荐