变量,对象和参考之间究竟有什么区别?
例如:它们都指向某种类型,并且它们都必须保存值(当然除非你有临时的无效类型),但它们的功能和实现究竟是如何彼此不同的呢?
示例:
Dog myDog = new Dog(); //variable myDog that holds a reference to object Dog
int x = 12; //variable x that hold a value of 12
他们有相同的概念,但它们有何不同?
答案 0 :(得分:148)
(为了清楚起见,我在这里给出的解释是针对Java和C#的。不要假设它适用于其他语言,虽然它可能有点。)
我喜欢用某种方式告诉某人我居住的地方。我可以在一张纸上写下我的地址:
这有帮助吗?
值类型和引用类型之间的区别在于写在纸上。例如,这里:
int x = 12;
就像有一张纸,上面写着12号。鉴于:
Dog myDog = new Dog();
不会在纸上写下Dog对象内容 - 它会创建一个新的Dog
,然后在该纸上写一条对狗的引用。
以非类比术语:
Button
变量,则该值将始终是对Button
类型或某个子类 - 或null
引用的对象的引用。) .
运算符导航引用。例如,如果foo
是Person
变量,则foo.getAddress().getLength()
将获取foo
(引用)的值,并在该引用的对象上调用getAddress()
是指。结果可能是String
引用...然后我们会在 引用引用的对象上调用getLength()
。答案 1 :(得分:29)
在解释这些概念时,我经常使用以下类比。
想象一个物体是一个气球。变量是一个人。每个人都在值类型团队或引用类型团队中。他们都按照以下规则玩一个小游戏:
值类型的规则:
参考类型的规则:
答案 2 :(得分:7)
你可以把它想象成一个回答问题。
对象是......
它就像世界上任何物质的东西一样,""它本身是可识别的,具有与其他物品区别开来的重要特性。
就像你知道一只狗是一只狗,因为它会吠叫,移动它的尾巴,如果扔掉它就去追球。
变量是......
就像你自己动手一样。每一个都是一只手。它们在皮肤内有手指,指甲和骨头,但你知道一个是左手,另一个是右手。
也就是说,你可以有两个东西"相同类型/种类,但每个人可能有所不同,可以有不同的价值。
参考是......
如果你看一下街道上的两栋房子,虽然它们有自己的立面,但你可以通过一个独特的地址到达每个房屋,这意味着,如果你像远在三个街区或另一个地方那么远国家,你可以告诉房子的地址,因为他们仍然会在你离开他们的地方,即使你不能直接指出他们。
现在出于编程的缘故,以C ++方式举例
class Person{...}
Person Ana = new Person(); //An object is an instance of a class(normally)
也就是说,Ana是一个人,但她有独特的属性,使她与另一个人区别开来。
&Ana //This is a reference to Ana, that is to say, a "where" does the variable
//"Ana" is stored, wether or not you know it's value(s)
Ana
本身是用于存储名为" Ana"
答案 3 :(得分:6)
Jon的回答非常适合从类比中接近它。如果更具体的措辞对你有用,我可以投入。
让我们从变量开始。变量是包含值的[named]事物。例如,int x = 3
定义了一个名为x的变量,它包含整数3.如果我然后用赋值x=4
跟进它,x现在包含整数4.关键是我们没有& #39; t替换变量。我们没有新的"变量x,其值现在为4,"我们只是用新值替换了x的值。
现在让我们转移到对象。对象很有用,因为通常你需要一个东西"从许多地方引用。例如,如果您在编辑器中打开了文档并希望将其发送到打印机,那么只有一个文档,由编辑器和打印机引用,这样做会很好。这样可以节省您复制次数所需的次数。
但是,由于您不想多次复制它,我们无法将对象放入变量中。变量保持一个值,因此如果两个变量保持在一个对象上,它们必须制作两个副本,每个变量一个副本。引用是解决此问题的中间人。引用是一些小的,易于复制的值,可以存储在变量中。
因此,在代码中,当您键入Dog dog = new Dog()
时,new运算符会创建一个新的Dog Object,并返回对该对象的Reference,以便将其分配给变量。然后,赋值为dog
提供对新创建的对象的引用值。
答案 4 :(得分:3)
new Dog()将实例化一个对象Dog ie)它将为对象创建一个内存。您需要访问该变量来操作某些操作。为此你需要一个Dog myDog的参考。如果您尝试打印对象,它将打印一个不可读的值,该值只是地址。
myDog -------> new Dog().