我正在备考,遇到以下问题:
IntfX 是 A 包中的接口,包含方法 public void op_a(Double e)
CIsY 是 A 包中的一个类,它实现了 IntfX 并重写了 op_a。
在包 B 中,Main 类导入包 A,扩展 CIsY 并继续将 op_a 重载为 public void op_a(Double e, Double f)
现在在 psvm 块中,有两个实例化:Intfx a = new Main() 和 Main b = new Main()
接着调用 a.op_a(Double e, Double f) 和 c.op_a(Double e, Double f)
a.op_a 调用失败。它显示编译时错误“期望 1 个参数,但发现 2 个”
我的问题是:为什么 a 对象无法使用带有 2 个参数的重载方法 op_a ?在另一个问题中,当一个方法有两个版本时,jvm 会优先考虑对象,而不是类型。
代码:
`套餐A:
public interface IntfX {
public void op_a(Double a);
public void op_b(Double b);
}
public class CIsY implements IntfX {
protected double v = 0.0;
String p = null;
public CIsY(Double x, String b) {
v = x;
p = b;
}
public void op_a(Double a) {
v += a;
}
public void op_b(Double b) {
v -= b;
}
public void op_c() {
v = 0.0;
p = null;
}
}
套餐B:
import pack_a.*;
public class Main extends CIsY{
public static void main(String[] args) {
IntfX a = new Main();
CIsY b = new Main();
Men c = new Main();
c.op_a(0.5,0.8);
a.op_a(0.0, 0.1);
}
public Main() {
super(0.0, "");
}
public void op_a(Double e, Double f) {
v = e + f;
}
public void op_b(Double e, Double f) {
v = e + f;
}
public void op_K(Double d) {
v = d;
}
}
我希望a.op_a能够识别重载方法并编译。
因为接口的目的是强制执行指定方法,而 Main 类中没有这样做。
在您的示例中,您的接口 IntfX 明确指出:
https://docs.oracle.com/javase/tutorial/java/concepts/interface.html
Java 允许重载方法,简单地说,这意味着对象内实现的每个方法必须至少以以下两种方式之一是唯一的:
这意味着当您“重载一个方法”时,您实际上只是创建一个恰好具有相同名称的新的单独方法。很简单,Java 的编译器足够聪明,能够识别出它们是不同的方法,并 DISPITE 具有相同名称的方法。
https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html