lok*_*ely 2 java oop polymorphism
根据我的理解,只有虚函数根据OOPS概念支持运行时多态,而在java中,默认情况下除标记的private,final和static之外的所有函数都是虚拟的.
那是不是意味着,java不支持编译时多态?
如果确实如此,那么我们可以假设它违反了OOP原则.
方法重载是编译时多态性.由于我们可以为超类型设置多个子类型,编译器会确定在编译时调用哪种类型,因为所有方法都在编译时绑定
对于前:
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).
| 归档时间: |
|
| 查看次数: |
2392 次 |
| 最近记录: |