Java中有一条规则,子类复写父类的方法时,子类的这个方法的访问权限应该宽于或等于父类的那个方法的权限。举个例子,就是说如果父类中有一个方法是protected void getName(){}。则子类在复写该方法的时候,权限只能是public或者protected。不能是private。
所以看看下面这个程序,预测一下输出结果:
class Father{
public String className="Father";
public void className(){
System.out.println("FATHER");
}
}
public class Son extends Father{
private String className="Son";
public void className(){
System.out.println("SON");
}
public static void main(String args[]){
System.out.println(new Son().className);
System.out.println(((Father)new Son()).className);
new Son().className();
((Father)new Son()).className();
}
}
对于方法className(),子类Son复写了父类Father的这个className()。要知道复写之后就消失了,通过将子类对象强制转换成父类的方式是不可能访问到父类中那个被复写的方法了。所以,
new Son().className();
((Father)new Son()).className(); //这样已经访问不到Father的className了
但是对于域而言,是不存在复写的。Son中的className域是private的,而Father中的className域是public的。这样是合法的。这一点和方法的那个权限放宽规则是不同的。但是,Son中的className的域并没有覆盖Father中的className域,而是隐藏了他。所以使用将子类对象强制转换成父类的方式还是可以访问到的。
综上分析输出结果为:
Son
Father
SON
SON