Java之引用传递
引用传递分析
类本身就属于引用数据类型,既然是引用数据类型,就会牵扯到内存的引用传递。
引用传递的本质:同一块堆内存空间可以被不同的栈内存所指向,也可以变更指向。
引用传递案例
先看一个应用传递的例子:
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
实际上保存的一条内存地址,而上述语句怎表明新的栈内存空间per2
和per1
保存一样的内存地址。
当我执行语句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);
部分,如下图
此时原本栈内存都是主方法的per1
和per2
,现在变成了主方法的per
和change()
方法的temp
最后执行change()
但是当change()执行完毕是,temp会断开连接
最后,当我们引用传递发生在方法上,主要关注方法接收的参数类型和方法的执行位置。
Java之引用传递的更多相关文章
- Java Object 引用传递和值传递
Java Object 引用传递和值传递 @author ixenos Java没有引用传递: 除了在将参数传递给方法(或函数)的时候是"值传递",传递对象引用的副本,在任何用&q ...
- Java参数引用传递之例外:null
今天写链表的时候写了一个函数,实参是一个空链表,应该是按引用传参,但是在函数内修改了链表,外部的链表没有变化. 原来是null作为参数传递的时候,就不是引用传参了. 引自:http://blog.cs ...
- Java没有引用传递机制,C#有。
Java没有引用传递机制,C#有: public class Obj { private Integer myValue; public Integer getMyValue() { return m ...
- Java中引用传递
//Java中的引用传递 class Ref1{ int temp = 10 ; String Str = "hello"; } public class HelloWorld { ...
- 有关java的引用传递,直接操作对象本身。直接删除BE的value中某值
HashSet<String> refRegions = BE.get(regionName); HashSet<String> values = new HashSet ...
- java中 引用传递、值传递的理解(数组,自定义类,基本数据类型,String类)
代码部分: public static void main(String[] args) { testInt(); testString(); testArray(); testX(); } publ ...
- 【8】java之引用传递
一.引用传递 引用传递是整个 java 的精髓所在 引用传递核心意义:同一块堆内存空间可以被不同的栈内存所指向,不同栈内存可以对同一块堆内存内容进行修改. 范例:第一道引用传递范例 class Me ...
- 如何理解java的引用传递
1. 数组的引用传递 public class TestArray { public static void changeAry1(int[] ary){ int[] ary1 = {9,9,9}; ...
- (转)java中引用传递和值传递
https://blog.csdn.net/javazejian/article/details/51192130 https://www.cnblogs.com/perfy/archive/2012 ...
- java的引用传递
public class T{ static class Node{ int value; Node left = null; Node right = null; public Node(int v ...
随机推荐
- 2021-8-5 Mysql个人练习题
创建学校表格 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s_birt ...
- FreeSWITCH通过mod_mariadb原生连接MySQL
前言 根据官方更新说明(https://freeswitch.org/confluence/display/FREESWITCH/FreeSWITCH+1.10.x+Release+notes),从1 ...
- 苹果MacOS系统傻瓜式本地部署AI绘画Stable Diffusion教程
Stable Diffusion的部署对小白来说非常麻烦,特别是又不懂技术的人.今天分享两个一键傻瓜式安装包,对小白来说非常有用.下面两个任选一个安装就可以. 一.DiffusionBee 简单介绍 ...
- 《Linux基础》03. 运行级别 · 实用指令
@ 目录 1:运行级别 2:帮助指令 2.1:man 2.2:help 3:文件目录指令 3.1:pwd 3.2:ls 3.3:cd 3.4:mkdir 3.5:rmdir 3.6:touch 3.7 ...
- 《SQL与数据库基础》06. 函数
目录 函数 字符串函数 数值函数 日期函数 流程函数 本文以 MySQL 为例 函数 函数是指一段可以直接被另一段程序调用的程序或代码. 要查看函数操作的结果,可以使用 SELECT 函数(参数); ...
- selenium-wire兼容selenium和requests
背景 在工作中UI自动化中可能会需要用到API来做一些数据准备或清理的事情,那UI操作是略低效的,但API操作相对高效. 而实战课就有这样一个案例,不过那个案例是UI操作和API分开的. 极少会遇到这 ...
- iOS添加图片
添加一个按钮 将图片添加到
- Hadoop NameNode启动后自动关闭解决方法
Hadoop NameNode启动后过一会自动关闭了,查看日志文件报内存溢出异常: tail -100 /bigdata/logs/hadoop/hadoop-root-namenode-node1. ...
- Verilog实现定点乘法器
实验目的 理解定点乘法的不同实现算法的原理,掌握基本实现算法. 熟悉并运用 Verilog 语言进行电路设计. 为后续设计 CPU 的实验打下基础. 实验内容 定点乘法器有多种实现,实验要求实现迭代乘 ...
- ViTPose+:迈向通用身体姿态估计的视觉Transformer基础模型
身体姿态估计旨在识别出给定图像中人或者动物实例身体的关键点,除了典型的身体骨骼关键点,还可以包括手.脚.脸部等关键点,是计算机视觉领域的基本任务之一.目前,视觉transformer已经在识别.检测. ...