【问题标题】:Using default Constructors in java, even if the parameterized constructors are present [duplicate]在java中使用默认构造函数,即使存在参数化构造函数[重复]
【发布时间】:2012-05-31 04:13:24
【问题描述】:

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

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

或者在这种情况下是否会导致编译时错误? 请解释编译器调用的具体情况!

【问题讨论】:

  • 先试一试...
  • “请解释一下..”请正确拼写。

标签: java constructor default-constructor


【解决方案1】:

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

Chapter 8 中的 JLS 状态:

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

一个“抓住”是:

如果隐式声明了默认构造函数,但超类没有可访问的构造函数(第 6.6 节),该构造函数不接受参数且没有 throws 子句,则这是编译时错误。

【讨论】:

    【解决方案2】:

    8.8.9 Default Constructor

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

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

    .

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
        • 对于没有任何构造函数的每个类,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】:

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

        它会打印一个错误

        【讨论】:

        • 编译器不会“抛出”错误。它会打印一个错误。抛出异常,而不是编译器。
        【解决方案6】:

        Java 仅为那些没有为它们显式定义构造函数的类提供默认的无参数构造函数。一旦程序员定义了构造函数(即使是无参数的构造函数),默认的构造函数也不会被提供。

        现在你问的是错误:

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

        建议彻底阅读Java Language Specification

        【讨论】:

          【解决方案7】:

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

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

          如果隐式声明了默认构造函数,但超类没有可访问的构造函数,该构造函数不接受参数且没有 throws 子句,则这是编译时错误。

          在一个类类型中,如果该类被声明为public,那么默认构造函数被隐式地赋予访问修饰符public;如果该类被声明为受保护,则默认构造函数被隐式赋予访问修饰符保护;如果该类被声明为私有,则默认构造函数被隐式赋予访问修饰符私有;否则,默认构造函数具有没有访问修饰符隐含的默认访问权限。

          【讨论】:

            猜你喜欢
            • 2014-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多