Java 关于OOP中的引用和值
在这个程序中,圆_b的变量“r”或“m”指向对象圆_a的变量,或者它们有一个值(没有指向另一个对象) 编辑:Java 关于OOP中的引用和值,java,reference,Java,Reference,在这个程序中,圆_b的变量“r”或“m”指向对象圆_a的变量,或者它们有一个值(没有指向另一个对象) 编辑: class MyClass {Integer var;} MyClass a = new MyClass(); a.var = 5; MyClass b = new MyClass(); b.var = a.var; b、 var指向a.var或有一个自值(b.var=5)?使用int重新回答您的原始问题,它们有值,而不是引用。使用Integer重新编辑,答案是相同的(它们有值,没有引
class MyClass {Integer var;}
MyClass a = new MyClass(); a.var = 5;
MyClass b = new MyClass(); b.var = a.var;
b、 var指向a.var或有一个自值(b.var=5)?使用
int
重新回答您的原始问题,它们有值,而不是引用。使用Integer
重新编辑,答案是相同的(它们有值,没有引用),但所讨论的值是对对象的引用。(稍后我将进一步介绍。)
每当你看到
a = b
…或
…您看到一个值被复制
对于像int
这样的原语,我们需要说的几乎就这些了。:-)
当所讨论的值引用一个对象时,它被称为“对象引用”。它仍然被复制,但两个副本继续引用(指向)同一个对象
ASCII艺术在这里有时很有用
原语
此代码:
int a = 5;
int b = 0;
Integer a = new Integer(5); // This is effectively what you did with your = 5;, the primitive gets promoted
Integer b = null;
给了我们:
+---+ +---+
| a | | b |
+---+ +---+
| 5 | | 0 |
+---+ +---+
+-------+
| a |
+-------+ +--------------------+
| (ref) |-------->| |
+-------+ | The Integer object |
| primitive value: 5 |
| |
+--------------------+
+-------+
| b |
+-------+
| null |
+-------+
+-------+
| a |
+-------+ +--------------------+
| (ref) |-------->| |
+-------+ | The HashMap object |
| size: 0 |
| |
+--------------------+
+-------+
| b |
+-------+
| null |
+-------+
然后我们有:
+---+ +---+
| a | | b |
+---+ +---+
| 5 | | 5 |
+---+ +---+
+-------+
| a |
+-------+
| (ref) |---+ +--------------------+
+-------+ | | |
+---->| The Integer object |
| primitive value: 5 |
+---->| |
+-------+ | +--------------------+
| b | |
+-------+ |
| (ref) |---/
+-------+
+-------+
| a |
+-------+
| (ref) |---+
+-------+ | +--------------------+
+---->| |
| The HashMap object |
+---->| size: 0 |
+-------+ | | |
| b | | +--------------------+
+-------+ |
| (ref) |---/
+-------+
给了我们:
+---+ +---+
| a | | b |
+---+ +---+
| 5 | | 0 |
+---+ +---+
+-------+
| a |
+-------+ +--------------------+
| (ref) |-------->| |
+-------+ | The Integer object |
| primitive value: 5 |
| |
+--------------------+
+-------+
| b |
+-------+
| null |
+-------+
+-------+
| a |
+-------+ +--------------------+
| (ref) |-------->| |
+-------+ | The HashMap object |
| size: 0 |
| |
+--------------------+
+-------+
| b |
+-------+
| null |
+-------+
然后我们有:
+---+ +---+
| a | | b |
+---+ +---+
| 5 | | 5 |
+---+ +---+
+-------+
| a |
+-------+
| (ref) |---+ +--------------------+
+-------+ | | |
+---->| The Integer object |
| primitive value: 5 |
+---->| |
+-------+ | +--------------------+
| b | |
+-------+ |
| (ref) |---/
+-------+
+-------+
| a |
+-------+
| (ref) |---+
+-------+ | +--------------------+
+---->| |
| The HashMap object |
+---->| size: 0 |
+-------+ | | |
| b | | +--------------------+
+-------+ |
| (ref) |---/
+-------+
给了我们:
+---+ +---+
| a | | b |
+---+ +---+
| 5 | | 0 |
+---+ +---+
+-------+
| a |
+-------+ +--------------------+
| (ref) |-------->| |
+-------+ | The Integer object |
| primitive value: 5 |
| |
+--------------------+
+-------+
| b |
+-------+
| null |
+-------+
+-------+
| a |
+-------+ +--------------------+
| (ref) |-------->| |
+-------+ | The HashMap object |
| size: 0 |
| |
+--------------------+
+-------+
| b |
+-------+
| null |
+-------+
然后我们有:
+---+ +---+
| a | | b |
+---+ +---+
| 5 | | 5 |
+---+ +---+
+-------+
| a |
+-------+
| (ref) |---+ +--------------------+
+-------+ | | |
+---->| The Integer object |
| primitive value: 5 |
+---->| |
+-------+ | +--------------------+
| b | |
+-------+ |
| (ref) |---/
+-------+
+-------+
| a |
+-------+
| (ref) |---+
+-------+ | +--------------------+
+---->| |
| The HashMap object |
+---->| size: 0 |
+-------+ | | |
| b | | +--------------------+
+-------+ |
| (ref) |---/
+-------+
我们得到:
+-------+
| a |
+-------+
| (ref) |---+
+-------+ | +--------------------+
+---->| |
| The HashMap object |
+---->| size: 1 |
+-------+ | | "foo" = "bar" |
| b | | | |
+-------+ | +--------------------+
| (ref) |---/
+-------+
但是a
和b
变量仍然是完全独立的。如果为b
分配新值:
b = new HashMap<String, String>();
b=newhashmap();
你会得到:
+-------+
| a |
+-------+ +----------------------------+
| (ref) |-------->| |
+-------+ | The first HashMap object |
| size: 1 |
| "foo" = "bar" |
| |
+----------------------------+
+-------+
| b |
+-------+ +----------------------------+
| (ref) |-------->| |
+-------+ | A different HashMap object |
| size: 0 |
| |
+----------------------------+
+-------+
|a|
+-------+ +----------------------------+
|(参考)|---------------->||
+-------+|第一个HashMap对象|
|尺码:1|
|“foo”=“bar”|
| |
+----------------------------+
+-------+
|b|
+-------+ +----------------------------+
|(参考)|---------------->||
+-------+|另一个HashMap对象|
|尺寸:0|
| |
+----------------------------+ 这些变量是
int
,原语,它们以值的形式存储,请看它们不是指针,所以它们不指向任何东西。是的,但是对于整数值,会发生什么?你这是什么意思?你能解释一下你想说什么吗?在Integer
的情况下,你只需将新的引用分配给var
,等价物是a.var=Integer.valueOf(1)
,因此a.var
和b.var
将是相等的引用,但这并不重要,因为您不能更改整数(它是不可变的)。然后,que的答案是“不,该值是独立的,您可以更改变量a的值,并且不会修改变量b的值。”,非常感谢。@user3602030:小心点,你真的明白这一点。如果分配给var
(var=someOtherThing;
),则是独立的。但是,如果您修改var
指向的内容(您不能使用Integer
,但显然可以使用大多数类,例如var.modifyMe()
),则会修改var
指向的内容,而不是var
;当然,这种修改可以通过指向同一对象的任何其他变量看到。很好的解释,但我的问题更为具体。请参阅我编辑的帖子plase:)。我说的不是类,我说的是属性。@user3602030:我看不到您的问题有任何未回答的部分,可以更具体一点吗?上面没有谈到类(类是无关的,对于静态成员、实例成员和局部变量都是如此)。重要的是值,以及容器的类型(成员、变量)是基本类型还是对象类型。