调用的参考变量的方法VS一个新的对象上调用的方法

问题描述 投票:6回答:4

我有在调用非静态方法的困惑

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

java instance instance-variables
4个回答
2
投票

是否有任何功能上的差异?

双方的行为以同样的方式。

第二个选项不允许你再重新使用该实例。这可能是方便,简洁的单行return语句(例如,考虑到建造模式,其中每个构造方法返回一个半初始化实例):

return new Builder().a().b().build();

或者,如果一个对象只创建执行一次一个定义的动作。

什么将成为法-2的新对象的引用?

它不再存在(更准确地说,我们没有对它的访问),除非doThis返回this你可能能够把一个变量方法执行后。

我可以说,法-2是调用非静态方法的不正确的方式?

号我们为什么要创建一个变量,如果这个变量将永远不会被事后使用?


4
投票

不会有在这些方法执行,但在new A().doThis() your're会失去参考你调用方法上的对象实例的情况下,任何的区别,你将不能够进一步使用它你的代码。这种方法可能对我所做的实例的内部状态的所有更改将丢失。

A a1 = new A(); a1.doThis();你要保护的对象的实例(可变a1)及其通过方法doThis()制造状态所造成的潜在变化的情况下。然后,你就可以继续这个对象的工作。


2
投票

让我们来看看代码用简单的英语说:

      A a1 = new A();
      a1.doThis();
  1. A.创建一个新的实例
  2. 存储在变量a1对它的引用。
  3. 呼叫doThis()我们的实例。

new A().doThis();全文:

  1. A.创建一个新的实例
  2. 呼叫doThis()我们的实例。

所以,唯一的区别是你是否将其存储在一个局部变量或没有。如果你不使用的变量更多的价值,那么差异并不重要。但是,如果你想调用同一个对象的另一种方法,让我们说a1.doThat(),那么你在第二个解决方案的麻烦,因为你没有原来的实例的引用了。

你为什么要使用相同的对象?因为方法可以改变对象的内部状态,这几乎是什么是对象是什么。


2
投票

让我们来看看这两种方法一个接一个。

方法1

A a1 = new A();
a1.doThis();

在方法-1,你有A,即a1的新创建实例的引用,并可以调用使用此参考Aa1的这种情况下尽可能多的方法。基本上,你可以使用它的参考A重用a1的特定实例。

方法2

new A().doThis();

然而,在方法2,您不必存储新创建A的实例的引用任何变量。你将如何参考A的特定情况下,如果你要呼吁A的特定情况下的任何其他方法?如果您使用方法2创建一个实例,因为它是用你将尽快失去的情况下,你将无法再使用A的该实例。


0
投票

情况1:

 A a1 = new A();
 a1.doThis(); 

上述两个线意味着对象创建和doThis();执行,但静止对象在堆存储器可用。

案例2:

new A().doThis();

一个类的对象创建和doThis();立即执行后,GC(GarbageColletor)将启动从堆内存BCZ这是一个非引用的对象去除的目的,我们可以调用这个对象作为一个匿名对象。

© www.soinside.com 2019 - 2024. All rights reserved.