java和其他语言一样,子类可以继承父类,但父类不能继承子类。
譬如创建两个类,一个Fruit类,一个Apple类,你可以Fruit a = new Apple,不可以Apple a = new Fruit。
以常用的List型为例,你可以List l = new ArraytList,但不可以反着来。
而在List,Set等类型中,即使时它们的具体类型(就是用两个三角括号包起来的那个)是父子类的关系,它们也不能互相继承。
比如List<Fruit> a = new List<Apple>,Set<List> l =new Set<ArrayList>,这两种写法都是错的,但是List<Set> s = new ArrayList<Set>是正确的。
通过这两个例子,可以粗略的看到,对与可以进行细化元素类型的类型,即使细化的元素互为父子类关系,它们也不能够互相继承,而对类型本身则是不会遇到这个问题的。
这是因为java在运行程序时,会把List、Set之类的类型的类型细化(后面三角括号里的东西)全部擦除,擦除的结果就导致在运行时如果加入属于List但不属于ArrayList(以Set<List> l =new Set<ArrayList>这句代码为例)的元素,系统不会报错。这无疑会造成严重的错误。因此,为了避免这种错误,java决定在系统运行之前的检查中就规避掉这种行为。
同时,对于java的子类型还有如下的约束:
1.子类型可以增加方法,但不能删除方法
2.子类型需要具体化父类型中抽象的方法
3.子类型方法有更多的不变量,更强的前置条件和更弱的后置条件
子类和子类型
~类定义了类型
~子类定义了类型
~子类的对象可以被当做父类的对象使用
~赋值给父类的变量
~传递给需要父亲对象的函数
~放进存放父类对象的容器里
子类型与赋值
子类的对象可以赋值给父类的变量
多态变量
~java的对象变量是多态的,它们能保存不止一种类型的对象
~它们可以保存的是声明类型的对象,或声明类型的子类对象
~当把子类的对象赋给父类的变量的时候就发生了向上造型
多态变量的意思就是这个变量运行的时候在具体某一个时刻它所管理的那个对象是类型是会变化这叫做多态变量