Android中的引用传递和值传递分析(Java)

PRIDE数据库20年:2025更新 PRoteomics IDEntifications (PRIDE)数据库(https://www.ebi.ac.uk/pride/)是全球领先的基于质谱(MS)的蛋白质组学数据存储库,也是ProteomeXchange联盟的创始成员之一。本文总结了过去3年中PRIDE资源及相关工具的发展情况。提交到PRIDE存档的数据集数量平均每月达到约534个。主要得益于基础设施的持续改进,如用于超大数据集的新文件传输协议(Globus)、新的数据重新提交流程以及自动数据集验证过程。 阅读详情

本人原来是做C和C++开发的,最近项目需要开始搞android的开发,

接触新平台总会遇到一些编程语言观念上不一样的问题,像值传递和引用传递在拥有指针的C/C++中是个方便好办的事情,

但在Java里貌似就没那么方便了,不过这样做的一个好处是可以降低程序耦合性, 

以下是我作为菜鸟的一些尝试的心得,若不正确,望提出指正。


先简单说说C中的几种传递吧,


1. 值传递,

int a = 9; 

int b = a; //a =9 , b = 9

b = 10; //a = 9, b = 10


func(a);  //After fun(), a = 9;


void func(int i)

{

i++;

}

值传递实际上是直接将变量的内容复制一个副本,新变量与原变量将没有任何关联,对新变量的修改也不会影响原变量。


2.地址传递,

int *pInt = (int *)malloc(1*sizeof(int));  //pInt指向堆上的一块内存区A。

memset(p,0,1*sizeof(int)); 

pInt[0] = 10; //赋值。

func(&pInt); //函数内修改pInt[0]的值。 运行func()之后 pInt[0]的值为9

void func(int *p)

{

p[0] = 9;

}

地址传递可以看做是把指针指向的地址值做了份拷贝,函数体内获得的地址值和原地址值是一样的,因此修改指向的内容将会影响原来的变量指向的内容。


3.引用传递,

int a = 8;

int &b = a; //b作为a的引用,b必须在定义时初始化。 a=b=8;

func(a); //After func(a),  a=9;


void func(int &c)

{

c = 9;

}

引用其实是原变量的一个别名,可以理解成一个变量有两个名字,因此对任何一个变量的操作都将影响原变量。



接下来再说说重点,java中的值传递和引用传递。

下面是个简单例子:


定义了一个简单的基本类:

public class NodeBase {

	private int id = 0;
	private String name = null;

	public NodeBase(){

	}
	
	public NodeBase(int id, String name){
		this.id = id;
		this.name = name;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		String str = "Node:"+getName()+", Id="+getId();
		return str;
	}	

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}


以下是个简单的测试类:


public class SimpleTest {
	
	
    public void swapTest(){
    	int iA = 8;
    	int iB = 9;
    	String sA = "abc";
    	String sB = "def";
    	NodeBase nA = new NodeBase(5,"A");
    	NodeBase nB = new NodeBase(6,"B");
       	Log.v("MyDebug", "B4Swap:iA:"+iA+",iB:"+iB+",sA:"+sA+",sB:"+sB+","+nA.toString()+","+nB.toString());
       	swapInt(iA, iB);
       	swapString(sA, sB);
       	swapNode(nA, nB);
       	Log.v("MyDebug", "Swapped:iA:"+iA+",iB:"+iB+",sA:"+sA+",sB:"+sB+","+nA.toString()+","+nB.toString());
       	modifyInt(iA);
       	modifyString(sA);
       	modifyNode(nA);
       	Log.v("MyDebug", "Swapped:iA:"+iA+",sA:"+sA+","+nA.toString());
    }
    
    public void swapNode(NodeBase a, NodeBase b){
    	NodeBase tmp = a;
    	a = b;
    	b = tmp;
    }
    public void swapString(String a, String b){
    	String c = a;
    	a = b;
    	b = c;
    }
    public void swapInt(int a, int b){
    	int c = a;
    	a = b;
    	b = c;
    }
    public void modifyInt(int i){
    	i = 10;
    }
    public void modifyString(String s){
    	s = "ghi";
    }
    public void modifyNode(NodeBase n){
    	n.setId(7);
    	n.setName("C");
    }
 
}

在MainActivity中运行

public class MainActivity extends Activity  {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);    
        test();
}

   public void test(){
    	SimpleTest simpleTest = new SimpleTest();
    	simpleTest.swapTest();
    }
}


