变量、对象和引用之间的区别是什么?
例如:它们都指向某种类型,并且它们必须都保存值(除非您使用了临时的可空类型),但是它们的功能和实现方式究竟有何不同?
示例:
Dog myDog = new Dog(); //variable myDog that holds a reference to object Dog
int x = 12; //variable x that hold a value of 12
它们拥有相同的概念,但是它们有什么不同之处呢?
变量、对象和引用之间的区别是什么?
例如:它们都指向某种类型,并且它们必须都保存值(除非您使用了临时的可空类型),但是它们的功能和实现方式究竟有何不同?
示例:
Dog myDog = new Dog(); //variable myDog that holds a reference to object Dog
int x = 12; //variable x that hold a value of 12
它们拥有相同的概念,但是它们有什么不同之处呢?
仅针对Java和C#语言的说明,不要假设它适用于其他语言,尽管其中有些部分可能适用于其他语言。
我喜欢使用一个比喻来告诉别人我住在哪里。我可能会把我的地址写在一张纸上:
这是否有帮助?
值类型和引用类型之间的区别在于纸上写的内容。例如,在这里:
int x = 12;
就像直接在一张纸上写着数字12一样。
Dog myDog = new Dog();
它并没有在纸上写下Dog
对象的内容 - 它创建了一个新的Dog
,然后在那张纸上写下狗的引用。
非类比术语:
Button
变量,则该值将始终是对Button
或某个子类对象的引用 - 或null
引用。).
运算符浏览引用。例如,如果foo
是一个Person
变量,则foo.getAddress().getLength()
将获取foo
的值(引用),并在该引用所指的对象上调用getAddress()
。结果可能是一个String
引用...然后我们在该引用所指的对象上再调用getLength()
。当我解释这些概念时,我经常使用以下类比:
想象一个物体是气球。一个变量是一个人。每个人都可以在值类型组或引用类型组中。他们都在玩下面的游戏:
值类型规则:
引用类型规则:
现在为了编程的缘故,以C++方式举例
class Person{...}
Person Ana = new Person(); //An object is an instance of a class(normally)
&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”的人的属性的变量。
Person Ana = new Person();
中的星号 *
在哪里?应该是 Person* Ana = new Person();
,对吧? - Second Person Shooter如果您需要更具体的表述,我可以帮忙。
让我们先从变量开始。变量是一个[有名字的]东西,它包含一个值。例如,int x = 3
定义了一个名为x的变量,其中包含整数3。如果我跟着这个赋值操作x=4
,那么x现在包含整数4。关键的一点是,我们没有替换变量。我们没有一个新的 "变量x,其值现在是4",我们仅仅用一个新值替换了x的值。
现在让我们来看看对象。对象是有用的,因为通常你需要一个“东西”被多个地方引用。例如,如果你在编辑器中打开一个文档,并想将其发送到打印机,只需要一个文档被引用即可。这样可以节省你不必要的复制次数。
然而,因为你不希望复制它超过一次,我们不能只把一个对象放在一个变量中。变量保存一个值,所以如果两个变量持有一个对象,它们将不得不制造两个副本,每个变量一个。引用是解决这个问题的中间人。引用是容易复制的小值,可以存储在变量中。
因此,在代码中,当您键入Dog dog = new Dog()
时,new运算符将创建一个新的Dog对象,并返回对该对象的引用,以便可以将其分配给变量。然后赋值将给dog
一个对新创建对象的引用的值。
new Dog()会实例化一个名为Dog的对象,也就是说它将为对象创建一块内存。你需要访问变量以执行一些操作。为此,你需要一个引用,即myDog狗。如果您尝试打印该对象,它将打印一个不可读的值,这就是地址。
myDog -------> new Dog().