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
}