为什么我会收到此错误 "The constructor is undefined"?
Why am I getting this error "The constructor is undefined"?
在 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;
但我无法更改主要方法中的代码,因为它是将 class 设计为 运行 给定方法的作业。
您应该创建相应的(复制)构造函数。
所以:
public MyComplex(MyComplex a){
realPart = a.realPart;
imaginaryPart = a.imaginaryPart;
}
您必须有一个重载的构造函数来接受类型为 MyComplex
的对象才能使其正常工作。
以下是您更新后的 class
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";
}
}
因为在下一行
MyComplex b = new MyComplex(a);
您传递的是 MyComplex 类型,但在 MyComplex class 中,您使用一个类型为 int 的参数定义了构造函数。请更正您传递的参数。
说明
您没有接受另一个 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() { }
(没有参数 - 什么都不做)。并且前提是您自己没有编写任何构造函数。
因为没有以 MyComplex 作为参数声明的构造函数。您需要声明以下构造函数:-
public MyComplex(MyComplex mycomplex) {
this.realPart = mycomplex.realPart;
this.imaginaryPart = mycomplex.imaginaryPart;
}
在 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;
但我无法更改主要方法中的代码,因为它是将 class 设计为 运行 给定方法的作业。
您应该创建相应的(复制)构造函数。
所以:
public MyComplex(MyComplex a){
realPart = a.realPart;
imaginaryPart = a.imaginaryPart;
}
您必须有一个重载的构造函数来接受类型为 MyComplex
的对象才能使其正常工作。
以下是您更新后的 class
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";
}
}
因为在下一行
MyComplex b = new MyComplex(a);
您传递的是 MyComplex 类型,但在 MyComplex class 中,您使用一个类型为 int 的参数定义了构造函数。请更正您传递的参数。
说明
您没有接受另一个 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() { }
(没有参数 - 什么都不做)。并且前提是您自己没有编写任何构造函数。
因为没有以 MyComplex 作为参数声明的构造函数。您需要声明以下构造函数:-
public MyComplex(MyComplex mycomplex) {
this.realPart = mycomplex.realPart;
this.imaginaryPart = mycomplex.imaginaryPart;
}