一个面试题引发的思考(Java的值传递)

保姆级教程:手把手带你玩转英飞凌TC397开发板的板载资源(CAN FD、LCD、SD卡) 本文提供英飞凌TC397开发板的全面开发指南,涵盖CAN FD通信、LCD显示、SD卡文件系统和以太网通信等核心功能。通过详细的代码示例和硬件连接说明,帮助开发者快速上手并充分利用开发板的丰富资源,实现高效嵌入式系统开发。 阅读详情

不多说,直接上题:

public static void main(String[] args) { 
    String str = new String("abc");
    char[] ch = {'a','b','c'};
    swap(str,ch);
    System.out.print(str+" ");
    System.out.print(ch[0]);}

    public static void swap(String a,char[] b){
        a = "gbc";
        b[0] = 'g';
    }
}

先说答案:abc , g。也就是说str的值未变,ch的元素被改变了。为什么呢?

首先强调一点!!!Java中方法的参数传递方式只有一种:值传递! 所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到任何影响

做两个测试:

测试一:

    public static void main(String args[]){
        String str="good";
        char[] ch={'a','b','c'};
        swap(str,ch);
        System.out.println("after swap str="+str);
        System.out.println("after swap ch[0]="+ch[0]);

    }

    public static void swap(String str,char[] ch){
        System.out.println("before swap str="+str);
        System.out.println("before swap ch="+ch);
        System.out.println("before swap ch[0]="+ch[0]);
        str="changed";
        ch[0]='g';
    }

结果:

这里写图片描述

在测试一中,我们把ch这个数组作为参数传递过去,打印可知,传过来的是一串地址信息,请注意,虽然它是地址,但它仍然是个,只不过是个地址值!!!所以它是值传递!!!而传过来的数组ch的第一个元素是“a”。经过swap()操作后,ch的第一个元素变成了“g”。
而整个过程下来,str的值是没有改变的。

测试二:

    public static void main(String args[]){
        String str="good";
        char[] ch={'a','b','c'};
        swap(str,ch[0]);
        System.out.println("after swap str="+str);
        System.out.println("after swap ch[0]="+ch[0]);

    }

    public static void change(String str,char ch){
        System.out.println("before swap str="+str);
        System.out.println("before swap ch[0]="+ch);
        str="changed";
        ch='g';
    }

结果:

这里写图片描述

在测试二中,我们把ch[0]这个数组元素作为参数传递过去,打印可知,传过来的是个普通字符,请注意,它也是个,只不过是个字符值!!!所以它也是值传递!!!经过swap()操作后,ch的第一个元素还是“a”。
而整个过程下来,str的值没有改变的。

所以说,java的参数传递只有一种类型:值传递!!!只不过它包括普通数据类型的值传递(传递的就是8大基本数据类型),和引用数据类型的值传递(数组,对象等引用类型数据,传输的是地址值)。

普通类型的参数传递的示意图(下方):

main()和swap()各自有一个栈来存储数据,不涉及堆存储,所以swap()中的操作并不会影响main()中的数值。

这里写图片描述

引用类型的参数传递示意图(下方):

引用类型的不同之处就在于它将“引用”存在栈中,将“数据”存在堆中。进行参数传递时,传递的又是一个地址值,所以swap()接到这个地址时就会指向地址所代表的堆,也就是和main()指向同一个堆,所以swap()改变数据,main()中的数据自然跟着改变,因为它们的栈不同,但堆却相同。

这里写图片描述

啰里啰唆讲了这么多,个人总结就是一句话:参数是普通数据类型的话,在方法中改变数值不会对main()中的数值造成影响;参数是引用类型的话,在方法中改变数值会对main()中的数值有影响。

如果我讲的大家还是不明白,可以参考《疯狂Java讲义》的“方法的参数传递机制”那部分,讲的比较清晰。

【第24例】华为 IPD 体系 | RMT 需求管理团队 RMT需求管理团队 阅读详情

相关推荐

华为OD新系统机试真 - API请求日志去重分析

华为OD新系统机试真【API请求日志去重分析】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做。华为OD4月15号机试真【API请求日志去重分析】

qq_45776114的博客 885

Java面试 之 值传递(独家版本)最清晰

这些局部变量引用是方法参数的副本,它们指向相同的对象,但它们本身的交换不会影响方法外部的原始引用。修改对象状态:另一方面,当你传递一个对象到方法中,并在该方法内部修改对象的状态(例如,改变一个数组对象的元素),这个改变会影响到原始对象,因为对象的引用指向的是同一个对象。简而言之,方法内部的引用交换不会影响外部的引用,但是对对象状态的修改会影响到所有指向该对象的引用。可以看到,在swap函数中,两个变量的值发生交换,但是在main函数中,未发生交换。值传递:方法接收的是实参值的拷贝。

m0_73173239的博客 633

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1608

每天整点儿Java面试题 - 值传递引用传递

每天整点儿Java面试题 - 值传递引用传递

代码改变世界 464

面试题 | 如何理解引用传递和值传递

自用:从jvm的角度理解引用传递和值传递

你个无聊小demo的博客 167

Java中的值传递引用传递 含面试题

