我不知道如何准确描述这个问题,抱歉! 我在基类(B)上有一个类(E),在辅助类(Printer)中有两个相同的名称方法(printIt)。 这些printIt方法使用B或E作为参数,这是静态多态。
public class B {
public void printMe(){
System.out.println("i am b");
}
}
public class E extends B {
@Override
public void printMe(){
System.out.println("i am e");
}
}
public class Printer {
public void printIt(B b) {
System.out.println("it is b");
}
// public void printIt(B b) {
// if (b.getClass().equals(B.class)) {
// System.out.println("it is b");
// } else if (b.getClass().equals(E.class)) {
// E e = (E) b;
// printIt(e);
// }
// }
public void printIt(E e) {
System.out.println("it is e");
}
public static void main(String[] args) {
B b = new B();
E e = new E();
B be = e;
System.out.println("------------dynamic polymorphism ---------------");
b.printMe(); //i am b
e.printMe(); //i am e
be.printMe(); //i am e
System.out.println("------------static polymorphism ----------------");
Printer printer = new Printer();
printer.printIt(b); //it is b
printer.printIt(e); //it is e
System.out.println("-------------????????????????? -----------------");
printer.printIt(be); //it is b
}
}
在上面的代码中,最后一次printIt调用将使用“public void printIt(E e)”方法来打印“它是b”。但“be”变量实际上是一个“E”对象,有没有办法在“Printer”中让java根据传入的对象类选择方法。
如果我在上面的代码中切换“printIt(B b)”的评论,我会得到我想要的,但是它很乏味,因为如果我添加许多子类的“B”,我必须添加许多其他如果在它
答案 0 :(得分:2)
在我看来,你根本不理解多态性背后的基本思想。你完全走上了正确的轨道,但在编写打印机类时却迷失了:
public class Printer {
public void printIt(B b) {
b.printMe();
}
}
这是多态性的日常使用,似乎完全满足您的需求?
答案 1 :(得分:1)
最好避免这些过载。其中一个参数是另一个参数的父级。
由调用者决定调用哪个方法,这很容易破坏封装:
int main()
{
unsigned squares[8];
unsigned cubes[8];
for (int i = 0; i <= 8; i++) {
squares[i] = i * i;
cubes[i] = i * i * i;
}
}
检查printer.printIt(be); //it is b
printer.printIt((E) be); //it is e
的动态类型会产生额外的运行时成本,因此默认情况下不会这样做。
你可以自己实现它:
be