楼主: 匿名
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] Java问题: int[] 定义出来的东西是object,还是reference呀

🔗
Congeec 2021-1-16 12:55:28 | 只看该作者
全局:
key words are boxing and unboxing, or primitive data types
回复

使用道具 举报

🔗
Pizi-G 2021-1-16 14:11:37 | 只看该作者
全局:
我觉得你可能吧 object vs reference 想成了 C/cpp 的 变量 vs 指针了

如果你按 "变量 vs 指针" 想, 那肯定觉得奇怪了, "怎么可能我可以往一个指针上 .add() "

Java 里没有指针. reference 也不是指针的意思. 虽然在内部概念上有重合. 是指向了一个内存里的一个位置. 但是 reference 就是直接拿到那个 object. 不是说 java 里存在一种叫 object 的东西, 一种叫 reference 的东西. 而是 java 里你用的任何 object 都是 reference (相对于任何的 primary types 都是值 - 不是 reference). 比如下边例子:

pt1 = new Point(100, 100);
pt2 = pt1;  // 因为 object 是 reference, 所以这时 pt1 和 pt2 就是指向同一个 object
pt1.x = 200;  // 这时 pt2.x 也变成了 200

但是不是 reference 的情况 - primary types 就是
String a = "aaa";
String b = a;
b = "bbb";
System.out.println(a);  // 还是 aaa

评分

参与人数 4大米 +5 收起 理由
gyroid + 1 赞一个
ysz951 + 1 赞一个
ericwxr + 1 赞一个
JoshuaSu + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
JoshuaSu 2021-1-17 10:34:09 | 只看该作者
全局:
AlstonLYG 发表于 2021-1-16 14:11
我觉得你可能吧 object vs reference 想成了 C/cpp 的 变量 vs 指针了

如果你按 "变量 vs 指针" 想, 那 ...

我觉得你的解释很到位。
回复

使用道具 举报

全局:
AlstonLYG 发表于 2021-01-15 22:11:37
我觉得你可能吧 object vs reference 想成了 C/cpp 的 变量 vs 指针了

如果你按 "变量 vs 指针" 想, 那肯定觉得奇怪了, "怎么可能我可以往一个指针上 .ad
我觉得你这个例子有一些瑕疵,因为第一个point的例子是操作pt1的field x,而pt1本身没有发生变化;第二个例子里面b直接指向了第二个string,那当然和a没有关系了。如果第一个例子里第三句改成pt1=new Point…的话,和第二个例子应该行为是差不多的。
另外java里string是primitive type吗?我印象里String是final object吧,只有像rust才会区分String和str……
回复

使用道具 举报

🔗
Pizi-G 2021-1-17 12:25:27 | 只看该作者
全局:
harold1385 发表于 2021-1-16 19:42
我觉得你这个例子有一些瑕疵,因为第一个point的例子是操作pt1的field x,而pt1本身没有发生变化;第二个 ...

那不是瑕疵啊... 那就是我要解释的重点. 也正是 lz 不理解的部分.
pt1, pt2 都 object 的 reference, 当你 assign a field of the referenced object, 不管你是用 pt1  /pt2 哪个 reference, 你修改到的都是那个 object. 但是 pt1 pt2 是两个 reference.

如果举例 pt1 = new point().  pt2 = new point(), 那这两完全不相关, 那谁都知道改了一个另一个不变... 我是用两个 reference 指代同一个 object 来说明 reference 是什么意思.
回复

使用道具 举报

🔗
tachy_9 2021-1-19 14:48:58 | 只看该作者
全局:
匿名者 发表于 2021-1-16 11:09
感谢同学。

“你的32行是把一个array的reference加到arraylist里了”   --》 是的,我就这么想的,但 ...

因为你后面的操作并没有改array,而是在arraylist<int[]>这个容器里“取出”“修改”“加入”int[] array,这是你这道题的expected behavior,所以是没问题的。如果你的代码是
1. 先定义一个int[] - int[] first = new int[]{0, 0};
2. 把temp存到arraylist - temp.add(first);
3. 你在取出temp之前,意外修改了还在arraylist里的int[]。比如我们假设刚才的first存在temp的index=0的地方,然后你的代码跑了temp.get(0)[1] = 1; - 这里你刚才存入的那个first就是{0, 1}而不是原先的{0, 0}了
4. 然后你再运行后面的代码就会发现结果是不对的,因为你存在arraylist里的东西和一开始初始化时候的不一样了
回复

使用道具 举报

🔗
chasedream888 2021-1-19 16:12:59 | 只看该作者
全局:
你用一台望远镜看着月亮,然后刚好这个望远镜现在需要观察火星了,没办法,你又换了一台望远镜,太阳没变,望远镜变了,不过没啥错,照样观察
回复

使用道具 举报

🔗
GuoJSeven 2021-1-19 23:21:54 | 只看该作者
全局:
AlstonLYG 发表于 2021-1-17 12:25
那不是瑕疵啊... 那就是我要解释的重点. 也正是 lz 不理解的部分.
pt1, pt2 都 object 的 reference, 当 ...

你举的这个例子错了,而且解释得点也不恰当:reference type 应该这样解释,他存储的是一个对象存放在内存上的地址,当这个对象为可变对象,修改对象的内容并不会改变reference变量的值(相对不可变变量来说),对象仍旧存放在原地,而b = "bbb"这样的操作,是直接让b引用一个新的对象,不要说primitive type了,就算是reference type 也会不会共同引用原来对象("aaa")的变量产生影响,因为这个时候两个变量引用两个不同对象了。
String类型不是primitive type而是reference type,并且在这个例子中不能当作reference类型来讲,因为他是不可变的,如果你改变它的字符,那么会初始化一个新的对象,等同与让这个变量引用这个新的对象,这是可变与不可变的问题,和是不是primitive type无关。
Print方法不能当作判断对象是否改变的办法,如果对象没用重写toString方法,那么改变一个可变的reference type的引用的对象,并不会改变其打印出来的内容(print方法默认打印出的内容直接与对象地址相关,而这里地址不变)
回复

使用道具 举报

🔗
frankzhr 2021-1-20 08:43:01 | 只看该作者
全局:
In general, int[] array = new ArrayList<>(); 等号左边array可以理解成一个指针,存储在stack上,这个东西指向(refer to)等号右边的ArrayList这个Object, which is stored in Heap
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表