引用传递分析

类本身就属于引用数据类型,既然是引用数据类型,就会牵扯到内存的引用传递。

引用传递的本质:同一块堆内存空间可以被不同的栈内存所指向,也可以变更指向。

引用传递案例

先看一个应用传递的例子:

class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+ name + " 年龄:" + age);
}
}
public class JavaDemo{
public static void main(String args[]){
Person per1 = new Person(); //实例化
per1.name = "张三";
per1.age = 18;
Person per2 = per1; //引用传递
per2.age = 80;
per1.tell(); //进行方法调用
}
}

运行结果:

对代码进行分析:

首先是实例化对象per1以及赋值,这个较好理解

关键的一条语句:Person per2 = per1; 因为我们知道,per1实际上保存的一条内存地址,而上述语句怎表明新的栈内存空间per2per1保存一样的内存地址。

当我执行语句per2.age = 80;的时候,实际上修改原本控件的age值

方法进行引用传递

这个时候的引用传递是直接在主方法进行的,也可以使用方法进行引用传递。

沿用上面例子我们做个修改:

class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+ name + " 年龄:" + age);
}
}
public class JavaDemo{
public static void main(String args[]){
Person per = new Person(); //实例化
per.name = "张三";
per.age = 18;
change(per);
per1.tell(); //进行方法调用
}
public static void change(Person temp)
temp.age = 80;
}

与之前的差别最大的地方在于,此处程序是将Person类的实例化对象(内存地址和数值)传递到方法change()方法中。

但是大家不要被迷惑了,此时运行结果还是和上述一样。这是因为change(per);就等价于Person temp = per;

从图上来说,实例化部分的图是一样的,而到change(per);部分,如下图

此时原本栈内存都是主方法的per1per2,现在变成了主方法的perchange()方法的temp

最后执行change()

但是当change()执行完毕是,temp会断开连接

最后,当我们引用传递发生在方法上,主要关注方法接收的参数类型方法的执行位置

Java之引用传递的更多相关文章

  1. Java Object 引用传递和值传递

    Java Object 引用传递和值传递 @author ixenos Java没有引用传递: 除了在将参数传递给方法(或函数)的时候是"值传递",传递对象引用的副本,在任何用&q ...

  2. Java参数引用传递之例外:null

    今天写链表的时候写了一个函数,实参是一个空链表,应该是按引用传参,但是在函数内修改了链表,外部的链表没有变化. 原来是null作为参数传递的时候,就不是引用传参了. 引自:http://blog.cs ...

  3. Java没有引用传递机制,C#有。

    Java没有引用传递机制,C#有: public class Obj { private Integer myValue; public Integer getMyValue() { return m ...

  4. Java中引用传递

    //Java中的引用传递 class Ref1{ int temp = 10 ; String Str = "hello"; } public class HelloWorld { ...

  5. 有关java的引用传递,直接操作对象本身。直接删除BE的value中某值

    HashSet<String> refRegions = BE.get(regionName);    HashSet<String> values = new HashSet ...

  6. java中 引用传递、值传递的理解(数组,自定义类,基本数据类型,String类)

    代码部分: public static void main(String[] args) { testInt(); testString(); testArray(); testX(); } publ ...

  7. 【8】java之引用传递

    一.引用传递 ​引用传递是整个 java 的精髓所在 引用传递核心意义:同一块堆内存空间可以被不同的栈内存所指向,不同栈内存可以对同一块堆内存内容进行修改. 范例:第一道引用传递范例 class Me ...

  8. 如何理解java的引用传递

    1. 数组的引用传递 public class TestArray { public static void changeAry1(int[] ary){ int[] ary1 = {9,9,9}; ...

  9. (转)java中引用传递和值传递

    https://blog.csdn.net/javazejian/article/details/51192130 https://www.cnblogs.com/perfy/archive/2012 ...

  10. java的引用传递

    public class T{ static class Node{ int value; Node left = null; Node right = null; public Node(int v ...

随机推荐

  1. Docker本地搭建个人企业私有云盘seafile搭建(完美解决ONLYOFFICE无法预览的情况)

    seafile搭建 #创建存放路径 mkdir -p /media/megrez/data/seafile/seafile-mysql/db mkdir -p /media/megrez/data/s ...

  2. 双URL编码绕过WAF

    一般编码一次是%5c. 但攻击者怕这个会被认出来,所以用二次编码,把%本身编码成%25.再和后边拼成%255c. 如果URL解码器有缺陷,只不断重复"从前边开始解析"这个步骤,就会 ...

  3. 使用 Habana Gaudi2 加速视觉语言模型 BridgeTower

    在对最先进的视觉语言模型 BridgeTower 进行微调时,使用 Optimum Habana v1.6, Habana Gaudi2 可以达到 近 3 倍于 A100 的速度.硬件加速的数据加载以 ...

  4. Codeforces 1850H:The Third Letter 带权并查集

    1850H.The Third Letter Description: \(n\) 个人,\(m\) 个条件,每次给出两个人 \(a_i\) 和 \(b_i\) 一维的位置关系,以距离 \(d_i\) ...

  5. 浏览器端模块化方式es module详解

    在es module出现之前还有社区推出amd和cmd的规范,这两者还有其特定的编写方式,使用起来不算很方便.es module被官方推出来就成为了浏览器端实现模块化的一个很好的方案.   想要在浏览 ...

  6. 解放生产力orm并发更新下应该这么处理求求你别再用UpdateById了

    解放生产力orm并发更新下应该这么处理求求你别再用UpdateById了 背景 很多时候为了方便我们都采用实体对象进行前后端的数据交互,然后为了便捷开发我们都会采用DTO对象进行转换为数据库对象,然后 ...

  7. [ABC305D] Sleep Log题解

    题目大意 给 \(N\) 个时刻: 当 \(i\) 为奇数时,\(A_i\) 表示刚刚起床的时刻. 当 \(i\) 为偶数时,\(A_i\) 表示开始睡觉的时刻. 有 \(Q\) 次询问,每次求在 \ ...

  8. 【Windows】KMS 激活命令记录

    目录 KMS 服务器激活 Office.Visio 推荐使用 office tool plus 部署并配置 KMS 激活 什么是 KMS? KMS 正版与否的区别 总结 KMS 服务器激活 利用 KM ...

  9. CCF 202012-5星际旅行(20~100分)

    前置知识 线段树:通过懒惰标记,可实现区间处理,和区间询问皆为\(O(logn)\)时间复杂度的数据结构,是一种二叉树.因此对于一个节点\(st\),其左儿子节点为\(st*2\),右节点为\(st* ...

  10. Go语言中JSON的反序列化规则

    Unmarshal 解析 func Unmarshal(data []byte, v any) error Unmarshal 解析 JSON 编码的数据,并将结果存储在 v 指向的值中.如果 v 为 ...