在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方法中更改代码,因为这是设计类以运行给定方法的功课。
答案 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类型参数的构造函数。请更正您的传递参数。