第4节 多态的应用
7.4 多态的应用
多态的应用
技术基础
向上塑型技术:一个父类的引用变量可以指向不同的子类对象
动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性
7.4 多态的应用(续)——例7_9
声明一个抽象类Driver及两个子类FemaleDriver及MaleDriver
在Diver类中声明了抽象方法drives,在两个子类中对这个方法进行了重写
public abstract class Driver
{public Driver( ) { }
public abstract void drives( );}
public class FemaleDriver extends Driver { public FemaleDriver( ) { }
public void drives( ) {System.out.println("A Female driver drives a vehicle.");
}}public class MaleDriver extends Driver {public MaleDriver( ) { }public void drives( ) { System.out.println("A male driver drives a vehicle."); }}
public class Test1
{static public void main(String [ ] args)
{ Driver a = new FemaleDriver( );
Driver b = new MaleDriver( );
a.drives( );
b.drives( );
} }运行结果
A Female driver drives a vehicle.
A male driver drives a vehicle.
7.4 多态的应用(续)——例7_9改进
所有类都放在drive包中
试想有不同种类的交通工具(vehicle),如公共汽车(bus)及小汽车(car),由此可以声明一个抽象类Vehicle及两个子类Bus及Car
对前面的drives方法进行改进,使其接收一个Vehicle类的参数,当不同类型的交通工具被传送到此方法时,可以输出具体的交通工具
测试代码可改写如下:
public class DriverTest { static public void main(String [ ] args) { Driver a = new FemaleDriver( );
Driver b = new MaleDriver( );
Vehicle x = new Car( );
Vehicle y = new Bus( );
a.drives(x);
b.drives(y);
} }并希望输出下面的结果
A female driver drives a Car.
A male driver drives a bus.
Vehicle及其子类声明如下
public abstract class Vehicle
{ private String type;
public Vehicle( ) { }
public Vehicle(String s) { type = s; }
public abstract void drivedByFemaleDriver();
public abstract void drivedByMaleDriver();}
public class Bus extends Vehicle { public Bus( ) { }
public void drivedByFemaleDriver()
{ System.out.println("A female driver drives a bus."); }
public void drivedByMaleDriver()
{ System.out.println("A male driver drives a bus."); }}
public class Car extends Vehicle { public Car( ) { }
public void drivedByFemaleDriver()
{ System.out.println("A Female driver drives a car."); }
public void drivedByMaleDriver()
{ System.out.println("A Male driver drives a car."); }}
7.4 多态的应用(续)——例7_9改进
对FemaleDriver及MaleDriver类中的drives方法进行改进,在drives方法的定义体中不直接输出结果,而是调用Bus及Car类中的相应方法
public abstract class Driver { public Driver() { }
public abstract void drives(Vehicle v );}public class FemaleDriver extends Driver{ public FemaleDriver( ) { }
public void drives(Vehicle v){ v.drivedByFemaleDriver(); }}
public class MaleDriver extends Driver{ public MaleDriver( ) { }
public void drives(Vehicle v){ v.drivedByMaleDriver(); }}
运行结果
A Female driver drives a car.
A male driver drives a bus.说明
这种技术称为二次分发(“double dispatching”),即对输出消息的请求被分发两次首先根据驾驶员的类型被发送给一个类
之后根据交通工具的类型被发送给另一个类
多态的应用
技术基础
向上塑型技术:一个父类的引用变量可以指向不同的子类对象
动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性
7.4 多态的应用(续)——例7_9
声明一个抽象类Driver及两个子类FemaleDriver及MaleDriver
在Diver类中声明了抽象方法drives,在两个子类中对这个方法进行了重写
public abstract class Driver
{public Driver( ) { }
public abstract void drives( );}
public class FemaleDriver extends Driver { public FemaleDriver( ) { }
public void drives( ) {System.out.println("A Female driver drives a vehicle.");
}}public class MaleDriver extends Driver {public MaleDriver( ) { }public void drives( ) { System.out.println("A male driver drives a vehicle."); }}
public class Test1
{static public void main(String [ ] args)
{ Driver a = new FemaleDriver( );
Driver b = new MaleDriver( );
a.drives( );
b.drives( );
} }运行结果
A Female driver drives a vehicle.
A male driver drives a vehicle.
7.4 多态的应用(续)——例7_9改进
所有类都放在drive包中
试想有不同种类的交通工具(vehicle),如公共汽车(bus)及小汽车(car),由此可以声明一个抽象类Vehicle及两个子类Bus及Car
对前面的drives方法进行改进,使其接收一个Vehicle类的参数,当不同类型的交通工具被传送到此方法时,可以输出具体的交通工具
测试代码可改写如下:
public class DriverTest { static public void main(String [ ] args) { Driver a = new FemaleDriver( );
Driver b = new MaleDriver( );
Vehicle x = new Car( );
Vehicle y = new Bus( );
a.drives(x);
b.drives(y);
} }并希望输出下面的结果
A female driver drives a Car.
A male driver drives a bus.
Vehicle及其子类声明如下
public abstract class Vehicle
{ private String type;
public Vehicle( ) { }
public Vehicle(String s) { type = s; }
public abstract void drivedByFemaleDriver();
public abstract void drivedByMaleDriver();}
public class Bus extends Vehicle { public Bus( ) { }
public void drivedByFemaleDriver()
{ System.out.println("A female driver drives a bus."); }
public void drivedByMaleDriver()
{ System.out.println("A male driver drives a bus."); }}
public class Car extends Vehicle { public Car( ) { }
public void drivedByFemaleDriver()
{ System.out.println("A Female driver drives a car."); }
public void drivedByMaleDriver()
{ System.out.println("A Male driver drives a car."); }}
7.4 多态的应用(续)——例7_9改进
对FemaleDriver及MaleDriver类中的drives方法进行改进,在drives方法的定义体中不直接输出结果,而是调用Bus及Car类中的相应方法
public abstract class Driver { public Driver() { }
public abstract void drives(Vehicle v );}public class FemaleDriver extends Driver{ public FemaleDriver( ) { }
public void drives(Vehicle v){ v.drivedByFemaleDriver(); }}
public class MaleDriver extends Driver{ public MaleDriver( ) { }
public void drives(Vehicle v){ v.drivedByMaleDriver(); }}
运行结果
A Female driver drives a car.
A male driver drives a bus.说明
这种技术称为二次分发(“double dispatching”),即对输出消息的请求被分发两次首先根据驾驶员的类型被发送给一个类
之后根据交通工具的类型被发送给另一个类


