Thinking in Java 4th chap8笔记-多态(六)
private Lettuce lettuce = new Lettuce();
public PortableLunch()
{
out.println("Portable Lunch");
}
}
package com.book.chap8.multi;
/**
*
*讨论静态 与多态
*因为static是与类相关的,而不是与单个对象相关联的
*
*@author landon
*@since JDK1.6
*@version 1.0 2012-4-27
*
*/
public class StaticPolymorphism
{
public static void main(Stringargs)
{
StaticSuper sup = new StaticSub();
//这里当然会调用StaticSuper类的静态方法,这早就绑定好了,因为其属于类
System.out.println(sup.staticGet());
System.out.println(sup.dynamicGet());
}
}
class StaticSuper
{
public static String staticGet()
{
return "Base StaticGet";
}
public String dynamicGet()
{
return "Base DynamicGet";
}
}
class StaticSub extends StaticSuper
{
//@Override,可以测试,加上Override注解肯定报错
public static String staticGet()
{
return "Derived StaticGet";
}
@Override
public String dynamicGet()
{
return "Derived DynamicGet";
}
}
package com.book.chap8.multi;
/**
*
*使用组合的好处之一:动态灵活性
*一条通用的准则:用继承表达行为间的差异,用字段表达状态的变化。
*1.本例,通过继承得到了两个不同的类,用于表达act方法的差异
*2.Stage通过运用组合使自己的状态发生变化。这种情况下,这种状态的改变也就产生了行为的改变。
*
*@author landon
*@since JDK1.6
*@version 1.0 2012-5-2
*
*/
public class Transmogrify
{
public static void main(Stringargs)
{
Stage stage = new Stage();
stage.performPlay();
stage.change();
stage.performPlay();
}
}
class Actor
{
public void act()
{
}
}
class HappyActor extends Actor
{
@Override
public void act()
{
System.out.println("Happy Actor");
}
}
class SadActor extends Actor
{
@Override
public void act()
{
System.out.println("Sad Actor");
}
}
//注意该类使用了组合的方式,change方法可以动态改变行为,很灵活
class Stage
{
private Actor actor = new HappyActor();
public void change()
{
actor = new SadActor();
}
public void performPlay()
{
actor.act();
}
}