最近一个阶段在学习java的多态特性,按照我个人的理解,首先多态的目的是为了更好的实现类型的兼容,其次如果子类覆盖了的方法时,如果把子类的对象赋给父类的应用,且调用父类接口的方法时,会调用子类中的方法,因为一个父类可能会有多个子类,那么在运行的过程中java是怎么知道具体是要调用那个子类中的方法的了?这个特性是由java中所谓的动态绑定的机制来保证的。就其多态本身而言不是很复杂,但是有三个比较容易绕的问题需要搞清楚,
(1)Pitfall: “overriding” private methods 即对于父类中的private 方法,子类不能进行覆盖,且用父类的引用调用private方法时只能调用父类中的方法
public class PiteFallPrivate {private void print() { System.out.println(“PeteFallPrivate…..”);}public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { PiteFallPrivate pfp = new T(); System.out.println(pfp.getClass().getName()); pfp.print();}}
class T extends PiteFallPrivate {// @Overridepublic void print() { System.out.println(“T method output…..”);}}
(2)Pitfall: fields and static methods 字段没有多态的特性,字段的值和应用有关系,而不会和具体的对象有关系
public class PiteFallField {public static void main(String[] args) { Super sup = new Sub(); System.out.println(sup.i); System.out.println(sup.getI()); System.out.println(new Sub().getSuper()); System.out.println(new Sub().i); System.out.println(new Sub().getI());}}
class Super {int i = 0;public int getI() { return i;}public Super() { System.out.println(“Super init….”); i = 6;}}
class Sub extends Super {int i = 1;public Sub() { System.out.println(“Sub init….”);}public int getI() { return i;}public int getSuper() { return super.i;}}
(3)static methods are associated with the class, and not the individual objects. static 方法的特性和字段相同
public class PitFallStaticMethod {public static void print(){ System.out.println(“base static method output….”);}public void print2(){ System.out.println(“base not static method output…”);}public static void main(String[] args) { PitFallStaticMethod pfs=new StaticMethodSub(); pfs.print(); pfs.print2(); }}
class StaticMethodSub extends PitFallStaticMethod{public static void print(){ System.out.println(“sub static method output….”);}public void print2(){ System.out.println(“sub not static method output…”);}}
打掉的应是脆弱的铁屑,锻成的将是锋利的钢刀。