java - 为什么我会收到此错误“构造函数未定义”?
问题描述
在 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 方法中的代码,因为它是设计类以运行给定方法的作业。
解决方案
解释
您没有接受另一个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() { }
(没有参数 - 什么都不做)。并且仅当您自己没有编写任何构造函数时。
推荐阅读
- javascript - 为变量设置默认状态
- javascript - 从具有日期的对象数组中获取最早的日期
- java - 为什么子类中列表的字段声明使其为空?
- stripe-payments - 检索条带中的帐户余额不起作用
- ansible - 让 ansible 跳过在运行 Ansible playbook 的机器上运行 play
- pine-script - Pine TradingView - multiple strategy.entry/exit
- javascript - res.render 传递的对象,它们叫什么?
- php - 无法从 EC2 PHP 连接到云 MongoDB
- java - 如何在 Android Studio 中为按钮创建自动动画
- matlab - 优化 FPGA 设计的建议