为什么收到此错误“构造函数未定义”?

时间:2019-10-22 06:29:47

标签: java constructor class-design

在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方法中更改代码,因为这是设计类以运行给定方法的功课。

5 个答案:

答案 0 :(得分:3)

说明

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

  • 没有理由,new MyComplex()
  • 两个int自变量new MyComplex(5, 2)

解决方案

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

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

然后它也将起作用。


注释

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

作为示例,现在您的默认构造函数new MyComplex()将导致复杂的值0 + 0i。但这很容易被忽略,因为您的代码并未明确指出这一点。

通过转发,目的更加明确:

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

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

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

请注意,Java为您自动生成的唯一构造函数是琐碎的默认构造函数。那就是public MyComplex() { }(不带参数-不执行任何操作)。并且只有在您自己没有编写任何构造函数的情况下。

答案 1 :(得分:1)

您应该创建相应的(副本)构造函数。
所以:

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

答案 2 :(得分:1)

您必须具有一个重载的构造函数,该构造函数接受类型为MyComplex的对象才能起作用。

下面是您更新的课程

public class MyComplex {
    int realPart, imaginaryPart;
    public MyComplex(){
    }
    public MyComplex(int realPart, int imaginaryPart) {
        this.realPart = realPart;
        this.imaginaryPart = imaginaryPart;
    }

   public MyComplex(MyComplex mycomplex) {//this is the constructor you need
        this.realPart = mycomplex.realPart;
        this.imaginaryPart = mycomplex.imaginaryPart;
    }

    public void setRealPart(int realPart) {
        this.realPart = realPart;
    }
    public String toString() {
        return realPart + " + " + imaginaryPart +"i";
   }
}

答案 3 :(得分:1)

因为没有声明使用MyComplex作为参数的构造函数。您需要声明以下构造函数:-

 public MyComplex(MyComplex mycomplex) {
    this.realPart = mycomplex.realPart;
    this.imaginaryPart = mycomplex.imaginaryPart;
}

答案 4 :(得分:0)

因为在下面的行

  

MyComplex b =新的MyComplex(a);

您传递的是MyComplex类型的a,但是在MyComplex类中,您定义了一个带有int类型参数的构造函数。请更正您的传递参数。