2017-04-06 156 views
0
class Bank{ 
    float getRateOfInterest(){return 0;} 
} 

class SBI extends Bank{ 
    float getRateOfInterest(){return 8.4f;} 
} 

class TestPolymorphism{ 
    public static void main(String args[]){ 
     Bank a = new SBI(); 
     SBI b = new SBI(); 
     a.getRateOfInterest(); 
     b.getRateOfInterest(); 
    } 
} 

a.getRateOfInterest()b.getRateOfInterest()都给出相同的输出。那么这两个陈述之间有什么区别?混淆创建类实例

我觉得第一个是临近预测。

+0

可能的重复[如何在Java中动态方法调度工作](http://stackoverflow.com/questions/43062344/how-does-dynamic-method-dispatching-work-in-java) –

回答

1

Java方法都是虚拟的,所以调用的方法取决于被调用对象的运行时类型,而不是保存引用的变量的编译时类型。

+0

哦,你击败了我。 – javaLover

0

所有java方法都是虚拟的(通过设计)。
他们依靠实现类来提供方法实现。

以下是更多信息。
- Can you write virtual functions/methods in Java?
- https://en.wikipedia.org/wiki/Virtual_function

这里是维基百科摘录: -

public class Animal { 
    public void eat() { 
     System.out.println("I eat like a generic Animal."); 
    } 

    public static void main(String[] args) { 
     Animal animal=new Wolf(); 
     animal.eat(); //print "I eat like a wolf! 
    } 
} 
class Wolf extends Animal { 
    @Override 
    public void eat() { 
     System.out.println("I eat like a wolf!"); 
    } 
} 

虚函数都解决了 '晚'。如果所讨论的函数在基类中为'虚拟' ,则根据所引用的对象 的实际类型调用该函数的派生最多的类的实现 ,而不管指针或 引用的声明类型。如果它不是'虚拟的',则该方法在'提前'解决,并且根据指示或引用的声明类型选择所调用的函数。

虚拟功能允许程序调用编译代码时必须存在的方法。

0

这不是,如果你用new SBI()构造它。它总是会返回8.4f