类文件中的默认构造函数

时间:2016-04-04 12:40:58

标签: java

如果我不提供任何构造函数,编译器将为该类创建一个默认构造函数。

类文件中是否存在默认构造函数?

如果它不存在那么VM如何运行类文件并为类创建对象?

更新1:

我创建了一个类文件,

public class ConstructorExp {   
    public static void main(String[] args){
    ConstructorExp e = new ConstructorExp();
   }
}

在反编译器的帮助下,我反编译了类文件

/*
* Decompiled with CFR 0_114.
*/
public class ConstructorExp {
    public static void main(String[] arrstring) {
    ConstructorExp constructorExp = new ConstructorExp();
  }
}

如您所见,没有默认构造函数!

3 个答案:

答案 0 :(得分:3)

  

类文件中是否存在默认构造函数?

是的。

您可以通过创建一个具有默认构造函数的类,编译它然后使用JDK附带的javap实用程序来检查它来自行检查。

这是我做的时候会发生什么。

[stephen@blackbox tmp]$ cat Test.java
public class Test {}
[stephen@blackbox tmp]$ javac Test.java 
[stephen@blackbox tmp]$ javap -c Test
Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
}
[stephen@blackbox tmp]$ 

QED

  

在反编译器的帮助下,我反编译了类文件[并且输出中没有默认构造函数]

有趣。但是,这并没有证明 1

实际发生的是反编译器:

  • 在.class文件中看到no-args构造函数,其主体等同于super();
  • 看到没有其他构造函数
  • 意识到构造函数可以表示为默认构造函数
  • 不输出构造函数的任何源代码...... 因为代码是多余的。

1 - ...除了反编译器有点聪明之外。

答案 1 :(得分:0)

当它将.java文件编译为.class文件时,这就是java所做的事情之一。同样的情况发生,如果你没有放置&#34; F&#34;在一个花车后面,或者一个&#34; D&#34;落后一双。

答案 2 :(得分:0)

是的,它会。检查下面的答案并编译一个没有arg构造函数的类a。你会找到答案。无论如何解释如下

默认构造函数 如果声明一个没有构造函数的类,编译器将自动为该类创建一个默认构造函数。默认构造函数不带参数(它是一个无参数构造函数)并且有一个空体。因为如果您没有显式声明任何构造函数,编译器将自动生成默认构造函数,所有类都保证至少有一个构造函数。例如,如果声明一个CoffeeCup类而未明确声明构造函数:

//在文件init / ex6 / CoffeeCup.java中的源包中

class CoffeeCup {

    private int innerCoffee;

    public void add(int amount) {
        innerCoffee += amount;
    }
    //...
}

编译器将生成相同的类文件,就像您已显式声明一个空体的无参数构造函数一样:

//文件init / ex7 / CoffeeCup.java中的源数据包

class CoffeeCup {

    private int innerCoffee;
        public CoffeeCup() {
    }

    public void add(int amount) {
        innerCoffee += amount;
    }
    //...
}

编译器为默认构造函数提供与其类相同的访问级别。在上面的示例中,类CoffeeCup是公共的,因此默认构造函数是public。如果CoffeeCup已获得包访问权限,则默认构造函数也将获得包访问权。

链接:https://www.artima.com/designtechniques/initializationP.html