值传递是一种数据传递方式,它是将数据的副本传递给方法或函数。当我们将一个变量传递给一个方法时,方法接收到的是原始数据的副本,而不是原始数据本身。这意味着在方法内部对参数的修改不会影响到原始数据。int x = 10;value = 20;在这个示例中,我们定义了一个名为的方法,它接受一个整数参数value,然后将value的值修改为20。但是,在main方法中,我们可以看到,x的值仍然是10。这是因为在方法内部,对value的修改不会影响到x的值。这就是值传递的特点。

赵KK的博客 842

一道Java面试题引发思考

转载请注明出处 本文出自 容华谢后的博客 目录0.写在前面1.目2.栈内存、堆内存栈内存(stack)堆内存(heap)3.基本类型数据、对象的内存分配基本类型数据对象4.值传递引用传递值传递引用传递:5.String类型String str = “a”;String str = new String("a");6.解分析7.写在最后 0.写在前面 这两天做了一道常见的Java面试题,...

YangLe 544

一个java面试题引发思考

一个java面试题引出的JVM思考

ck1600259860的博客 795

数组形参实参java_一道阿里Java面试题引发思考,害我整整纠结了一个星期

推荐阅读:阿里工作十年拿下P8,多亏了这些PDF陪我成长(Spring全家桶+源码解析+Redis实战等)一线架构师Spring boot 学习笔记:我的成长全记在这份PDF文档里0.写在前面这两天做了一道常见的Java面试题,毫无悬念的做错了,在运行出正确答案之后,发现以自己的知识储备竟然无法完整的解释为什么,十分惭愧,于是有了这篇文章,对其进行总结反思。1.目先看下目:public cla...

weixin_26720479的博客 195

一道面试题引发的争论和思考——Java到底是值传递还是引用传递

直接上: public class Example { public static void main(String args[]) { RandomTest ex = new RandomTest(); String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; in...

程序杨的博客 1391

Java大型互联网公司经典面试题,论JDK源码的重要性的无限思考

论JDK源码的重要性:一道面试题引发的无限思考!大家在看到这个标时想的是什么?小编我为什么要讲这个问呢? 那我们就看一下这道面试题是什么呢?差不多是这样子的面试题 目的意思是:定义了两个Integer类型变量,通过swap方法交换这两个变量的值。 看似简单的目,是不是不知道从何下手,我猜想有些大家第一想到的是这样的解法:来看代码: 运行结果如下: 从结果来看是

Java后端技术 2450

java object对象取值_一道阿里Java面试题引发思考,害我整整纠结了一个星期

推荐阅读:十年Java开发经验整理出来的PDF文档,阿里老司机带你吃透Spring​zhuanlan.zhihu.com阿里架构师玩转spring全家桶(实战篇),附赠三本spring电子书​zhuanlan.zhihu.com0.写在前面这两天做了一道常见的Java面试题,毫无悬念的做错了,在运行出正确答案之后,发现以自己的知识储备竟然无法完整的解释为什么,十分惭愧,于是有了这篇文章,对其进行总...

weixin_39949386的博客 120

论JDK源码的重要性:一道面试题引发的无限思考

那我们就看一下这道面试题是什么呢?差不多是这样子的面试题目的意思是:定义了两个Integer类型变量,通过swap方法交换这两个变量的值。看似简单的目,是不是不知道从何下手,我猜想有些大家第一想到的是这样的解法:来看代码:运行结果如下:从结果来看是错误的,不能解决我们的问。为什么?在分析之前,我们先介绍一下Java访问对象的方式。在 Java 堆中还必须包含能查找到此对象类型数据(如对象类型...

qq_41212104的博客 368

string打印java面试题_一道Java面试题引发思考

封面0.写在前面这两天做了一道常见的Java面试题,毫无悬念的做错了,在运行出正确答案之后,发现以自己的知识储备竟然无法完整的解释为什么,十分惭愧,于是有了这篇文章,对其进行总结反思。人生啊1.目先看下目:public class Test {public static void main(String[] args) {String str = "hello";change(str);Sys...

weixin_39715460的博客 230

一道java JDK面试题引发思考

这道面试题所设计的知识点: 传值和传引用的区别 装箱和拆箱 java的内存模型 反射 面试题需求: 主方法定义两个Integer变量,并赋值,然后通过一个swap()方法交换变量的值,请写出swap()中的实现 public static void main(String[] args) { Integer a = 1; Integer b = 2; System.ou...

haoxiaoyong1014的博客 373

String方法调用面试题引发思考

public class TestString { public void fun(String str) { str = " 张三 "; } public static void main(String args[]) { TestString t = new TestString(); String str = " 李四 "

喜欢炒股的码农 883

交换2个整形数引发思考

目,在main方法中定义了两个成员变量a=1,b=2. 现在需要通过swap方法把a和b的值做一个交换,交换以后输出的结果是a=2,b=1. 思路1 大家看到这道目的时候一定觉得很简单,不用做任何思考就把代码啪啪啪写完了    这种思维逻辑很对,大家从开始学编程就已经学到了中间变量的作用,好比是两个瓶子,一瓶是可乐,一瓶是雪碧,要是想把两个瓶子里面的饮料交换一下,,那么我们首先想...

FeelTouch Labs 598
下一篇: HashMap,Hashset,ArrayList以及LinkedList集合的区别,以及各自的用法
Coder君
博客等级 码龄11年 36粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值