Java中的"Object"和"Object Variable"有何区别?

22

我正在自学Java,我的书中的一项复习练习要求解释“对象”和“对象变量”的区别。

我知道什么是对象(类的具体实例),但似乎无法在书(没有答案部分)或互联网上找到“对象变量”这个术语。

有人知道这个术语的意思吗?


31
购买一本新书,最好不要使用编造的术语。 - Brian Roach
2
如果我要猜的话,对象变量就是对象引用,也就是指向对象所在内存位置的指针。 - mistahenry
一个对象变量是一个容器,它保存对类的特定实例的引用。或者简单地称为“变量”或“成员”。 - Robert Harvey
我不明白这个问题为什么主要是基于观点的...这个术语应该只有一个真正的含义,它根本不应该基于观点。 - arshajii
1
很难说 OP 的意思是“变量到对象->引用”还是“对象内部的变量->字段”,这就是为什么它主要是基于个人观点的。 - Pshemo
@arshajii:那是我当时能想到的最好的关闭原因。如果你有更好的建议,我愿意听取。 - Robert Harvey
6个回答

18

我来翻译。

Object是实例本身,而Object Variable是对Object的引用。

以下是一个人为制造的例子:

Object o = new Object();
Object ref1 = o;

在这种情况下,有一个对象的单个实例,但它被两个对象变量o和ref1引用。

当一个对象不再被对象变量引用时,该对象将被垃圾回收。


你确定这个术语实际上是指的什么?我一直以为它是实例变量的同义词。 - arshajii
根据这个网站http://documentation.basis.com/BASISHelp/WebHelp/gridctrl/object_variables.htm,你的答案看起来是正确的。+1 - Vishal K
@VishalK 那里使用的行话是特定于BASIS的。也就是说,在BASIS中,“对象变量”这个术语具有特定且明确定义的含义,不适用于其他语言和面向对象编程的普遍情况。 - arshajii

14

"实例变量"的同义词:

class A {
    static int m;  // <-- class variable
    int n;         // <-- instance variable
    ...
}

显然,这个术语并不常用,最好避免任何潜在的歧义,只需坚持使用“实例变量”即可。


很难说这两个答案哪一个是正确的。无论如何,对于新的观点加一分。 - Pshemo
1
我认为这是术语的正确解释。对象变量是在对象中保持自己的副本的变量。 - jham
只是为了澄清(抱歉无法编辑我的先前评论):在@arshajii的上述示例中,类A的任何实例都将拥有对象变量n的一个独立副本。而变量m的值仅存在于该类的所有实例中一次。 - jham
我对Java了解不够,无法确定哪个答案更好,但看起来两个都可以,既然你想要就这样吧。 - Faaris Cervon

1
我是一名有用的助手,可以翻译文本。

tl;dr;fmoe

:请概括简短地阐述。

我在Cay Horstmann的《Big Java, Early Objects》(John Wiley&Sons,2013),第73页上的评论练习中遇到了同样的问题。

Cay 将对象变量定义为存储指向对象内存位置的引用的变量(其类型为类)。

    Rectangle box = new Rectangle();
  • box 是一个对象变量,它存储了新实例化的矩形对象的内存位置的引用。

可以存在多个对象变量,它们存储相同的对象内存位置引用。

    Rectangle box = new Rectangle(5,10,20,30);
    Rectangle box2 = box;

调用一个改变对象的mutator/mutagenic方法(在被调用的对象上进行修改)会修改对象,因为对象变量引用了相同的对象内存位置。

    box2.translate(15, 25); 
    System.out.println(box.getY()); // 35.0
    System.out.println(box2.getY()); // 35.0

这可能会让人感到有些混乱,如果你将Cay的定义与Java教程和其他许多来源的信息进行比较,但我相信在Cay的书籍背景下放置这是你问题的答案。
我更喜欢这个角度 => 对象的内存位置存储在对象引用中(每个对象变量对应一个对象引用,根据Cay的说法)。当我调用对象上的方法时,我指定对象引用,后跟点(.)运算符,然后是方法名。
    objectReference.method();

如果一个类的公共接口允许访问其一个或多个实例化对象的字段(也称为实例变量、对象变量、类成员变量、属性或特性,取决于编程语言和文档),那么我可以通过指定对象引用,后跟点(.)运算符,后跟字段名来访问它。
    objectReference.fieldName;

为什么我更喜欢这种方式?我不喜欢过多地使用变量作为名词;重载的语义会让我这个简单的头脑混乱。


0

@Faaris Cervon:对象变量是不创建任何对象但引用某些对象的变量.. 例如:Date d1 = new Date();

d1 是一个对象。

date d2; d2 不是一个对象,也不引用任何对象,但它可以持有任何类型为 date 的对象。 d2 = d1; // 有效。

因此,d2 是一个对象变量。 重要的是要记住对象变量实际上不包含对象,而是引用某些对象。


0

我找到了一些可以帮助你的东西。

有一些词像是object、object variable和object reference。

Object variable和object reference在某种程度上是相似的,因为object variable存储对象的引用,而object reference描述了对象的位置。(你可能会感到困惑,所以就把它们视为相同的)

考虑一个例子:

Class Car{
....
....
}

Car AudiQ7; //S1
Car AudiQ8 = new Car(); //S2

在S1中,我们只创建了对象。这意味着它不引用内存。

在S2中,我们创建了一个对象变量/引用,这意味着它引用了内存位置。


0
在大学里,我们学到的对象变量是指:“一个类型为类的变量,它保存了对该类实例化的对象的引用”。
Object thing = new Object();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接