Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中类引用的行为_Java_Class_Object_Reference - Fatal编程技术网

Java中类引用的行为

Java中类引用的行为,java,class,object,reference,Java,Class,Object,Reference,据我所知,Java中的类对象实际上是对这些对象的引用。对象本身不能有变量,只能有对它的引用 SomeClass A = new SomeClass(); SomeClass B; B = A; 考虑下面的C++示例: SomeClass A(5); SomeClass &B = A; SomeClass &C = B; 现在,我想我说得对,下面的三个陈述都将使用完全相同的对象: A.someMethod(); //some object B.someMethod(); //t

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

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

考虑下面的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

请告诉我是对还是错。< /P> < P> java引用与C++引用非常类似。将一个参照指定给另一个参照不会创建新对象。在Java中,仅当显式使用
new
操作符时,才会创建新对象

附录:


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

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

    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

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

你错了。你知道这对你自己来说是多么容易测试和发现吗?引用不是一个对象。引用是(不要告诉任何人!)指向对象的指针。@Matt+1。考虑到对这个问题的关注程度(格式和表达都很好),真的很奇怪。对任何对象来说都是真的(你错了),但你认为不可变对象是什么?这不是Java中的语言构造。字符串常量永远不会创建新对象。在运行时表示字符串文字的String对象在代码执行之前创建一个interned。相反,取消装箱可能会导致在运行代码时创建对象。。。但它并不总是如此。@StephenC谢谢你的澄清。我试图限定我的陈述,即只使用
new
创建对象,因为一些语言会出现,并告诉我文字字符串对象不是这样创建的。我希望我更新的答案更准确。“为了完整性”-您还应该提到Java中的对象可以通过反射或对象反序列化来创建,两者都不涉及
new
操作符。事实上,更好的方法是简单地说明在Java中,变量声明或赋值都不会创建新对象。(另一方面,C++引用/指针的赋值通常也不创建对象。它可能会创建一个新的对象,但是只有当你做了一些有点奇怪的运算符重载时))斯蒂芬克感谢你的评论!1这是不正确的。赋值后,两个引用将指向同一对象。未复制对象。+1用于更正OP示例中的注释