根据我的理解,只有虚函数根据OOPS概念支持运行时多态,而在java中,默认情况下除标记的private,final和static之外的所有函数都是虚拟的。
这是否意味着,java不支持编译时多态?
如果确实如此,那么我们可以假设它违反了OOP原则。
答案 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)
井函数重载是编译时多态,因为编译器在编译期间根据参数知道要调用哪个函数。