Java编程思想学习之多态的坑

“覆盖”私有方法 和 域与静态方法

1.“覆盖”私有方法
给出下面的例子:

package com.ran.unit8;

public class PrivateOverride {
    //private方法被自动认为是final方法,对子类是屏蔽的。所以Derived中的方法是一个全新的方法
    private void f(){
        System.out.println("private f()");
    }
    public static void main(String []args){
        PrivateOverride privateOverride = new Derived();
        privateOverride.f();
    }
}

class Derived extends PrivateOverride{
    public void f(){
        System.out.println("public f()");
    }
}

我们期望的输出是public f() ,但是由于private方法自动被认为是final方法,所以子类是不能继承并重载这个方法的。在这种情况下,Derive的类中的f()方法就是一个全新的方法。
结论
只有非private方法才可以被覆盖;

2.域与静态方法
只有普通的方法调用可以是多态的
给出下面的域的例子:

package com.ran.unit8;

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();
        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());
    }
}

输出结果:

sup.field:0 sup.getField()1
sub.field:1 sub.getField()1 sub.getSuperField()0

在例子中:当Sub对象向上转型为Super引用时,对于普通方法getField()
其展现出了多态。而sup.field的访问操作是由编译器解析,输出的还是父类的成员值。在Sub对象中实际上是有两个field域。要想访问父类的field,就必须显式地调用:super.field

另一个要注意的就是:如果某个方法是静态的,它的行为就不具有多态性。
静态方法是与类,而非与单个对象相关联的。

猜你喜欢

转载自blog.csdn.net/lll0101/article/details/88722858
今日推荐