【问题标题】:Why is there more than one constructor in this Java code?为什么这段 Java 代码中有多个构造函数?
【发布时间】:2015-04-23 22:43:53
【问题描述】:

我在听我的 Java 课程 (Java I) 的讲座时,得到了一张参考表来打印。这不是家庭作业,它只是用来了解对象、类和构造函数的东西。我的问题是,是否需要多个构造函数?第一个只是声明所有变量,第二个初始化它们。这不能在一个构造函数中完成吗?这是构造函数的代码。非常欢迎您编写一个示例或只是帮助我理解我在看什么。我对构造函数很陌生。

public class Puppy 
{ 
    private String name;      // puppy's name
    private String breed;     // breed of dog
    private int age;          // chronological age of dog
    private String vet;       // name of vet

    public Puppy() 
    {
        name = " ";
        breed = " ";
        age = 0;
        vet = " ";
    } // end of Puppy constructor

    // method initializing data fields to specific values
    public Puppy(String n, String b, int a, String v) 
    {
        name = n;
        breed = b;
        age = a;
        vet = v;
    } // end of Puppy constructor 

【问题讨论】:

  • 引用类型(如字符串)的默认值为“null”。这与空字符串不同。第一个构造函数确保名称和品种等内容具有空字符串值而不是空值。 如果这是必要的,但通常在定义字段时内联完成。
  • 第一个将使用构造函数中使用的硬编码值初始化对象,然后使用第二个构造函数,您可以传入您自己的值并创建具有该值的对象。
  • 似乎不需要第一个构造函数——因为变量可以在声明时初始化为默认值。也就是说,有些框架和工具要求您显式声明一个空的构造函数。如果使用这样的工具/框架 - 它可以解释它。
  • 另外,第一个构造函数的代码也可以是this(" ", " ", 0, " ");。这样,您可以将第二个构造函数视为“基础”。如果用户没有提供任何值,您只需创建一个“默认”Puppy 对象。
  • 构造函数参数的命名当然可以更清楚。使用name 之类的参数名称,然后分配this.name = name 之类的字段可以提高可理解性。

标签: java object constructor


【解决方案1】:

这两个构造函数是为了给这个类的用户提供两种创建对象的方式:

  • 第一个构造函数的参数
  • 使用第二个构造函数的参数

本质上,如果用户没有提供任何值,第一个构造函数就会生效并为实例变量提供默认值。

【讨论】:

    【解决方案2】:

    About Overloading Methods

    重载方法最流行的示例之一是 System.out.println(),它允许您放置参数,如字符串、原始类型甚至表达式。

    您这样做是因为您想要一种方法来处理不同类型的参数并为此做一些事情而不会崩溃。

    在这种情况下,您正在重载 构造函数,因此您在为该类创建实例时传递的参数(之前在您的类文件中定义)将是有效的。

    我可以添加一个构造函数是一种将值传递给对象而不调用方法创建对象之后的捷径。

    Person alicia = new Person("Alicia Roberts"); //the variable holding the full name is set.
    
    Person alicia = new Person(); //create the object
    alicia.setFullName("Alicia Roberts"); // pass a value by a method
    

    【讨论】:

      【解决方案3】:

      不,(通常)拥有超过 1 个构造函数不是必要。 有多个 1 的原因是为了方便任何可能使用您的代码的人。

      提供多个构造函数的原因通常是在调用构造函数时可能知道不同或不同数量的信息。 所以提供一个像

      这样的构造函数

      小狗(字符串 n,字符串 b,int a,字符串 v)

      比让你的用户做更方便:

      Puppy p = new Puppy();
      p.setName("Rover");
      p.setAge(12);
      p.setBreed("Mutt");
      p.setVet("Dr. Dolittle");
      

      【讨论】:

        【解决方案4】:

        没有构造函数声明对象的字段(“变量”)。它们在这里声明:

        private String name;      // puppy's name
        private String breed;     // breed of dog
        private int age;          // chronological age of dog
        private String vet;       // name of vet
        

        第一个构造函数只是创建某种“空”Puppy 对象,而第二个构造函数提供了创建某些特定 Puppy 的能力。

        此外,可以在声明部分分配(初始化)值,因此您不再需要 Puppy()

        private String name = " ";
        private String breed = " ";
        private int age = 0;
        private String vet = " ";
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-17
          • 2011-03-13
          • 2012-02-10
          • 1970-01-01
          • 2010-11-06
          相关资源
          最近更新 更多