在java中使用默认的构造函数,即使存在参数化构造函数也是如此

时间:2012-05-31 04:13:24

标签: java constructor default-constructor

我只想在这里清除我的概念,所以我在问......

如果我为我的类定义了一个显式参数化构造函数,我是否仍然可以调用java编译器提供的默认构造函数(默认情况下为每个类提供)??

或者它是否导致在这种情况下导致编译时错误? 请解释一下编译器调用的确切情况!

7 个答案:

答案 0 :(得分:11)

当且仅当没有提供构造函数时,编译器才会创建无参构造函数。

JLS在Chapter 8中声明:

  

如果一个类不包含构造函数声明,则隐式声明一个没有形式参数且没有throws子句的默认构造函数。

一个“捕获”是:

  

如果默认构造函数是隐式声明的,但是超类没有可访问的构造函数(第6.6节),它不带参数且没有throws子句,那么这是一个编译时错误。

答案 1 :(得分:2)

如果您只是定义参数化构造函数,那么编译器将不提供默认构造函数

它将打印错误

答案 2 :(得分:2)

8.8.9 Default Constructor

  

如果类不包含构造函数声明,则为默认值   不带参数的构造函数会自动提供:

     
      
  • 如果声明的类是原始类Object,则默认构造函数具有空体。
  •   
  • 否则,默认构造函数不带参数,只调用不带参数的超类构造函数
  •   

答案 3 :(得分:2)

Java Language Specification可能非常有用,而且实际上很容易阅读。

答案 4 :(得分:2)

  • 对于每个没有任何构造函数java的类都会 自动添加默认构造函数 - 它没有参数。没有args超级电话。
  • 如果向类中添加至少一个构造函数,则java将不包含默认构造函数。
  • 因此,当您尝试使用no args构造函数时,它会出现编译错误。

除此之外,这可能会导致一些额外的编译错误。测试此代码。

class A{
  A(int i){}
}

class B extends A{}

class Test{
  PSVM{
    B b = new B();
  }
}

此代码给出了编译错误。

B类没有任何构造函数。所以java会把这样的东西作为默认构造函数。

B(){
  super();
}

但是A类(B类)的Supper类没有没有args的构造函数。所以它会导致编译错误。

所以最好在你正在编写的每个类中都有一个无参数的构造函数。

答案 5 :(得分:1)

Java仅为那些没有为其明确定义的构造函数的类提供默认的无参数构造函数。一旦构造函数由程序员定义(即使它是无参构造函数),也不提供默认构造函数。

现在你问的是错误:

  • 如果已为类定义了无参数构造函数,则对类的构造函数进行无参数调用将调用此构造函数,并且不会抛出编译器错误
  • 如果您只定义了接受参数的构造函数,那么类的构造函数的无参数调用将引发编译器错误,因为不存在无参数构造函数。

建议彻底阅读Java Language Specification

答案 6 :(得分:1)

如果一个类不包含构造函数声明,则隐式声明一个没有形式参数且没有throws子句的默认构造函数。

如果声明的类是原始类Object,则默认构造函数具有空体。否则,默认构造函数只调用不带参数的超类构造函数。

如果默认构造函数是隐式声明的,但是超类没有一个不带参数且没有throws子句的可访问构造函数,那么这是一个编译时错误。

在类类型中,如果该类被声明为public,则默认构造函数被隐式赋予访问修饰符public;如果该类被声明为protected,则默认构造函数被隐式赋予访问修饰符protected;如果该类被声明为private,则默认构造函数被隐式赋予访问修饰符private;否则,默认构造函数具有默认访问权限隐含的默认访问权限。