哪种内存和所有内容更有效或更安全?
classA A = new classA();
classB B = new classB(A);
A.dispose();
或
classB B = new classB(new classA());
答案 0 :(得分:1)
没有差别。
示例:
请考虑以下代码。
class A {
}
class B {
public B(A a) {
}
}
class Test
{
public static void main (String[] args)
{
A a = new A();
B b1 = new B(a);
B b2 = new B(new A());
}
}
如果您将看到下面的编译代码,您会发现java编译器包含两个invokespecial
和两个new
指令,因此每次创建一个单独的类A
的对象时存储在堆中,该对象的引用将作为参数传递给类B
的构造函数。
已编译代码:
class Test extends java.lang.Object{
Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class A
3: dup
4: invokespecial #3; //Method A."<init>":()V
7: astore_1
8: new #4; //class B
11: dup
12: aload_1
13: invokespecial #5; //Method B."<init>":(LA;)V
16: astore_2
17: new #4; //class B
20: dup
21: new #2; //class A
24: dup
25: invokespecial #3; //Method A."<init>":()V
28: invokespecial #5; //Method B."<init>":(LA;)V
31: astore_3
32: return
}
您可以看到只是更改了执行顺序。
旁注:
invokespecial
JVM指令用于调用构造函数(Instance initialization method)
类。new
用于创建类的新实例。<init>
是编译器提供的构造函数的特殊名称,它不是有效的java标识符。答案 1 :(得分:0)
如果你永远不会使用ClassA A
,那么定义它是没有意义的。至于efficient or SAFE regarding memory and all
- 没有区别。
答案 2 :(得分:-1)
不要创建ClassA A = new ClassA(); 因为你没有使用它你不必要地为堆工作。 直接写 classB B = new classB(new classA()); 希望这会对你有所帮助