java支持编译时是否支持多态?

时间:2014-02-01 14:01:17

标签: java oop polymorphism

根据我的理解,只有虚函数根据OOPS概念支持运行时多态,而在java中,默认情况下除标记的private,final和static之外的所有函数都是虚拟的。

这是否意味着,java不支持编译时多态?

如果确实如此,那么我们可以假设它违反了OOP原则。

2 个答案:

答案 0 :(得分:7)

方法重载是编译时多态性。由于我们可以为超类型设置多个子类型,编译器会确定在编译时调用哪种类型,因为所有方法都在编译时绑定

代表:

public class GamePlayer {

     public void doSomething(Worker worker) {
      System.out.println("I'm a worker");
     }

     public void doSomething(Teacher teacher) {
      System.out.println("I'm a Teacher");
     }

     public void doSomething(Principal principal) {
      System.out.println("I'm a Principal");
     }

     public static void main(String[] args) {

      GamePlayer example = new GamePlayer();
      Worker principal = new Principal();
      Worker teacher = new Teacher();

      example.doSomething(principal);
      example.doSomething(teacher);
     }
    }

您希望输出为

I'm a Principal
I'm a Teacher

但是,实际输出将是

I'm a worker
I'm a worker

Reason ::这里的类型是在编译时决定的。即使对象是Principal和Teacher的实例,引用也是Worker类型。所以编译器选择doSomething(Worker worker)方法,因为它接受相同类型的引用类型(Worker)。

答案 1 :(得分:1)

井函数重载是编译时多态,因为编译器在编译期间根据参数知道要调用哪个函数。