Java 初始化为参数还是单独?

Java 初始化为参数还是单独?,java,Java,关于内存和其他方面,哪个更有效或更安全 classA A = new classA(); classB B = new classB(A); A.dispose(); 或 如果您永远不会使用ClassA,那么定义它就没有意义了。至于关于内存和所有的有效或安全性,没有区别。不要创建ClassA=新ClassA(); 因为你没有使用它。不必要地,你给了堆工作。 直写 classB=新classB(新classA()); 希望这对您有所帮助没有区别 示例: 考虑以下代码 class A { } c

关于内存和其他方面,哪个更有效或更安全

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


如果您永远不会使用
ClassA
,那么定义它就没有意义了。至于
关于内存和所有
的有效或安全性,没有区别。

不要创建ClassA=新ClassA(); 因为你没有使用它。不必要地,你给了堆工作。 直写 classB=新classB(新classA());
希望这对您有所帮助

没有区别

示例:

考虑以下代码

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

}
类测试扩展了java.lang.Object{
Test();
代码:
0:aload_0
1:invokespecial#1;//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:new#2;//A类
3:dup
4:invokespecial#3;//方法A.“”:()V
7:astore_1
8:新的#4;//B类
11:dup
12:aload_1
13:invokespecial#5;//方法B.“”:(LA;)V
16:astore_2
17:新#4;//B类
20:dup
21:新#2;//A类
24:dup
25:invokespecial#3;//方法A.“”:()V
28:invokespecial#5;//方法B.“”:(LA;)V
31:astore_3
32:返回
}
您可以看到,只是执行顺序发生了变化

旁注:

  • invokespecial
    JVM指令用于调用 班级
  • new
    用于创建类的新实例
  • 是编译器提供的构造函数的特殊名称,它不是有效的java标识符

“您正在为堆提供工作”…您能解释一下吗?我认为,当a“传递给”B的构造函数时,调用方调用a.dispose()通常是一个可疑的想法,因为将a传递给B的构造函数的一般原因是为了存储它以备以后使用。考虑“B”A和“处置”A。许多:大多数流将自动“关闭”(或“处置”)底层源。
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

}