在引用变量上调用方法vs在新对象上调用方法
我在调用非静态方法时感到困惑
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() ,但是有任何function差异吗? 方法-2中新对象的引用是什么。
有任何function差异吗?
两者都会以同样的方式表现。
第二个选项不允许您再次重用该实例。 在单行返回语句中它可能是方便和简洁的(例如,考虑每个构造方法返回半初始化实例的构建器模式):
return new Builder().a().b().build();
或者如果创建对象只是为了执行一次定义的操作。
方法-2中新对象的引用是什么?
它不再存在( 更准确地说,我们无权访问它 ),除非doThis
返回this
,你可以在方法执行后将其放入变量中。
我可以说方法-2是一种调用非静态方法的不正确方法吗?
不。如果之后永远不会使用此变量,为什么要创建变量?
这些方法的执行没有任何区别,但是如果是new A().doThis()
你将失去对你调用方法的对象实例的引用,你就不会能够在您的代码中进一步使用它。 此方法可能对实例的内部状态所做的所有更改都将丢失。
如果A a1 = new A(); a1.doThis();
A a1 = new A(); a1.doThis();
你将保留一个对象的实例(在变量a1
)以及由方法doThis()
对其状态做出的潜在改变。 然后,您将能够继续使用此对象。
让我们看看代码用简单的英语写的内容:
A a1 = new A(); a1.doThis();
- 创建一个新的A实例。
- 在变量
a1
存储对它的引用。 - 在我们的实例上调用
doThis()
。
而new A().doThis();
读作:
- 创建一个新的A实例。
- 在我们的实例上调用
doThis()
。
所以唯一的区别是你是否将它存储在局部变量中。 如果您不再使用变量中的值,则该差异无关紧要。 但是如果你想在同一个对象上调用另一个方法,让我们说a1.doThat()
,那么你就遇到了第二个解决方案的麻烦,因为你还没有对原始实例的引用。
你为什么要使用同一个对象? 因为方法可以改变对象的内部状态,所以这几乎就是对象的内容。
让我们逐一看看这两种方法。
方法1
A a1 = new A(); a1.doThis();
在方法-1中 ,您有一个新创建的A
实例的引用,即a1
,您可以使用此引用a1
在此A
实例上调用尽可能多的方法。 基本上,您可以通过使用其引用a1
重用该特定的A
实例。
方法2
new A().doThis();
但是在方法-2中 ,您没有任何存储新创建的A
实例的引用的变量。 如果你必须在A
特定实例上调用任何其他方法,你将如何引用A
特定实例? 如果使用方法2创建实例,则无法重新使用该A
实例,并且一旦使用它就会丢失该实例。