自己期末复习看的 内容不够严谨 翻译的也比较随便
泛型,继承和委托
泛型(generic)
List和List都是List<?>的子类型,因为?最大。
List是List<? extends Object>的子类型,因为Number是Object子类型,extends相当于小于等于。
List是List<? super String>的子类型,因为String是Object的子类型,super相当于大于等于。
//以下是合法的。
List< ? extends Integer> inList = new ArrayList<>();
List<? extends Number> numList = intList;
委托与继承(inheritance & delegation)
//这是委托
public class FriendshipGraph{
private Graph<Person> graph = Graph.empty();
public void addVertex(Person p){
graph.add(p);
}
....
}
- 在要调用的类里实例化一个对象,再通过这个对象调用其类里的方法。
//这是继承
public class FriendshipGraph<Person> extends ConcreteEdgeGraph<Person>{
public void addVertex(Person p){
super.add(p);
}
...
}
- 直接继承要用方法所在的类,然后通过super调用父类方法。
委托:依赖和关联(dependency & association )
- 依赖通过方法的参数或者在方法的局部中使用发生联系,说白了就是临时地使用了一次委托,这个委托没有本地变量保存,直接传给要用的方法,并且在其中会通过委托调用他类里的方法,举个例子:
Flyable f =new FlyWithWings();
Quackable q =new Quack();
Duck d = new Duck();
d.fly (f);
d.quack (q);
class Duck {
void fly (Flyable f){
f.fly ();
}
...
}
- 关联是永久的委托关系,说白了就是创建了一个对象实例,也可以说本地变量,去持久地保存那个委托,想调用什么那个类里的方法,随时引用这个对象调用就可以了,举个例子:
Flyable f = new FlyWithWIngs();
Duck d = new Duck(f);
Duck d2 = new Duck();
d.fly;
class Duck{
Flyable f = new CannotFly();
void Duck(Flyable f){
this.f = f;
}
void Duck(){
f = new FlyWithWings();
}
void fly() { f.fly();}
}
- 至于组合和聚合(composition & aggregation),其实就是关联的两个子类别。组合比较强,不能变化,一定得类内实例化,并且本地委托调用;聚合比较弱,用外部对象当作参数传入,委托不需要new新的实例化,只需本地对象指向它,从而调用函数。