多态陷阱---域与静态方法
来源:互联网 发布:网络交换机的安装 编辑:程序博客网 时间:2024/06/18 17:29
最近又看了一遍Java编程思想,准备再系统的巩固一下基础知识
在多态机制中,并不是所有的事务都可以多态发生的,比如域与静态方法,事实上,只有普通的方法调用可以是多态的。
class Super{ public int field=0; public int getFiled() { return field; }}class Sub extends Super{ public int field=1; public int getFiled() { return field; } public int getSuperFiled() { return super.field; }}public class FieldAccess { public static void main(String[] args) { Super s1 = new Sub(); System.out.println("Sub.field:"+s1.field+ " Sub.getField:"+s1.getFiled()); Sub s2 =new Sub(); System.out.println("Sub.field:"+s2.field+ " Sub.getField:"+s2.getFiled() +" Sub.getSuperFiled:"+s2.getSuperFiled()); }}结果:
Sub.field:0 Sub.getField:1Sub.field:1 Sub.getField:1 Sub.getSuperFiled:0
当Sub对象转型为Super引用时,任何域访问操作都将由编译器解析,因此不是多态的。在本例中,为Supper.field分配了不同的存储空间。这样,Sub实际上包含两个称为field的域,它自己的和它从Super处得到的,在引用Sub中的field时所产生的默认域并非Super版本的field域,因此,为了得到Super.field,必须显示的指明Super.field
在实践中,这种情况可能不会发生,因为通常将所有的域都设置成private,因此不能直接访问他们,只能调用方法来访问。
如果某个方法是静态的,它的行为同样不具备多态性。
class StaticSuper{ public static String staticGet() { return "base staticGet"; } public String dynamicGet(){ return "base dynamicGet"; }}class StaticSub extends StaticSuper{ public String dynamicGet() { return "Sub dynamicGet"; } public static String staticGet() { return "Sub staticGet"; }}public class StaticPolymorphism { public static void main(String[] args) { StaticSuper sup =new StaticSub(); System.out.println(sup.staticGet()); System.out.println(sup.dynamicGet()); }}结果:
base staticGetSub dynamicGet
阅读全文
0 0
- 多态陷阱---域与静态方法
- 静态域与静态方法
- 域与静态方法
- Java静态域与静态方法
- Java静态域与静态方法
- Java静态域与静态方法
- 缺陷:域与静态方法
- 多态的缺点(“覆盖”私有方法、域与静态方法)
- 静态变量与静态方法
- 静态变量与静态方法
- 静态与非静态方法
- 静态变量与静态方法
- enable_from_this方法的使用与陷阱
- enable_from_this方法的使用与陷阱
- C++ 静态变量或成员初始化陷阱与缺陷
- Java中的常量、静态域与静态方法
- Java学习笔记【静态域与静态方法】
- Thinking in Java 多态的缺陷:域与静态方法
- python 类中@staticmethod,@classmethod和实例方法
- JS中为false的几种情况和typeof的返回值
- Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip
- Android平台美颜相机/Camera实时滤镜/视频编解码/影像后期/人脸技术探索——2.1 GPUImage结构简析
- 使用ServletContextListener完成定时任务(固定频率执行)
- 多态陷阱---域与静态方法
- Docker——版本升级(三)
- JAVA 8函数式编程(三):柯里化与惰性求值
- MPEG-1 Audio 编码器
- Unity Shader入门精要笔记(六):由一个简单的顶点/片元着色器谈起
- Centos7 安装redis及其入门使用
- 不同字符集编码的英文字母和中文汉字的字节数
- JS-高级 DOM 技术
- 覆盖与重载(一):泛型能决定方法宗量吗?