我有在调用非静态方法的困惑
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(),但没有任何功能上的差异?
是否有任何功能上的差异?
双方的行为以同样的方式。
第二个选项不允许你再重新使用该实例。这可能是方便,简洁的单行return语句(例如,考虑到建造模式,其中每个构造方法返回一个半初始化实例):
return new Builder().a().b().build();
或者,如果一个对象只创建执行一次一个定义的动作。
什么将成为法-2的新对象的引用?
它不再存在(更准确地说,我们没有对它的访问),除非doThis
返回this
你可能能够把一个变量方法执行后。
我可以说,法-2是调用非静态方法的不正确的方式?
号我们为什么要创建一个变量,如果这个变量将永远不会被事后使用?
不会有在这些方法执行,但在new A().doThis()
your're会失去参考你调用方法上的对象实例的情况下,任何的区别,你将不能够进一步使用它你的代码。这种方法可能对我所做的实例的内部状态的所有更改将丢失。
在A a1 = new A(); a1.doThis();
你要保护的对象的实例(可变a1
)及其通过方法doThis()
制造状态所造成的潜在变化的情况下。然后,你就可以继续这个对象的工作。
让我们来看看代码用简单的英语说:
A a1 = new A();
a1.doThis();
a1
对它的引用。doThis()
我们的实例。而new A().doThis();
全文:
doThis()
我们的实例。所以,唯一的区别是你是否将其存储在一个局部变量或没有。如果你不使用的变量更多的价值,那么差异并不重要。但是,如果你想调用同一个对象的另一种方法,让我们说a1.doThat()
,那么你在第二个解决方案的麻烦,因为你没有原来的实例的引用了。
你为什么要使用相同的对象?因为方法可以改变对象的内部状态,这几乎是什么是对象是什么。
让我们来看看这两种方法一个接一个。
方法1
A a1 = new A();
a1.doThis();
在方法-1,你有A
,即a1
的新创建实例的引用,并可以调用使用此参考A
上a1
的这种情况下尽可能多的方法。基本上,你可以使用它的参考A
重用a1
的特定实例。
方法2
new A().doThis();
然而,在方法2,您不必存储新创建A
的实例的引用任何变量。你将如何参考A
的特定情况下,如果你要呼吁A
的特定情况下的任何其他方法?如果您使用方法2创建一个实例,因为它是用你将尽快失去的情况下,你将无法再使用A
的该实例。
情况1:
A a1 = new A();
a1.doThis();
上述两个线意味着对象创建和doThis();执行,但静止对象在堆存储器可用。
案例2:
new A().doThis();
一个类的对象创建和doThis();
立即执行后,GC(GarbageColletor)将启动从堆内存BCZ这是一个非引用的对象去除的目的,我们可以调用这个对象作为一个匿名对象。