Thinking in Java 多态的缺陷:域与静态方法
来源:互联网 发布:ios判断网络状态 编辑:程序博客网 时间:2024/05/22 06:14
P157
一旦你了解了多态机制,可能就会开始认为所有事物都可以多态地发生。然而,只有普通的方法调用可以是多态的。例如,如果你直接访问某个域,这个访问就将在编译期进行解析,就像下面的示例所演示的:
//: polymorphism/FieldAccess.java// Direct field access is determined at compile time.class Super { public int field = 0; public int getField() { return field; }}class Sub extends Super { public int field = 1; public int getField() { return field; } public int getSuperField() { return super.field; }}public class FieldAccess { public static void main(String[] args) { Super sup = new Sub(); // Upcast System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField()); Sub sub = new Sub(); System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField() + ", sub.getSuperField() = " + sub.getSuperField()); }} /* Output:sup.field = 0, sup.getField() = 1sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0*///:~
当Sub对象转型为Super引用时,任何域访问操作都将由编译器解析,因此不是多态的。在本例中,为Super.field和Sub.field分配了不同的存储空间。这样,Sub实际上包含两个称为field的域;它自己的和它从Super处得到的。然而,在引用Sub中的field时所产生的默认域并非Super版本的field域。因此,为了得到Super.field,必须显式地指明super.field.
尽管这看起来好像会称为一个容易令人混淆的问题,但是在实践中,它实际上从来不会发生。首先,你通常会将所有的域都设置成private,因此不能直接访问它们,其副作用是只能调用方法来访问。另外,你可能不会对基类中的域和导出类中的域赋予相同的名字,因为这种做法容易令人混淆。
如果某个方法是静态的,它的行为就不具有多态性:
//: polymorphism/StaticPolymorphism.java// Static methods are not polymorphic.class StaticSuper { public static String staticGet() { return "Base staticGet()"; } public String dynamicGet() { return "Base dynamicGet()"; }}class StaticSub extends StaticSuper { public static String staticGet() { return "Derived staticGet()"; } public String dynamicGet() { return "Derived dynamicGet()"; }}public class StaticPolymorphism { public static void main(String[] args) { StaticSuper sup = new StaticSub(); // Upcast System.out.println(sup.staticGet()); System.out.println(sup.dynamicGet()); }} /* Output:Base staticGet()Derived dynamicGet()*///:~
静态方法是与类,而并非与单个的对象相关联的。
0 0
- Thinking in Java 多态的缺陷:域与静态方法
- 缺陷:域与静态方法
- 多态的缺陷:域和静态方法
- 静态方法的缺陷
- 关于以Thinking in Java为课本的Java教与学的方法
- 关于以Thinking in Java为课本的Java教与学的方法
- Thinking in Java方法签名
- Thinking in Java---多态初探
- Thinking in C++: 静态指针与指向静态类型的指针
- Thinking in Java之break与continue的使用
- Thinking in Java之hashCode()方法
- Thinking in Java之hashCode()方法
- Thinking in java 基本类型方法重载
- thinking in java(day1)--equals方法
- 2014-03-26类中静态变量的初始化(摘自thinking in java)
- Thinking in java 之:静态数据的初始化及初始化顺序
- Thinking in Java Adapter与Proxy区别
- Thinking in Java 读书笔记-初始化与清理
- 成功解决 无法启动MySQL服务,错误1067:进程意外终止 错误
- 让Unity游戏后台运行
- Nineteen
- NYOJ113 字符串替换
- 史上最全 ——LINQ to SQL语句
- Thinking in Java 多态的缺陷:域与静态方法
- PB常用文件扩展名(后缀名)总结
- Java线程池使用说明
- 使用instantclient代替oarcle的client以安装使用PL/SQL Developer
- Vi编辑器
- JS实现自动加载
- 五个常用MySQL图形化管理工具
- 好工作
- 1452 - Jump(dp+约瑟夫环变形)