java - 带有重载的 Java 函数调用
问题描述
我想知道为什么第三个输出不是 b。
这是我的代码:
public class SimpleTests {
public void func(A a) {
System.out.println("Hi A");
}
public void func(B b) {
System.out.println("Hi B");
}
public static void main(String[] args) {
A a = new A();
B b = new B();
A c = new B();
SimpleTests i = new SimpleTests();
i.func(a);
i.func(b);
i.func(c);
}
}
class A {}
class B extends A {}
这是输出:
Hi A
Hi B
Hi A
有人可以告诉我为什么第三个输出是Hi A
,不是Hi B
。因为真正的 c 是 B 的一个实例。
解决方案
您将重载与多态性混淆了。
使用多态性,当创建一个类 B 的实例时,该实例是 A 类的子类,被 A 类对象引用,并覆盖 A 类的方法,调用该方法将执行 B 类的方法。
通过重载,被调用的方法只知道参数声明的类型,而不知道初始化。
public class A {
public void print() {
System.out.println("A");
}
}
public class B extends A {
@Override
public void print() {
System.out.println("B");
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
B b = new B();
A otherB = new B();
a.print();
b.print();
otherB.print();
}
}
这将输出
A
B
B
推荐阅读
- c# - JSON 与 .NET 中的反序列化不同的序列化
- python - TensorFlow 2 无法导入(PyCharm)
- mysql - 通过 UNIX 套接字与远程服务器上的 mysql 连接
- java - 如何访问 Class 类型的元素列表?
- android - React Native Video Android 方向
- javascript - 如何检查对象数组是否具有具有更多属性的重复属性值?
- jquery - 类型“JQuery”上不存在属性“验证”
' - javascript - PHPmailer在使用gmail smtp时发送电子邮件到span
- arrays - 如何获取 Array 数组中的列数?
- python - 使用平均聚合值过滤组?