【问题标题】:Do I need to always create a constructor for objects in Java?我是否需要始终为 Java 中的对象创建构造函数?
【发布时间】:2017-05-19 12:57:52
【问题描述】:

我见过很多没有引用任何构造函数的代码。我创建的代码不包含构造函数,这似乎违背了拥有一个构造函数的意义。何时需要实现构造函数是否有规则?

【问题讨论】:

  • 阅读straight from the horse's mouth怎么样。我建议您也阅读其他路线。
  • 如果不使用其他类,则不需要构造函数。但我想 Java 中的过程式编程不是要走的路:)
  • 阅读“默认构造函数”。

标签: java class object constructor


【解决方案1】:

你不必为你的类提供任何构造函数,但是你 执行此操作时必须小心。编译器自动提供一个 无参数,任何没有构造函数的类的默认构造函数。 此默认构造函数将调用 超类。在这种情况下,编译器会抱怨,如果 超类没有无参数构造函数,因此您必须验证 它确实如此。如果你的类没有明确的超类,那么它有一个 Object 的隐式超类,它确实没有参数 构造函数。

由 javaOO documentation提供

【讨论】:

    【解决方案2】:

    如果你有一个类“A”,并且你没有创建一个构造函数,一个构造函数:

    public A(){
    }
    

    将被隐式创建,即您实际上不会看到它。 (谢谢,@史蒂夫史密斯)

    如果您创建任何构造函数,则不会创建此默认构造函数。这在使用某些设计模式(如工厂方法和单例)时很重要。

    如果你创建一个私有构造函数:

    private A(){
    }
    

    不会创建默认构造函数(即公共的)。这意味着只有在类 A 中才能创建 A 的实例。要将 A 的实例导出到其他类,您需要在静态方法上创建它们并返回引用。这用于 Singleton 模式,例如:

    public A{
       private static A instance = new A();
    
       public static A getInstance(){
          return instance;
       }
    
       //the default public constructor will not be created
       private A(){
       }
    }
    

    【讨论】:

    • 为避免混淆,可能值得澄清的是它“将被隐式创建,即您实际上不会看到它”。
    • 单例代码略有错误。如果它像我们应该做的那样被实现为单常量枚举,那就不会错了。
    【解决方案3】:

    要回答你的问题,如果你想确保实例化的对象是用某些数据初始化的,你必须提供一个构造函数。例如,您可能希望有一个 Person 类,它始终具有有效的名字和姓氏以及年龄。

    Person hugo = new Person("Hugo", "First", 25);
    

    构造函数将是

    public Person(String first, String last, int age) {
        setFirst(first);
        setLast(last);
        setAge(age);
    }
    
    protected Person() {}
    

    这样就不可能实例化一个空的Person

    【讨论】:

    • 谢谢,保罗,这很有道理。
    • “这种方式不可能实例化一个空的人”除非你扩展类。不应在此处添加受保护的构造函数,这会打开“空”Person 的可能性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多