package jxau.blueDot.lyx;
/**
*
* @author liyixiang
* @2014-8-19
* @TODO:
* 关于继承的面试题:
* 第一种情况:2 4 6
* 结果 Sub
* 父类引用指向子类对象,子类重写了父类的方法,所以调用子类的方法
* 第二种情况:1 4 6
* 编译器出错
* 父类引用指向子类对象,调用的是父类的方法,而方法是private的
* 第三种情况:2 4 7
* 结果 Sub Sub
* 调用的是子类继承父类的print方法,该print方法被继承后就是子类的了,
* 所以sys中调用的是子类的showMe方法
* 第四种情况:1 4 7 重点
* 结果 Base
* 1.说明private的方法没有被继承。如果是继承 则应该调用子类的showMe方法
* 2.由于print来自于父类,而父类并不知道子类有什么样的表现,(就如同你还没
* 有孩子就要给孩子买多大的房,孩子并不一定需要)所以showMe调用的就是父
* 类自己的方法(因为他不知道他的孩子也有showMe方法)
* 第五种情况:2 5 6
* 结果 Sub
* 子类自身创建 调用重写方法
* 第六种情况:2 5 7
* 结果 Sub Sub
* 子类自身创建 调用重写方法
* 第七种情况:1 5 7 重点
* 结果 Base
* 由于print实在父类有定义的,无法识别子类新增的方法,所以只好去寻找父类自身 * 的showMe方法
* 第八种情况:3 5 7
* 结果 Base
* 修饰符为public的时候,编译器报错,因为final方法不能被重写,而改为privat * e编译通过,这就证明了private方法是不能被继承的!
*/
class Base{
//private String showMe() //1.
//public String showMe() //2.
final private String showMe() //3.final public String showMe() {
return "Base";
}
public void print(){
System.out.println(showMe());
}
}
public class Sub extends Base{
public String showMe(){
System.out.println("Sub");
return "Sub";
}
//测试
public static void main(String[] args){
//Base base = new Sub(); //4.
Sub base = new Sub(); //5.
// base.showMe(); //6.
base.print(); //7.
}
}