1)利用多态实现向上转型upcase中的方法和域问题
这是最简单,最常见的多态的一种情形,方法是用public修饰的。导出类的方法覆盖了基类的方法,当导出类向上转型的后(sub-->super),sup2在加载类方法的时候,会检查导出类是否有覆盖该方法,如果有就调用导出类的方法,因此这里sup2.display(),sup2.sayHello()结果都是Sub的。在这种情况下最好是使用javase5的@Override注解.但如果基类的方法是private(也就是final),那又会出现什么情况呢?
在这个例子中,主要是想体现出如果基类的方法是private的,导出类就不能继承这个方法。在向上转型中调用这个方法,能且仅能调用基类的private方法(当然要求main()在基类中调用,否则在基类以外的地方不能调用基类的private方法,这个列子正是如此)下面再看如果方法是static的呢
由这个例子可以知道在多态是不适用于static的方法的。也就是说在加载类的时候,编译器调用static方法不会去检查导出类是否对基类的static方法是否覆盖,而是直接装载基类的static方法。2)多态中的域
域在多态中是不会被覆盖的,FielddSuper.field和FieldSub.field被分配了两个不同的存储空间,同时在向上转型的时候,编译器也不会向下去找导出类是否覆盖类的域,因此sup.field()返回了FieldSuper的field而不是FieldSub的field。对于想在导出类中获得基类的域,就得像例子那样通过super方法来获取总结:对于利用多态的向上转型,编译器先从向上转型后的基类出发,找出要调用的元素。根据不同元素采取不同的策略,如果是域,static以及private的方法,则不会去检查导出类是否覆盖这些方法(其实是不能覆盖的)而直接调用基类的;如果是public的方法则检查导出类是否覆盖,覆盖了就会调用导出类的,否则调用基类的
Powered by: BlogJava Copyright © Eric-1001c