关于传值的问题

关于传值的问题

  1. 基本数据类型传值,在主方法中声明并初始化的变量,传给方法的参数,如果方法中进行修改,最后主方法输出此变量发现还是初始值。这是为什么啊?

  2. 引用数据类型传值,在主方法中声明并初始化的变量,传给方法的参数,如果方法中进行修改,最后主方法输出此变量发现是修改后的值。这又是为什么?

  3. 在Java中String类型是什么类型的数据?是引用类型么?如果是引用类型那为什么我代码测试发现其值不会变?(代码是这样的:测试类Test,主方法中String s="1"; 类的方法public void test(String a){a="2";},主方法传值,最后输出s,发现还是1)。还是说我哪里理解的有问题?请老师指教。

正在回答

登陆购买课程后可参与讨论,去登陆

3回答
  • 写错了,age里值应该是一样的要么都是10,要么都是18
    2020-03-28 09:34:38
苍星乱舞 2020-03-27 23:15:48

基本数据类型当你定义变量时,就相当于给一个盒子起了一个名字(int age;)然后当你给变量赋值时相当于把一个东西装在了箱子里(age = 10;),那么你知道盒子的名字以后就可以使用了,比如打开盒子看看里面的东西,或者换一个其他东西装进去。

引用数据类型也一样,当你定义一个变量时也相当于给一个盒子起了一个名字(String name;)然后当你给变量赋值时有了困难,就目前你知道的两种引用类型来看一个数组,一个字符串。你会发现这两个和基本数据类型不同,他们的大小不确定,数组可大可小,字符串可长可短。

那我的盒子应该买多大的呢?买小了装不下,买大了浪费。只要是固定的大小都有问题,而基本数据类型是固定大小的盒子,这也是为什么各种基本数据类型有最大值最小值的原因因为盒子大小是固定的。所以在你盒子里装的并不是东西本身,而是一张藏宝图。于是当你赋值给引用型变量时总是要先 new String("你好");这就是去找一个足够装的下宝藏的地方,放进去东西然后把位置装进盒子(引用变量)里。

所以当你通过方法传参时,相当于别人有了和你盒子里一样的东西,大家都有一份(因为计算机里都是信息嘛,不会你有了我就没有,大家信息都一样了)。因此无论是传基础还是引用别人修改他盒子里的信息你都不会有影响。

唯一有影响的是如果别人是通过藏宝图去把宝藏给修改了,那你就会有影响,因为是指向同一份宝藏的位置。而你第三个问题里只是别人换了一张藏宝图,一开始是装“1’宝藏现在是指向装“2”的宝藏,于你自己而言是依然是装“1”的宝藏。

如能理解,请采纳!

  • 提问者 慕容2892559 #1
    大佬,我有点似懂非懂啊。能从计算机原理的角度分析下么?(就那些栈、堆什么东西的)
    2020-03-28 08:48:17
  • 苍星乱舞 回复 提问者 慕容2892559 #2
    我看了你发的手记,理解的不对哦。 首先是内存分为两大部分,一个是栈一个是堆(常量池,方法区什么的也是在堆中),然后一点是堆的空间比栈的空间大。 方法中定义的变量是保存在栈中,其他情况比如类中定义的变量是保存在堆中。 你对基本数据类型和引用数据类型,栈和堆这四个概念掺杂的太混了。 基本数据类型和引用数据类型是保存数据的两种逻辑方式,栈和堆是保存变量的两个物理内存的划分。 栈里可以保存基本数据类型,也可以保存引用数据类型。 同样堆里可以保存基本数据类型,也可以保存引用数据类型
    2020-03-28 09:03:07
  • 提问者 慕容2892559 回复 苍星乱舞 #3
    大佬,方法中定义的变量保存在栈中,这句话是不是有问题啊?如果方法里定义引用型变量呢,也存储在栈中么?类中定义的变量保存在堆中,这句话是不是也有问题啊?类的成员属性可以定义基本数据类型,也可以定义引用数据类型啊,都存储在堆中么? ?,我也是刚在网上学习这些知识,没学明白。。。。这个课程里没讲,课程讲的是语法知识,这个我看网上好像是JVM的知识,可是我挺想了解的。。大佬你是在哪里学到这些的啊?
    2020-03-28 09:11:24
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师