Java多态中的缺陷
来源:互联网 发布:淘宝客新手如何玩鹊桥 编辑:程序博客网 时间:2024/05/21 14:02
并不是所有的事物都可以多态的发生,多态只适用于普通的方法调用(private方法和final方法肯定不具有多态,包访问权限的方法,根据导出类和基类的位置决定,均在包内则可以继承)。
1、无法“覆盖”私有方法
private方法自动被当作final方法,并且对导出类屏蔽。如果在导出类中具有一个和基类private方法一摸一样的方法,这不是多态。这只是导出类中的一个全新的方法。
如本例中PrivateOverride的private f()方法在子类Derived中不可见,因此不可能被重载;Derived对象中f()方法是一个全新的方法。当向上转型时:PrivateOverride d = new Derived(); d是无法看见Derived()的新方法(即PrivateOverride没有的接口)的。
例程:
package polymorphism;public class PrivateOverride { private void f(){ System.out.println("PrivateOverride's private f()"); } public static void main(String[] args){ PrivateOverride d = new Derived(); d.f(); }}class Derived extends PrivateOverride { public void f(){ System.out.println("Derived public f()"); }}/* OutputPrivateOverride's private f() */
2、无法覆盖域
任何域访问操作都是在编译期解析的,因此不是多态。如果你直接访问某个域,这个访问会在编译期进行解析(编译期基类的域解析会先于导出类的域解析),就像下面所演示的。
本例中:p.field就是直接访问field这个域,是在编译期完成的。sp.field和sb.field分配了不同的存储空间,Sb实际上包含了两个field域:它自己的和它从Super处得到的。并且在引用sb.field时默认域并非Super版本的field域,引用sp.field时默认域是它自己的field域。
例程:
package polymorphism;class Super{ public int field = 1; public int getField(){ return field; }}class Sub extends Super { public int field =2; public int getField() { return field; } public int getSuperField() { return super.field; }}public class FiledAccess { public static void main(String[] args) { Super sp = new Sub(); Sub sb = new Sub(); System.out.println("sp.field = "+sp.field+" sp.getField "+sp.getField()); System.out.println("sb.field = "+sb.field+" sb.getField "+sb.getField()+" sb.getSuperField "+sb.getSuperField()); }}
3、无法覆盖静态方法
如果某个方法是静态的,它的行为就不具有多态性。
阅读全文
0 0
- Java多态中的缺陷
- Java 多态缺陷
- JAVA中的缺陷
- java 多态的两个缺陷
- Java编程思想-多态的缺陷
- java继承中的“缺陷”:“覆盖”私有方法
- Java中的Enum的使用缺陷分析
- java继承中的“缺陷”:“覆盖”私有方法
- Java中的Timer源码分析及缺陷
- 多态使用缺陷
- 多态的缺陷
- java中的多线程包--- Timer的缺陷 用ScheduledExecutorService替代
- 分布式计算中的缺陷
- 艺术中的缺陷
- Thinking in Java 多态的缺陷:域与静态方法
- java线程的缺陷
- java线程的缺陷
- java线程的缺陷
- Unity3D 通过鼠标滚轮来放大或缩小视角的大小
- linux私房菜 之centos 的安装
- ThinkPHP5 清除runtime缓存文件
- 工厂模式---mybatis中的应用
- Git图形管理界面TortoiseGit客户端的安装和使用
- Java多态中的缺陷
- iOS-URL编解码
- mysql定时器设置
- ArrayList中的构造函数问题
- [error] ld returned 1 exit status 问题
- 头条号想过新手,但指数却一直达不到650,该怎么过新手?
- 数据结构下的度的查找
- Hive的DDL和DML操作
- Oracle Operation