在java中,静态多态方法是否可以应用于超类

时间:2016-05-20 12:26:09

标签: java

我不知道如何准确描述这个问题,抱歉! 我在基类(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”,我必须添加许多其他如果在它

2 个答案:

答案 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