测试结果输出:



程序中定义了个基本类,主要为了便于观察对象的成员变量在函数体内修改的效果。

程序作了3次输出,

第一次输出为初始化时的数据,

第二次输出是执行交换函数后的数据,

第三次输出时 在函数体内修改变量内容后的输出。


从结果看,最后的输出只有在函数体内修改对象的成员变量会影响原对象的成员变量。

因此可以得出java中的参数传递是采用值传递方式,


当java中通过参数传递对象时,实际上传递的是对象地址的副本(个人理解是java编译器对对象传递的操作方式类似于C++对指针传递的操作),

它仍然是值传递,因此在函数体内对对象进行修改时,修改的对象和原对象所指向的堆区域是相同的,所以会影响原对象。


第二次输出前,程序作了交换处理,其实交换的都是副本(包括地址的副本),并不影响原变量和对象。


第三次输出的 修改String 对象的函数

public void modifyString(String s){
    	s = "ghi";
    }

实际上相当于对变量s作了一次新的对象赋值,也不会影响原对象sA。



基于上面的理解,

NodeBase nB = new NodeBase(6,"B");

NodeBase nC = nB;
nC.setId(12);
nC.setName("C");

执行这几条语句后nB.toString()输出是多少呢?


第一次写技术文章,有点乱,见谅!!


星空剑圣@优快云




[NVME] CMBLOC-Controller Memory Buffer Location CMBLOC-Controller Memory Buffer Location 阅读详情

相关推荐

保姆级教程:手把手教你用Python逆向分析极验4.0滑块验证码的w参数生成逻辑

本文提供了一份详细的Python逆向工程教程,手把手教你分析极验4.0滑块验证码的w参数生成逻辑。通过HTTP请求分析、JavaScript逆向和加密算法复现,帮助开发者深入理解验证码防护机制,并实现高效的自动化解决方案。教程涵盖AST反混淆、轨迹生成算法和AES加密等核心技术,适合中高级开发者提升逆向工程能力。

weixin_30172941的博客 304

(转)值传递和引用传递实例讲解,半路出家Android程序员看我轻松逆袭

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

imtokenmax众筹 785

SAP S4HANA F-02报错:更正统一日记账分类账的定制设置

消息号 FINS_ACDOC_CUST201 使用FINS_CUST_CONS_CHK_P去检查公司代码和分类账的设置 提示:过账期间变式为空(分类账 E1/公司代码 7500) 检查了表FINSC_LD_CMP 显示有分类账未分配过账期间变式 解决:后台配置定义分类账和货币类型的设置把过账变式维护下 路径:财务会计→财务会计全局设置→分类账→分类账→定义分类账和货币类型的设置 选中需要维护的分类账双击左侧的“分类账的公司代码设置”,找到对应的公司代码维护上即可。

qq_45068743的博客 6448

android 是值传递还是引用传递?

android 基本数据类型是值传递 而对象是引用的值传递(其实就是把指向的地址传递了过去,地址传递) 但是在android 中要注意的是,intent 在activity 中传递对象时,是值传递,并不是地址传递。 详解请点击:百度知道      注意:不要看提问者采纳的,那是回答者在误人子弟,正确的请看评论

huanshiwushuang的博客 1255

VMware桥接模式实战:用手机热点给Linux虚拟机共享网络(附WiFi适配技巧)

本文详细介绍了在移动办公场景下,如何为VMware中的Linux虚拟机配置桥接模式,以通过手机热点共享网络。文章深入解析了桥接模式在无线环境下的工作原理,提供了从主机端准备、VMware设置到Linux虚拟机内部配置的完整实战步骤,并针对手机热点的特殊性,分享了MTU优化、DNS配置及常见网络问题的诊断与解决方案,帮助用户实现稳定高效的移动虚拟化办公。

2y3u4i5o6p的博客 1196

单细胞分析进阶:sctransform标准化在Seurat中的实战解析

本文深入解析了sctransform标准化方法在Seurat单细胞分析中的实战应用。通过对比传统对数标准化,sctransform能更有效地建模并剔除技术噪音,提升数据质量。文章提供了从环境配置、数据准备、核心参数解析到完整流程整合的详细指南,并针对常见问题给出解决方案,帮助研究者获得更清晰的细胞分群和更可靠的差异表达结果。

