“覆盖”私有方法 和 域与静态方法
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
另一个要注意的就是:如果某个方法是静态的,它的行为就不具有多态性。
静态方法是与类,而非与单个对象相关联的。