一、协变与逆变
若Cat类继承自Animal类,则可以Animal a = new Cat()
注意:
1.子类型可以增加方法但不能删除方法
2.子类型要实现抽象类型中所有方法
3.子类实现或覆盖父类方法时,返回值和异常要满足协变
4.子类实现或覆盖父类方法时,参数要满足逆变
协变:父类到子类越来越具体,而返回值和异常也要不变或越来越具体
如:Object->String Throwable->IOException
逆变:父类到子类越来越具体,而参数不变或越来越抽象
如:String->Object
但是java不支持逆变,将视为重载
二、子类型化
ArrayList<String>是List<String>的子类,但List<String>不是List<Object>的子类
采用通配符实现
List<Number>是List<?>的子类
List<Number>是List<? extends Object>的子类(Number是Object的子类)
List<Object>是List<? super Number>的子类(Object是Number的父类)
三、委托
一个对象请求另一个对象,可以代替继承复用
1.临时委托Dependency:没有固有的field
2.永久委托Association:有固有field
3. 更强的Composition:委托关系通过初始化建立,无法修改
4.更弱的 Aggregation:委托关系通过方法、构造函数、传入参数建立,可以修改