在引用变量上调用方法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(); 
  1. 创建一个新的A实例。
  2. 在变量a1存储对它的引用。
  3. 在我们的实例上调用doThis()

new A().doThis(); 读作:

  1. 创建一个新的A实例。
  2. 在我们的实例上调用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实例,并且一旦使用它就会丢失该实例。