weixin_29248313的博客 151

android java调用参数_java – 在android中传递引用作为参数

我是java / android的新手.我是一名c / c开发人员.我可以知道如何在android中传递引用作为参数.示例c示例代码如下所示void main(){int no1 = 3, no2 = 2, sum = 0;findsum( no1, no2, sum );printf("sum=%d", sum );}void findsum( int no1, int no2, int&amp...

weixin_42324002的博客 388

k8s 查看cpu使用率最高的pod

在 Kubernetes 中,可以使用命令查看 Pod 的资源使用情况,从而找到 CPU 使用率最高的 Pod。

u010674101的专栏 3345

Android传值

Android进行值传递 文章目录Android进行值传递一、意义二、方法1、直接进行Intent传值2、进行Bundle传值3、直接传走这个实体类 一、意义 android在进行页面传值时需要进行传递,在第一个页面有许许多多的数据,而第二个界面要开始显示数据时,需要有第一个界面中的数据,这个时候就需要进行值传递了。 二、方法 1、直接进行Intent传值 holder.click_item.setOnClickListener(new View.OnClickListener() { @Overr

wzx311的博客 1604

推荐系统公平性之流行度偏差(fairness in recommender systems -- popularity bias)

主要参考论文:《The Unfairness of Popularity Bias in Recommendation》 RMSE@RecSys 2019 流行度偏差是什么 先定义流行物品和非流行物品。下图是(Movielens 1M)数据集中物品的评分情况。 图的横坐标表示不同物品,纵坐标表示物品的评分次数。可以看出只有少部分物品得到了很多的评分,大部分曲线尾部的物品都只有少量的评分,我们也把这部分物品称为长尾物品。在本文中,我们取曲线的前20%对应的物品为流行物品,剩余的为非流行物品(长尾物品)。 然

beilizhang的博客 5275

OpenClaw 2026.3.13 踩坑实录:飞书HTTP协议降级Bug与多版本回归问题汇总

摘要:OpenClaw v2026.3.13存在多个严重回归问题,包括飞书API调用协议意外降级为HTTP导致连接失败(#46100)、本地Gateway诊断矛盾(#45504)及设备配对CLI命令失效等。该版本发布流程本身也存在异常,被迫以v2026.3.13-1标签重新发布。建议飞书用户回退至v2026.3.8稳定版,其他用户谨慎升级。本文详细记录了各Bug现象、影响范围及临时解决方案,并梳理了飞书通道的"多版本回归史",指出其根源在于架构变迁和测试覆盖不足。最后提供了包含配置备份、

Maynor的博客 869

Android 五中数据传递方式汇总

Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,我把常用的几种 方法都收集到了一起。它们各有利弊,有各自的应用场景。 我现在把它们集中到一个例子中展示,在例子中每一个按纽代表了一种实现方法。 1. 利用Intent对象携带简单数据 利用Intent的Extra部分来存储我们想要传递的数据,可以传送int, long,

hopehe888999的专栏 1100

《MATLAB项目实战》,专栏目录和介绍

MATLAB 是一款强大且广泛应用的数值计算和数据可视化软件工具,它提供了一个高效、简洁的编程环境,使用户能够进行从简单的矩阵运算到复杂的多维数据分析的各种计算任务。无论是在人工智能、计算机视觉、图像处理还是其他领域,MATLAB 都能够提供精准、快速的解决方案,因此成为了全球科研人员、工程师以及数据分析师的得力工具。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6478

Android面试题,androidframework开发面试

使用 AtomicInteger 可以使 i++ 线程安全 说下对线程池的理解,以及创建线程池的几个关键参数 Handler 机制又问了一遍… 介绍下 Binder 机制,与内存共享机制有什么区别? 为什么Android要采用Binder作为IPC机制? - Gityuan的回答 Android匿名共享内存(Ashmem)原理 图文详解 Android Binder跨进程通信的原理 Java 集合,介绍下ArrayList 和 HashMap 的使用场景,底层实现原理 A.

m0_66684810的博客 261

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

当面试官问我————Java是值传递还是引用传递?

面试官:你好,你能说出下面个程序的执行结果吗? public class Test { public static void main(String[] args) { String name = "Scott"; int age = 5; User user = new User(); user.setName(name); user.setAge(age); S...

Morty的技术乐园 7815

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

关于Java的值传递和引用传递

结论: 1. 对于值传递,如int, long等基本类型,不管传入方法后怎么修改,都改变不了方法外面的值。 2. 对于引用传递,如果传入方法后指向了一个新的对象,那么无论怎么修改也改变不了方法外面的对象。     如果传入方法后没有指向新对象,直接操作,就会改变方法外面的对象,因为这是在操作同一个对象。 来看一段测试源码: package aa; public class

1569

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java中的值传递和引用传递问题

值传递与引用传递 首先要说明的是java中是没有指针的,java中只存在值传递,只存在值传递!!! 然而我们经常看到对于对象(数组,类,接口)的传递似乎有点像引用传递,可以改变对象中某个属性的值。但是不要被这个假象所蒙蔽,实际上这个传入函数的值是对象引用的拷贝,即传递的是引用的地址值,所以还是按值传递。 值传递 示例: public class Test3 { p...

Carry_man的博客 525

Java中对象、对象引用、堆、栈、值传递以及引用传递的详细解释

Java中对象、对象引用、堆、栈、值传递以及引用传递的详细解释 1.对象和对象引用的区别: (1).对象: 万物皆对象。对象是类的实例。在Java中new是用来在堆上创建对象用的。一个对象可以被多个引用所指向。 (2).对象引用: 类似于C++中的地址。通过对象引用可以找到对象。一个引用可以指向多个对象。操纵

Android技术专栏 4184

Java值传递还是引用传递

一、值传递(只有基本类型和String str = “Java测试”;是值传递) 1.值传递(参数拷贝):方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。 public class TempTest { public static void main(String[] args) { int num =...

Michaeles的博客 220

Java的值传递和引用传递,你真的搞清楚了吗?

luckykelan的博客地址:https://juejin.im/user/5b172e3e51882513e905909f先从一道面试题说起:以下程序输出结果是什么: public...

Android技术之家 267

函数参数传递:值传递 vs 引用传递(模拟)

本文深入解析函数参数传递的两种方式:值传递与引用传递(模拟)。通过Python和C++代码示例,展示了值传递对原始数据的保护作用(如整数)和引用传递对可变对象(如列表)的直接修改能力。文章借助Mermaid图表可视化内存模型差异,并讨论了性能与副作用权衡,指出Python"对象引用传递"的特殊性。最后推荐了官方文档等扩展资源,帮助开发者根据数据特性选择合适传递方式,平衡效率与代码安全性。

always_TT的博客 570

String是值传递还是引用传递

今天上班时,同事发现了一个比较有意思的问题。他把一个String类型的参数传入方法,并在方法内改变了引用的值。 然后他在方法外使用这个值,发现这个String还是之前的值,并没有改变。 这里要向大家介绍一下,大家都知道java在传参时分为值传递和引用传递。参数为基本类型时是值传递, 参数为封装类型时是引用传递。例如: 基本类型参数 public class Test { p...

weberhuangxingbo的博客 194

【Java面试题】当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

Java面试题:当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?? 答:是值传递。Java编程语言中只有由值传递参数的。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。 Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通...

郑清 1592

你真的理解Java的按引用传递吗?

首先我们来看下面这段代码:public class Test1 { String a = "123"; public static void change(Test1 test) { test.a="abc"; } public static void main(String[] args) { Test1 test1=new

weiersyuan的专栏 1万+

Java值传递和引用传递

关于Java值传递和引用传递,可耻的借用某位大神总结的口诀: 1.= 是赋值操作(任何包含=的如+=、-=、 /=等等,都内含了赋值操作)。不再是你以前理解的数学含义了,而+ - * /和 = 在java中更不是一个级别,换句话说, = 是一个动作,一个可以改变内存状态的操作,一个可以改变变量的符号,而+ - * /却不会。这里的赋值操作其实是包含了两个意思:1、放弃了原有的值或引用;2、得到了

CJ的博客 682

java中的按值传递和按引用传递

先使用int实验: public class TTEST { private static List mList = new LinkedList(); public static void main(String[] args) { int a = 0; changeA(a); System.out.println("a = "+a); } public stat

Crazy Android 2200
上一篇: Android解析XML-详尽
下一篇: 从下载记录得出的一些结论
gamer_x
博客等级 码龄19年 17粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值