Thinking in Java 4th chap8笔记-多态(四)

2014-11-24 11:10:32 · 作者: · 浏览: 3
}
class Wind extends Instrument
{
@Override
public void play()
{
System.out.println("Wind Play");
}
}
class Brass extends Instrument
{
@Override
public void play()
{
System.out.println("Brass Play");
}
}
package com.book.chap8.multi;
import static java.lang.System.out;
/**
*
*多态在构造内部的调用--
*
 
* 在一个构造器内部调用一个动态绑定方法->则会调用导出类的覆盖方法,而这个方法所操纵的成员可能还未进行初始化。
*这肯定会有很大问题.
*
*
*
 
* Glyph(),before draw
* RoundGlyph.draw,radius=0
* Glyph(),after draw
* RoundGlyph.RoundGlyph,radius=3
*
*从输出可以看到基类调用的draw方法的确是导出类的draw,不过比较可惜的是,结果输出的半径radius确实0,而不是默认的1,
*这肯定不是我们想要的结果
*
*
*@author landon
*@since JDK1.6
*@version 1.0 2012-5-2
*
*/
public class PolyConstructor
{
public static void main(Stringargs)
{
new RoundGlyph(3);
}
}
class Glyph
{
void draw()
{
out.println("Glyph.draw");
}
public Glyph()
{
out.println("Glyph(),before draw");
draw();
out.println("Glyph(),after draw");
}
}
//圆的Glyph
class RoundGlyph extends Glyph
{
//注意这个半径被初始化成了1
private int radius = 1;
public RoundGlyph(int r)
{
radius = r;
out.println("RoundGlyph.RoundGlyph,radius=" + radius);
}
//注意覆写了这个在基类构造函数中调用的动态绑定方法
@Override
void draw()
{
out.println("RoundGlyph.draw,radius=" + radius);
}
}
package com.book.chap8.multi;
import static java.lang.System.out;
/**
*
*private 方法被覆盖的多态情况
* 编译不会报错,注:其实用Override注解的时候就会报错了
*
* 输出:private f(),在PrivateOverride本类中调用private方法是完全正确的
*
*@author landon
*@since JDK1.6
*@version 1.0 2012-4-27
*
*/
public class PrivateOverride
{
private void f()
{
out.println("private f()");
}
public static void main(Stringargs)
{
PrivateOverride po = new Derived();
//注:我们可能期待的结果是因为多态,调用Derived的f方法,不过因为覆盖的private方法,不是真正的覆盖,也即不是真正的多态;Derived中的f方法其实是一个新方法
po.f();
}
}
class Derived extends PrivateOverride
{
//@Override ,加上该注解就可以解决这个问题了
public void f()
{
out.println("public f");
}
}
package com.book.chap8.multi;
import static java.lang.System.out;
/**
*
*根据引用计数方法来清理共享的对象
*
*@author landon
*@since JDK1.6
*@version 1.0 2012-5-2
*
*/
public class ReferenceCounting
{
public static void main(Stringargs)
{
Shared shared = new Shared();
//shared对象被很多composing共享
Composing[] composings = {new Composing(shared),new Composing(shared),
new Composing(shared),new Composing(shared)};
for(Composing c : composings)
{
c.dispose();
}
}
}
//共享的shared对象
class Shared
{
private int refCount = 0;
//long,防止溢出
private static long counter = 0;
//对象id,final
private final long id = counter++;
public Shared()
{
out.println("Creating:" + this);
}
//增加对象引用
public void addRef()
{
refCount