是决定花一段连续的时间把《Java编程思想》看一遍,看书怎么能不做笔记呢,明明知道自己有些地方看完肯定会忘掉的,所以想把每章的笔记重点放在博客上,与大家共享!
第八章 多态
多态的作用是消除类型之间的耦合关系
1.后期绑定
记得在第一章时就提到过自己之前不太理解的后期绑定,现在再看来,概念要明晰的多了。
首先,什么是绑定。其实就是一个方法里面调用了另一个方法。
其次,什么是前期绑定,后期绑定显然是相对于前期绑定而言的,在c语言中,在程序执行之前,我们就知道方法之前的绑定,这就是前期绑定。
然后,在java语言中,由于多态这个基本特性的出现,让前期绑定的实现变得不可操作,编译器在程序执行前只知道一个基类类型,调用哪个导出类(子类)是不可而知的。
最后,解决方案出来了:后期绑定–又称动态绑定,运行时绑定,顾名思义,在运行时根据对象的类型进行绑定。换句通俗的话说,编译器其实一直不知道对象的类型,但是这个方法调用机制能找到并调用正确的方法体。
静态方法不具有多态性
2.继承与清理
创建新对象的动作顺序,和清理回收的动作顺序相反。
当成员对象中存在其他一个或者多个对象共享的情况时,也许得使用 引用计数 来跟踪访问者共享对象的对象数量。
class Shared{
private int refcount = 0;
//跟踪创建的Shared的实例数量,为id提供数组
//long型防止溢出
private static long counter = 0;
//final修饰id,是因为不希望值在对象生命周期中被改变
private final long id = counter++;
public Shared(){
System.out.println("Creating " + this);
}
public void addRef(){
refcount++;
}
protected void dispose(){
if(--refcount == 0){
System.out.println("Disposing " + this);
}
}
public String toString(){
return "Shared " + id;
}
}
class Composing{
private Shared shared;
private static long counter = 0;
private final long id = counter++;
public Composing(Shared shared){
System.out.println("Creating " + this);
this.shared = shared;
this.shared.addRef();
}
protected void dispose(){
System.out.println("Disposing " + this);
shared.dispose();
}
public String toString(){
return "Composing " + id;
}
}
public class ReferenceCounting {
public static void main(String[] args) {
Shared shared = new Shared();
Composing[] composings = {
new Composing(shared),
new Composing(shared),
new Composing(shared),
new Composing(shared),
new Composing(shared),
};
for (Composing c : composings){
c.dispose();
}
}
}
//output:
/*
Creating Shared 0
Creating Composing 0
Creating Composing 1
Creating Composing 2
Creating Composing 3
Creating Composing 4
Disposing Composing 0
Disposing Composing 1
Disposing Composing 2
Disposing Composing 3
Disposing Composing 4
Disposing Shared 0
*/