在引用变量上调用方法vs在新对象上调用方法

时间:2017-01-17 11:49:36

标签: java instance instance-variables

我在调用非静态方法时感到困惑

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(),但是有任何功能差异吗?

5 个答案:

答案 0 :(得分:4)

这些方法的执行没有任何区别,但是如果new A().doThis()你将失去对你调用方法的对象实例的引用,你就不会能够在您的代码中进一步使用它。此方法可能对实例的内部状态所做的所有更改都将丢失。

如果是A a1 = new A(); a1.doThis();,您将保留对象的实例(在变量a1中),并且可以通过方法doThis()对其状态进行可能的更改。然后,您将能够继续使用此对象。

答案 1 :(得分:2)

让我们看看代码用简单的英语写的内容:

      A a1 = new A();
      a1.doThis();
  1. 创建A的新实例。
  2. 在变量a1中存储对它的引用。
  3. 在我们的实例上调用doThis()
  4. new A().doThis();读作:

    1. 创建A的新实例。
    2. 在我们的实例上调用doThis()
    3. 所以唯一的区别是你是否将它存储在局部变量中。如果您不再使用变量中的值,则该差异无关紧要。但是如果你想在同一个对象上调用另一个方法,让我们说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();的类对象将被激活以从堆内存中删除该对象,因为该对象是未引用的对象,我们可以将该对象称为匿名对象。