【问题标题】:Constructors with the same primitive type as parameter与参数具有相同原始类型的构造函数
【发布时间】:2020-07-22 04:01:22
【问题描述】:

我有一项任务要求我为我的所有其他类创建一个数据类作为“节点中心”,例如用于“馈送”的 LinkedList、Stack 和队列的类。我在 Data 类中创建构造函数来处理 LinkedList、Stack 和 Queue 类。在为队列实现构造函数之前,我没有遇到任何问题。在 Data 类的 Stack 部分中,我已经创建了一个公共 Data 构造函数,其中一个 int 作为构造函数中的参数。当我尝试使用 int 作为队列参数创建另一个公共 Data 构造函数时,我收到错误:Data(int) 已在 Data 中定义。这是我的堆栈代码:

/*
    STACK WITH AN ARRAY
    */
    int size; //initialize size
    int stackArray[]; //initialize array
    int top; //initialize top

    public Data(int size) //constructor
    {
        this.size = size;
        this.stackArray = new int[size];
        this.top = -1;
    }

这是我的队列代码:

/*
    QUEUE WITH AN ARRAY
    */
    public int Queue[]; //establish queue array and variables
    public int front;
    public  int rear;
    public int queueSize;
    public int len;

    public Data(int nQueue)//constructor
    {
        size =nQueue;
        len = 0;
        Queue = new int[size];
        front = -1;
        rear = -1;
    }

如何解决这个问题,以便我可以拥有 2 个具有相同参数类型的构造函数?

【问题讨论】:

  • 根据您对问题的描述,您的 Data 类应该是您的 LinkedList、Queue、Stack 等制作的,那么为什么需要多个构造函数呢, 为什么 Data 类需要知道它是在 Queue、Stack 还是 LinkedList 中?

标签: java constructor


【解决方案1】:

两个方法或构造函数不能具有相同的名称和相同的签名。

在您的情况下,如果您调用 new Data(10) 创建 Data 的实例,编译器将不知道调用哪个构造函数来创建实例。

您可以使用第二个boolean 参数来提及要创建的实例类型。

public Data(int size, boolean isQueue)//constructor
{
  if(isQueue){
    len = 0;
    Queue = new int[size];
    front = -1;
    rear = -1;
  }else{
    this.size = size;
    this.stackArray = new int[size];
    this.top = -1;
  }
}

JLS:§8.4.2 Method Signature

【讨论】:

  • 这非常有效!我创建了一个构造函数来运行这两个程序,而不是两个单独的构造函数。
【解决方案2】:

它们都是 int 类型的构造函数。 Java 不关心您将 int 参数命名为什么,因此它们看起来像同一个构造函数(至少对于 java 而言)。由于您不能有两个具有相同参数的构造函数,因此您有两个选择。

  1. 为其中一个构造函数提供不同的数据类型参数。
  2. 给其中一个构造函数另一个参数。 (2 个参数)

其中任何一个都可以让 jvm 分辨出两个构造函数之间的区别。

【讨论】:

  • 谢谢!我将更改队列以使用 long 作为参数而不是 int。
  • 没问题,将来希望以不同的方式构建您的代码。这是一种解决方法,因此请避免故意创建这样的构造函数。将来尝试将您的参数封装为一种数据类型(使用接口或泛型之类的东西)。
【解决方案3】:

您不能在列表中创建两个具有相同数量的参数及其类型的构造函数。您可以做的是为 Queue 和 Stack 创建子类,并在各自的子类中为它们中的每一个定义构造函数。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多