在Java中,对象、引用ID和引用变量有什么区别?

4

以下是Java中以下内容的区别:

  1. Object(对象)

  2. Reference ID(引用ID)

  3. Reference Variable(引用变量)

当我看到这样的语句时:

Emp e = new Emp();

这里的Emp是类名,但e不是它的对象?如果是这样的话...我在其他地方看到了类似以下的代码:
如果确实如此,那么就会有类似下面的代码:
Emp e = new Local(); 

在这种情况下,e 是什么意思?它代表什么?eEmp的子类local的一个实例。


一个引用变量就像是一个对象的GPS坐标,而引用ID则相当于它的街道地址。 - Hot Licks
如果我们只是执行 Emp e; 那么这是否意味着 'e' 没有任何 GPS 坐标和街道地址。 - Ratan Kumar
在这种情况下,e 是一个包含空引用的对象变量。 - Louis Wasserman
1
@HotLicks 你在说什么? - user207421
8个回答

3

对象本质上是存储在堆中的一块内存。 (对象的内存结构包括对该对象类的引用。)

Java中的对象变量(例如本例中的e)包含指向存储在堆中的对象的引用

类与所有这些完全不同;它们可能描述该类型的对象的结构,并具有方法实现等,但是类与其他对象的内存区域完全不同。


1
通过“引用变量”,您可能指的是对象变量。 “引用ID”这样的东西是不存在的。 - Louis Wasserman
@HotLicks 是哪个早期版本?自从1997年我开始使用JNI以来,JNI引用始终是jobject、jclass、jstring等类型,最终是指针。方法和字段引用始终是IDs,最终是整数。 - user207421
引用不是指向对象的指针,而是直接或间接地表示ID。 - Hot Licks
@HotLicks,你说了,但你没有回答我的问题。 - user207421
我们从 Sun 得到了预先发布的文档。 - Hot Licks
显示剩余2条评论

3
Emp e

这个语句在堆栈中创建一个引用变量'e'。

    new Emp()

此语句在堆中创建一个对象。对象只是一个缓存区或我们可以说是“一块内存”。因此,缓冲区在堆中被保留。因此这个语句,
   Emp e=new Emp() 

将堆中创建的对象的引用ID传递给引用变量“e”。

1
Emp{
int salary;
int name;
}

新建 new Emp(); Emp是一个类,new用于在堆中预留内存区域。New返回它所保留的内存的地址。 只要你写了new Emp(),就会在堆中预留一个内存缓冲区。所预留区域的大小取决于类的数据成员的大小(这里是2个字节,因为int salary占1个字节,int name占1个字节)。

引用ID 对象的引用ID是存储对象的位置的地址。 new Emp()创建了对象,但其地址没有被存储和捕获。

引用变量 现在,假设您想一次又一次地使用同一个对象,则必须具有其地址位置(引用ID)。 为了存储其地址ID(ReferenceId),可以使用引用变量。 引用变量始终占用4个字节,它们只是存储地址(对象引用)的变量。

创建引用变量 Emp e2;

将引用ID分配给引用变量 Emp e2 = new Emp();


1
这里:
Emp e=new Emp();

e是一个引用变量,它保存在堆区域中创建的对象的地址。

参考ID以哈希代码的形式生成,借助于对象的魔术方法(对象具有总共9个方法)即toString()方法; 在内部,使用对象的toString方法,它会自动为运行时创建的每个对象生成Ref id。

对象的内存始终在RAM的堆区域中保留。由于Java中没有显式指针,因此ref变量指向堆栈,以便为对象保留内存; 因为对象也不知道内存在哪里。

堆栈段也是内存的一部分:当我们给出引用变量时,引用变量必须已经存储在堆栈中,然后引用变量知道堆中的哪个部分是空闲的,并将其指向对象保留位置并保存在引用变量中。

'new'是一个可文本化的运算符,它帮助创建对象。

Emp()是类的子类;如果Java程序员没有明确提供构造函数,则编译器会隐式添加默认构造函数,并且之所以将子类名称命名为相同的类名称是因为“new”可以轻松地了解非静态数据成员需要多少内存。


0
我刚刚编写了一个程序,用于显示对象的参考ID。
class abc
{

   int a=10;
   int b;
}

class t extends abc
{

   public static void main(String args[])
   {
     abc A=new abc();
     System.out.println(""+A);
   }
}

输出:令人震惊的十六进制字符串:

“abc@52e922”

Java将对象的实际位置以十六进制字符串的形式映射到一个单独的位置,这被称为引用ID。它从不显示存储在内存中的对象的实际位置。


感谢 @Mukesh Ram - Jane

0

这是一个简单的问题...

emp e=new emp();

这里,e 是指向对象的引用ID。 emp 是指向类的引用变量,而您的对象ID不同,它是状态和行为的组合..


0

Car c=new Car();

对象是什么都不是,它只是堆中缓冲区或内存,非静态数据成员获得该内存。

引用ID是由new运算符在栈中生成的内存位置,它包含以哈希码形式存储的对象内存位置。 引用ID是访问对象的唯一方式。 生成引用ID是因为在Java中存在一个规则,即在运行时分配的内存没有任何名称,我们都知道对象是在运行时创建的,因此它们也没有名称,我们需要一个唯一的ID来执行该操作 对象,这就是为什么在Java中每个对象都有一个唯一的引用ID。

在上面的例子中,c是一个引用变量,它存储引用ID。


-1

对象本身并不存在,它只是堆区中的一个内存区域或缓冲区,其中类的所有实例数据成员都在获取内存。

Emp e = new Emp();

在上述语句中,e是一个引用变量,它保存了对象的引用ID,但出于安全考虑,Java不允许任何人获取实际对象的ID。这也可以自我解释,因为我们使用的是“引用ID”一词,它指示我们并没有获取到对象的实际ID,而只是它的引用。

此外,引用ID将被命名为类名@对象的#代码的十六进制表示形式。


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