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

lok*_*ely 2 java oop polymorphism

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

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

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

Gir*_*ish 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);
     }
    }
Run Code Online (Sandbox Code Playgroud)

你会期望输出为

I'm a Principal
I'm a Teacher
Run Code Online (Sandbox Code Playgroud)

但是,实际输出将是

I'm a worker
I'm a worker
Run Code Online (Sandbox Code Playgroud)

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