Thinking in Java 4th chap8笔记-多态(五)
++;
}
//dipose方法,对象引用为0的时候,调用
protected void dispose()
{
if(--refCount == 0)
{
out.println("Disposing:" + this);
}
}
@Override
public String toString()
{
return "Shared " + id;
}
}
class Composing
{
//shared对象
private Shared shared;
private static long counter = 0;
private final long id = counter++;
public Composing(Shared shared)
{
out.println("Creating:" + this);
this.shared = shared;
//调用传入的shared的增加引用方法
this.shared.addRef();
}
protected void dispose()
{
out.println("diposing :" + this);
shared.dispose();
}
@Override
public String toString()
{
return "Composing " + id;
}
}
package com.book.chap8.multi;
/**
*
*向下转型之运行时类型识别
*
*@author landon
*@since JDK1.6
*@version 1.0 2012-5-2
*
*
*输出结果:
*Exception in thread "main" java.lang.ClassCastException: com.book.chap8.multi.Useful cannot be cast to com.book.chap8.multi.MoreUseful
* at com.book.chap8.multi.RTTI.main(RTTI.java:24)
*
*/
public class RTTI
{
public static void main(Stringargs)
{
Useful[] x = {new Useful(),new MoreUseful()};
x[0].f();
x[1].g();
//这句编译时就会报错
//x[1].u();
//注意:这两个类型转换编译不会报错,不过在运行后会检查类型,如果失败,则会抛出异常,如24L的语句
((MoreUseful)x[1]).u();//向下转型,RTTI
((MoreUseful)x[0]).u();
}
}
class Useful
{
public void f()
{
}
public void g()
{
}
}
//该接口继承了Useful接口,并扩展了三个方法u,v,w
class MoreUseful extends Useful
{
@Override
public void f()
{
}
@Override
public void g()
{
}
public void u()
{
}
public void v()
{
}
public void w()
{
}
}
package com.book.chap8.multi;
import static java.lang.System.out;
/**
*
*测试构造器的调用顺序
*
*1.调用基类构造器,这个步骤会不断的反复递归下去。首先是构造这种层次结构的根,然后是下一层导出类,等等,直至最低层的导出类。
* 2.按照声明顺序调用成员的初始化方法。
*3.调用导出类构造函数的主体。
*
*
*注:每个基类中也有相应的成员对象
*
*@author landon
*@since JDK1.6
*@version 1.0 2012-4-28
*
*/
public class Sandwich extends PortableLunch
{
private Bread b = new Bread();
private Cheese c = new Cheese();
private Lettuce l = new Lettuce();
public Sandwich()
{
out.println("Sandwich");
}
public static void main(Stringargs)
{
Sandwich sandwich = new Sandwich();
}
}
class Meal
{
private Bread bread = new Bread();
public Meal()
{
out.println("Meal");
}
}
class Bread
{
public Bread()
{
out.println("Bread");
}
}
class Cheese
{
public Cheese()
{
out.println("Cheese");
}
}
//生菜
class Lettuce
{
public Lettuce()
{
out.println("Lettuce");
}
}
class Lunch extends Meal
{
private Cheese cheese = new Cheese();
public Lunch()
{
out.println("Lunch");
}
}
class PortableLunch extends Lunch
{