0

据我所知,Java 中的类对象实际上是对这些对象的引用。对象本身不能有变量,只能有对它的引用。

考虑以下 C++ 示例:

SomeClass A(5);
SomeClass &B = A;
SomeClass &C = B;

现在,我认为我说的对,以下所有三个语句都将使用完全相同的对象:

A.someMethod(); //some object
B.someMethod(); //the same object
C.someMethod(); //the same object

然而,在 Java 中,虽然对象实际上是引用,但使用赋值运算符将创建一个全新的对象,并为其提供新的引用。

SomeClass A = new SomeClass();
SomeClass B;
B = A;

现在,方法调用将从完全不同的对象调用:

A.someMethod(); //uses one object
B.someMethod(); //uses entirely different object

请告诉我我是对还是错。

4

3 回答 3

2

Java 引用与 C++ 引用非常相似。将一个引用分配给另一个引用不会创建新对象。在 Java 中,只有在显式使用运算符时才会创建新对象new

附录:

为了完整起见,我应该提到 String 对象遵循自己的规则。特别是,String 常量在编译时创建一个对象,而无需显式使用new. 此外,自动(取消)装箱是一个更高级的主题,其中创建对象时无需显式使用new. 但是,这两种情况的要点仍然存在:将一个引用分配给另一个引用不会创建新对象。两个引用都指向同一个对象。

于 2012-11-27T04:03:16.417 回答
2

引用不同于对象。一个特定的对象可以有多个指向它的引用。在编译时调用类的方法时,总是检查类引用是否包含在其类中定义的方法。如果不是,则会发出编译时错误。如果该方法在给定类的子类中被覆盖,则在运行时调用被覆盖的方法。在编译时总是<class-ref>.method()检查'class-ref'以查看它是否包含方法定义。其他修饰符,如 static、final、abstract、方法可见性也在编译时检查,如果使用了错误的方法修饰符组合,则会发出编译时错误。

    SomeClass A = new SomeClass();
    SomeClass B;
    B = A;        // Same class, same object, different reference


A.someMethod(); //uses one object
B.someMethod(); //uses the same object
于 2012-11-27T04:21:58.783 回答
-2

兄弟实际上,当您对对象(A = B)进行相同的引用时,java似乎正在创建完全不同的新对象。但实际上,java 会为您在示例中所做的另一个引用提供对象的副本,A 和 B 指的是同一个对象,但它们有自己的 SomeClass 类型对象的副本。与 C 语言的按值调用相同。您可以使用和修改该对象,但对该对象进行的修改不会影响原始副本或其他副本,这意味着如果您使用引用 B 修改 SomeClass 对象,它将不会影响引用 B 的对象,尽管两者都引用相同的对象,但它们有自己的副本。

于 2012-11-27T04:37:09.617 回答