Java多态中重写static函数
2016-03-01 10:04
363 查看
Pitfall: fields and static methods
Once you learn about polymorphism, you can begin to think that everything happens polymorphically. However, only ordinary method calls can be polymorphic. For example, if you access a field directly, that access will be resolvedat compile time, as the following example demonstrates:
//: 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() = 1 sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0 *///:~When a Sub object is upcast to a Super reference, any field accesses are resolved by the compiler, and are thus not polymorphic. In this example, different storage is allocated for Super.field and Sub.field.
Thus, Sub actually contains two fields called field: its own and the one that it gets from Super. However, the Super version is not the default that is produced when you refer to field in Sub; in order to get the Super field you must explicitly say super.field.
Although this seems like it could be a confusing issue, in practice it virtually never comes up. For one thing, you’ll generally make all fields private and so you won’t access them directly, but only as side effects of calling methods. In addition, you probably
won’t give the same name to a base-class field and a derived-class field, because its confusing.
If a method is static, it doesn’t behave polymorphically:
//: 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() *///:~
static methods are associated with the class, and not the individual objects.
相关文章推荐
- 用Eclipse上传项目到svn服务器
- Java 正则表达式
- Struts2中的ModelDriven机制及其运用
- java中length属性、length()方法、size()方法的区别
- Java管道流的作用及应用
- spring学习小结8-使用factoryBean来配置bean
- Java中数组和List集合如何互相转换
- Java 中新增的 foreach 的用法
- Java 日期时间
- eclipse中将Java项目转换为web项目
- java 静态代码块和构造方法执行优先顺序
- Java数组
- java定时调度器解决方案分类及特性介绍
- Java 利用replaceAll 替换中括号
- Java多态中重写private函数
- Java多线程学习(三)
- Java String类
- eclipse老是卡在Refreshing workspace
- JRebel: ERROR Could not define reloadable class 'com.sun.proxy.$Proxy118': java.lang.OutOfMemoryError: PermGen space
- Java Character类