有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (1) 个答案

  1. # 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
    
    }
    

    你可以看到只是执行顺序改变了

    旁注:

    • invokespecialJVM指令用于调用 上课
    • new用于创建类的新实例
    • <init>是编译器提供的构造函数的特殊名称,它不是有效的java标识符