继承与多态
public class Animal{ protected void sleep(){ System.out.println("Animal"); } } public class Person extends Animal{ private void sleep(){ System.out.println("Person"); } }
public class Base{ public Base(int i){} } public class Sub extends Base{ } //该类编译报错,父类没有默认构造器,子类的默认构造器找不到父类的默认构造器
父类: public class Base{ public int test(){ return 1; } } 子类: public class Sub extends Base{ public String test(){ return "test"; } } 测试: public class Test{ public static void main(String[] args){ Base b = new Sub(); int i = b.test(); } }
假设可以这样写,从语法和语义角度看没有问题。运行时,b虽然声明为Base类型,但它的真正实例为Sub类型。这样根据多态,调用 b.test()应该使用子类的test方法,这样就返回一个String,这样程序便会出现转换异常,所以这样写会导致程序的不安全性,所以假设不成 立,问题得证。
进一步的补充:
父类: public class Base { public Object test(){ return "base"; } } 子类: public class Sub extends Base{ public String test(){ return "sub"; } } 测试: Base o = new Sub(); System.out.println(o.test());
打印输出:
sub
分析:子类覆盖的方法的返回值是父类该方法的extension,这样在多态情况下没有问题。也能实现覆盖了。所以上面的方法返回值的约束可以做点修正哈。