首页 > 解决方案 > 为什么我会收到此错误“构造函数未定义”?

问题描述

在 Java 中,出现此错误:

Error: The constructor MyComplex(MyComplex) is undefined

Java 代码:

public class MyComplex {
    int realPart, imaginaryPart;
    public MyComplex(){
    }
    public MyComplex(int realPart, int imaginaryPart) {
        this.realPart = realPart;
        this.imaginaryPart = imaginaryPart;
    }
    public void setRealPart(int realPart) {
        this.realPart = realPart;
    }
    public String toString() {
        return realPart + " + " + imaginaryPart +"i";
   }
}
public class MyComplexTester {
    public static void main(String[] args) {
        MyComplex a = new MyComplex(20, 50);
        MyComplex b = new MyComplex(a);        //Error happens here
        b.setRealPart(4);
        System.out.println(b);
    }
}

如果我使用该代码可以正常工作

MyComplex b = a;

但是我不能更改 main 方法中的代码,因为它是设计类以运行给定方法的作业。

标签: javaconstructorclass-design

解决方案


解释

您没有接受另一个MyComplex复制构造函数)的构造函数。您只创建了接受的构造函数:

  • 没有争论,new MyComplex()
  • 两个int论据,new MyComplex(5, 2)

解决方案

您需要明确定义要使用的构造函数。Java 不会为您生成这样的构造函数。例如:

public MyComplex(MyComplex other) {
    realPart = other.realPart;
    imaginaryPart = other.imaginaryPart;
}

然后它也将起作用。


笔记

为了提高代码的可读性,您应该为新的复制构造函数使用显式构造函数转发,尤其是默认构造函数

例如,现在您的默认构造函数new MyComplex()将导致0 + 0i. 但这很容易被监督,因为您的代码没有清楚地表明这一点。

通过转发,意图更加清晰:

public MyComplex() {
    this(0, 0);
}

public MyComplex(MyComplex other) {
    this(other.realPart, other.imaginaryPart);
}

然后两者都将只转发到接受这两个int值的显式构造函数。

请注意,Java 为您自动生成的唯一构造函数是平凡的默认构造函数。那是public MyComplex() { }(没有参数 - 什么都不做)。并且仅当您自己没有编写任何构造函数时。


推荐阅读