黑马程序员——面向对象之多态
-------android培训、java培训、期待与您交流! ----------
多态
定义:事物存在的多种体现形态。
起因:Java引用变量有两个类型,一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时异常由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。
体现:父类的引用指向了子类的对象;父类的引用也可以接收自己的子类对象。
前提:类与类之间要么是继承关系,要么是实现关系。
好处:多态的出现大大的提高了程序的扩展性。
弊端:只能使用父类的引用访问父类中的成员。
转换:
向上转型:把一个子类对象直接赋给一个父类的引用变量。
向下转型:强制将父类的引用转成子类类型。
注意:多态自始至终都是子类对象在做变化。
特点:
(1) 在多态中非静态成员函数的特点:
编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过。如果没有,编译失败。
运行时期:参阅对象所属的类中是否有调用的方法。
也就是说,非静态成员函数在多态调用时,编译看左边,运行看右边。
(2) 在多态中静态成员函数的特点:
无论编译和运行都参考左边。
(3) 在多态中成员变量的特点:
无论编译和运行都参考左边。
实例:
//电脑主板示例
//协议接口
interface PCI
{
publicvoid open();
publicvoid close();
}
//电脑主板类
class MainBoard
{
publicvoid run()
{
System.out.println("主板运行!");
}
publicvoid usePCI(PCI p)//多态
{
if(p!=null)
{
p.open();
p.close();
}
}
}
//网卡类
class NetCard implements PCI
{
//实现接口中的抽象方法
publicvoid open()
{
System.out.println("网卡打开");
}
publicvoid close()
{
System.out.println("网卡关闭");
}
}
//声卡类
class SoundCard implements PCI
{
//实现接口中的抽象方法
publicvoid open()
{
System.out.println("声卡打开");
}
publicvoid close()
{
System.out.println("声卡关闭");
}
}
class duoTaiDemo
{
publicstatic void main(String[] args)
{
//创建主板对象
MainBoardmb=new MainBoard();
mb.run();
//使用网卡
mb.usePCI(newNetCard());
mb.usePCI(newSoundCard());
}
}
运行结果:
-------android培训、java培训、期待与您交流! ----------