我在调用非静态方法时感到困惑
class A {
void doThis() {}
public static void main(String... arg) {
A a1 = new A();
a1.doThis(); // method - 1
new A().doThis(); // method - 2
}
}
我知道方法-1 和方法-2 都会调用 doThis(),但是有任何功能差异吗?
答案 0 :(得分:4)
这些方法的执行没有任何区别,但是如果new A().doThis()
你将失去对你调用方法的对象实例的引用,你就不会能够在您的代码中进一步使用它。此方法可能对实例的内部状态所做的所有更改都将丢失。
如果是A a1 = new A(); a1.doThis();
,您将保留对象的实例(在变量a1
中),并且可以通过方法doThis()
对其状态进行可能的更改。然后,您将能够继续使用此对象。
答案 1 :(得分:2)
让我们看看代码用简单的英语写的内容:
A a1 = new A();
a1.doThis();
a1
中存储对它的引用。doThis()
。而new A().doThis();
读作:
doThis()
。所以唯一的区别是你是否将它存储在局部变量中。如果您不再使用变量中的值,则该差异无关紧要。但是如果你想在同一个对象上调用另一个方法,让我们说a1.doThat()
,那么你就遇到了第二个解决方案的问题,因为你没有引用原始方法实例了。
为什么要使用同一个对象?因为方法可以改变对象的内部状态,所以这就是对象的内容。
答案 2 :(得分:2)
有任何功能差异吗?
两者的行为方式都相同。
第二个选项不允许您再次重用该实例。在单行返回语句中它可能是方便和简洁的(例如,考虑每个构造方法返回半初始化实例的构建器模式):
return new Builder().a().b().build();
或者创建对象只是为了执行一次定义的操作。
方法-2中新对象的引用是什么?
它不再存在(更准确地说,我们无法访问它),除非doThis
返回this
您可以放置collection.Find(c=>true);
在方法执行后的变量中。
我可以说方法-2是一种调用非静态方法的不正确方法吗?
没有。如果以后永远不会使用这个变量,我们为什么要创建一个变量呢?
答案 3 :(得分:2)
让我们逐一看看这两种方法。
方式-1 强>
A a1 = new A();
a1.doThis();
在 method-1 中,您有一个新创建的A
实例的引用,即a1
,您可以在此{{1}实例上调用尽可能多的方法使用此引用A
。基本上,您可以使用其引用a1
重用A
的特定实例。
方式-2 强>
a1
但是在方法-2 中,您没有任何存储新创建的new A().doThis();
实例的引用的变量。如果您必须在A
的特定实例上调用任何其他方法,您将如何引用A
的特定实例?如果使用方法2创建实例,则无法重用A
的实例,并且一旦使用它就会丢失该实例。
答案 4 :(得分:0)
案例1:
A a1 = new A();
a1.doThis();
以上两行表示创建对象和doThis();执行,但堆内存中仍然有可用对象。
案例2:
new A().doThis();
在立即调用GC(GarbageColletor)之后创建并执行doThis();
的类对象将被激活以从堆内存中删除该对象,因为该对象是未引用的对象,我们可以将该对象称为匿名对象。