初始化为参数或单独?

时间:2014-04-15 05:20:01

标签: java

哪种内存和所有内容更有效或更安全?

classA A = new classA();
classB B = new classB(A);
A.dispose();

classB B = new classB(new classA());

3 个答案:

答案 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()); 希望这会对你有所帮助