我有一个名为GUI的类,因此我可以创建这样的对象:
GUI g1 = new GUI();
并且一个像这样的引用变量:
GUI g2;
据我所知,g2是一个引用变量,它引用了GUI类,而g1是GUI类的一个对象。g1和g2之间有什么区别?我可以使用对象来调用GUI类的属性,但是g2可能有什么用途呢?
参考是名称,对象是东西。您可以为东西使用不同的名称,即使是对于实际不存在的东西。
您可以声明名称,而不给它们任何“真正”的含义,像这样:
GUI g1;
你可以使用 = 运算符给名称赋予意义(真正的东西来引用):GUI g1 = some_gui;
名称的含义随着时间的推移而变化。在历史的不同时期,同一个名称可以指代不同的事物。
GUI g1 = some_gui;
doSomething();
g1 = some_other_gui;
还有同义词:多个名称可以指代同一事物:
GUI g2 = g1;
这基本上就是引用所做的事情。它们是用来指称东西的名称。
可以创建“东西”:
new GUI();
这里的东西可以即时创建并命名,以便稍后进行引用(真的!):
GUI g1 = new GUI();
使用名称(或任何名称)可以引用物品:
g1.doSomething();
g2.doSomethingAgain();
可以创建同一种类(类)的不同实例,并命名它们不同:
GUI g1 = new GUI();
GUI g2 = new GUI();
GUI g3 = new GUI();
GUI g1_synonym = g1;
:)
class GUI
{
void aMethod()
{
// some business logic.
}
}
您可以使用或不使用引用来调用aMethod
,但是您一定需要一个对象。
无需引用:
new GUI().aMethod();
// you can't reuse the object
// bad way to code.
参考资料:
GUI aGUIReference = new GUI();
aGUIReference.aMethod();
// Now, the object can be reused.
// Preferred way to code
GUI g1 = new GUI();
// g1 is a reference to an object of GUI class.
GUI g2;
// g2 is a reference that can point to an object of GUI class
// but currently not pointing to any.
g1
和g2
唯一的区别在于g1
被初始化为一个对象,而g2
指向null
g2 = g1;
// it means g2 will point to the same object g1 is pointing to
// only one object but two references.
在为g2
分配一个对象之前,您无法使用它,因为它目前没有指向任何对象,而g1
已经指向了一个GUI
对象,您可以使用它。
这个:
GUI g1 = new GUI();
这几乎等同于:
GUI g1;
g1 = new GUI();
引用(References)
是指向名为对象(objects)
的一块内存的指针。
GUI g1 = new GUI();
为了解释,让我把上面的陈述分开来。
GUI g1;
g1 = new GUI();
第一步: g1
是一个引用变量(指针),尚未指向任何有效的内存位置。
第二步:第二步为类GUI
的对象分配内存,并使赋值操作使引用变量g1
指向该对象(内存位置)。
new
关键字为类GUI
的对象分配内存。
对象就像在堆空间中漂浮的气泡。变量只是指向这些气泡的链接。表达式new GUI()
创建一个对象,并使用=
运算符将其链接到变量g1
。 g2
也是一个变量,但它没有链接到任何对象。您可以通过编写以下内容轻松交换它们:
g2 = g1;
g1 = null;
g2
指向一开始g1
所指向的对象,而g1
则不再指向任何东西。对象保持原状,只有变量被更改。g1和g2都是引用。但是g2没有被初始化,所以不能在代码中使用。
//Tells that g1 g2 should hold Gui object. Currently they are not holding any object.
Gui g1;
Gui g2;
//Now g1 reference holds object. g2 reference still doesn't point to any object.
g1 = new GUI();
g2
,因为它尚未被初始化,甚至不是null。如果尝试为g2调用方法,则会在编译时出现错误。在GUI g2;
之后,g2没有指向内存中的对象。如果像这样将g2
设置为null:GUI g2 = null;
,则可以在声明后使用它,但是如果为g2调用方法,则会在运行时出现NullPointerException。引用是一个“钩子”,你可以在上面挂一个对象。 一个对象可能会在多个钩子上。
GUI g2
,这是否意味着它必须是 GUI 类的对象? - Rahul Virpara