引用传递分析

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

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

引用传递案例

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

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. quarkus实战之六:配置

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<quarkus实战>系列 ...

  2. 你不知道的 HTTP Referer

    前言 上周突然发现自己的自己站点的图片全都403了,之前还是好好的,图片咋就全都访问不了呢?由于我每次发文章都是先发了掘金,然后再从掘金拷贝到我自己的站点,这样我就不用在自己的站点去上传图片了,非常方 ...

  3. AcWing 4799. 最远距离题解

    请看: 我们规定,如果一个无向连通图满足去掉其中的任意一条边都会使得该图变得不连通,则称该图为有效无向连通图. 去掉一条边就不连通了,这不就是树吗? (否则如果是图(就是不是树的图)的话,一定有环,拆 ...

  4. html5 2.0学习

    列表定义:是一种特别的对象集合.集合:集中在一起合二为一(聚集). 聚集:多个列(信息资源)排在一起.信息资源:一堆数据,可能是字符,可能是图片. 列表分类:有序列表 无序列表  (自)定义列表  有 ...

  5. 产品代码都给你看了,可别再说不会DDD(一):DDD入门

    这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...

  6. VMware中的虚拟机Debian10的服务器配置,使主机(win10)能够通过本地域名(如www.xxx.com)访问该服务器

    VMware中的虚拟机Debian10的服务器配置,使主机(win10)能够通过本地域名(如www.xxx.com)访问该服务器 安装过程 下载debian-10.13.0-amd64-DVD-1.i ...

  7. IDA的使用-1

    IDA的使用-1 主要收集我自己需要掌握的或者以前不知道的 开始界面 重载文件 在我们逆向过程中被文件修改过,这个时候需要我们重载一下,比如说开发过程中加点代码之类的 下面是加载额外文件,这个文件和我 ...

  8. 老问题了:idea中使用maven archetype新建项目时卡住

    背景 作为一个后端Java打工人,idea就是最重要的打饭工具.创建项目,熟悉吧,但是,这么多年下来,因为idea换了版本,电脑换了等等,我还是时不时遇到根据maven archetype新建mave ...

  9. 【Hexo】NexT 主题的配置使用记录

    目录 简介 版本 安装 配置记录 风格/主题 网页图标 菜单栏 侧边栏 本地搜索 代码块 动画效果 阅读进度 书签 Mermaid lazyload fancybox pangu 捐赠 版权声明 不蒜 ...

  10. wget 命令的使用:HTTP文件下载、FTP文件下载--九五小庞

    1. wget 命令简介与安装wget是用于在命令行终端下载网络文件的开源免费的命令工具,支持 HTTP/HTTPS.FTP/FTPS 协议的下载.wget 与 curl 相似,curl 可以理解为是 ...