Java中的对象与引用

18

在Java中,如果我声明:

MyClass obj;

在这里,obj是被称作"引用(reference)"还是"对象(object)"?我没有实例化类。


1
有趣的是,在C++中,这将实例化一个对象 :-). - helpermethod
8个回答

20

obj是MyClass的实例的引用。

当前,该引用为NULL,因为您尚未将其分配为引用任何实例。

从技术上讲,MyClass必须是Object的子类,因此也可以说obj是Object的实例的引用。


2
我觉得这很令人困惑!你能否再解释一下。 - Sanal S

19

参考: 指向内存中某个对象的变量。 它被存储在堆栈中,也可以包含在其他对象中(这时它们不是真正的变量,而是字段),这将把它们放置在堆中。

对象: 动态创建的类实例。 它存储在堆中。

示例:

MyClassI aObj,aObj1;

aObj=new MyClass2();

在第一行,aObj和aObj1是引用。

在第二行,aObj引用了MyClass2的对象(new运算符创建了MyClass2的对象,并将其地址分配给aObj)。

为了更好地理解,考虑一个拥有driverName成员的Car类。

Car c1,c2;

c1.driverName="Andrew"
c2.driverName="Gabriel"

System.out.println(c1.driverName);//gives Andrew
System.out.println(c2.driverName);//gives Gabriel

c1=c2;

c2=null;

// gives gabriel because the address of c2 is copied to reference c1.
// the object is not nullified because c2 is just a reference when 
// assigning null the address that is stored on c2 in nullified not 
// the object it points..

system.out.println(c1.driverName);

“在第一行,aObj和aObj1是引用” - 这是不正确的。它们是对象变量,并且它们未初始化,因此当编译Javac时会出现错误。只有在应用赋值运算符=时,它们才会成为引用。例如:aObj=null 在这种情况下,aObj 是一个 null 引用,而在这种情况下 aObj=new MyClass2();,它是指向类型为 MyClass2 的对象的引用。 - Faiz

3
在计算机科学中,引用是一种值,它使程序能够间接访问计算机内存或其他存储设备中的特定数据项,例如变量或记录。引用被认为是对数据项的引用,访问该数据称为解除引用。
在计算机科学中,对象是可以通过编程语言的命令进行操作的任何实体,例如值、变量、函数或数据结构。(随着面向对象编程的普及,“对象”这个词也指代类的特定实例)
因此,obj是一个引用,而new MyClass()可以被看作是一个对象。

1
new MyClass() 创建 了一个对象,但 返回 一个引用作为结果。 - user207421

1
  • 在Java中,所有对象都是通过引用访问的,你永远不能直接访问对象本身。
  • 引用:是一个具有名称并可用于访问对象内容的变量,可以将引用分配给另一个引用传递给方法或从方法返回。所有引用的大小都相同,无论它们的类型是什么,如 "Object object;"。

  • 对象:是存在于Java运行时环境分配的内存中的实体,对象位于堆上且没有名称,例如 "Object object = new Object();"。

  • 因此 MyClass obj 这里是指向 Null 的引用

  • 我们可以用以下两个规则总结这个原则:

    1. 对象的类型决定了内存中存在哪些属性。
    2. 对对象的引用的类型决定了Java程序可以访问哪些方法和变量。

1
引用是一个具有名称并可用于访问对象内容的变量。引用可以分配给另一个引用,传递给方法或从方法返回。 所有引用的大小都相同,无论它们的类型是什么。 对象位于堆上,没有名称。因此,您无法通过其他方式访问对象,只能通过引用访问。对象有各种形状和大小,并占用不同数量的内存。对象不能分配给另一个对象,也不能传递给方法或从方法返回。被垃圾回收的是对象,而不是它的引用。

1

obj是MyClass类型的引用。目前该引用没有指向任何对象(即:null)。


1
有时候你会听到人们说“设计一个以对象为参数的方法...”
如果你是编程新手,尤其是对于Java来说,这些话可能会导致一些困惑。这些人使用“对象”一词来指代通用OOP术语中的类实例,不一定是Java特定的。
当我们谈论Java和你所拥有的代码的具体细节时,它是指一个MyClass实例的引用,该引用为空。

1
'

obj

是一个变量。它可以保存一个引用或者null值。如果它保存的是一个引用,那么引用指向的是一个对象。

'

我见过一些空引用异常,可能会不同意这个说法 :P - Jeff
@Jeff:不,你看到的是一些空指针异常。指针要么是引用,要么是null。 - user207421
你说得对。我把Java和C#搞混了,C#确实有空引用异常。 - Jeff

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