永发信息网

一个java小程序,不懂为什么这个结果,高手进

答案:4  悬赏:60  手机版
解决时间 2021-07-30 11:36
public class FF
{
static class IntA
{ private int a;
public IntA(int a){ this.a = a; }
public int getA() { return a; }
public void setA(int a){ this.a = a; } }
static public void change(int a){ a = 3; }
static public void change(IntA a){ a.setA(3); }
static public void changeRef(IntA a){ a = new IntA(19); }
public static void main(String[] args)
{ int a = 2;
change(a);
System.out.println(a);
IntA ia = new IntA(5);
change(ia);
System.out.println(ia.getA());
changeRef(ia);
System.out.println(ia.getA()); } }

结果是233
前面是23我可以理解
但最后一个3我实在不太清楚,为什么不是9而是3呢?
最佳答案

因为对象类型在传参的时候,传递的是内存地址。


调用change(ia) ia和a,指向的是同一个对象,既然是同一个对象那么ia.a=a.a=3


调用changeRef(ia) ia指向的还是ia.a=3 这个对象,而a指向了一个新的对象new Integer(19);


因为你输出的ia.getA();所以是3

全部回答
static public void changeRef(IntA a){ a = new IntA(19); } changeRef(ia); 传进去的ia和参数a虽然说是指向中一个内存, 但是它们是不同的引用, 你在方法中只是改变了a的指向, 但是对ia的指向并不会产生影响

change(ia); ia和 a都指向堆内存里的IntA ia //ia.a=3

changeRef(ia); ia指向堆内从里的IntA ia//ia.a=3 a指向堆内存新的IntA()//a.a=19

这个主要是引用类型在搞鬼 类比c++里边的指针

因为程序先运行的构造函数

所以最后先输出3

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
如果有一个 人她很爱你,但你不 怎么喜欢她
黄坦乌岩寺在什么地方啊,我要过去处理事情
张湾区十堰张湾区方山路和电子秤重站在什么地
今天载了一个photoshop cs2 9.0 可是怎么也找
圣城家园极品飞车12安装教程
公历2005年10月10日是农历几月几日
怎样,我才会不在玩,好好的学习
小孩子常喝纯牛奶(盒装的)好吗?
英语俚语 口语 俗语有什么区别,GRE不提倡俚语
我应该高兴吗
冬天小宝宝用什么面霜好呀
地下城与勇士中的艾克洛索的灵魂球去那能打到
身上有浮肿的现象?
通道侗族自治县怀化国家税务总局通道侗族自治
常德哪所高中允许剪发型
推荐资讯
如果有乞丐象你乞讨~你怎么办?给还是不给?
已经有爱的人,为何还会喜欢上别人?
http://v.youku.com/v_show/id_XOTYyMTE3Njg=
墙梁板连接的要点
建安区许昌隆盛大药房(大森林店)这个地址怎么
汤原县中国银行业监督管理委员会佳木斯监督分
大家帮我看看这是F5不?(天龙八部)
1.电脑怎么通过诺基亚5300手机GPRS上网
好想好想,
零陵区永州大囍我要开口笑这个地址怎么能查询
圣诞节送女朋友什么礼物最好啊!
电脑看时间久了,怎样防护?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?