------- android培训、java培训、期待与您交流! ----------
JAVA多态
多态:可以理解为事务存在的多种体现形态
一、多态的提现:
l 父类的引用指向了自己的子类对象
l 父类的引用也可以接受自己的子类对象
例如
Class Animal{
public void eat()
{
System.out.println(“吃东西”);
}
}
Class Cat extends Animal
{
Public void catchMouse()
{
System.out.println(“抓老鼠”);
}
}
Class Dog extends Animal
{
Public void kanjia()
{
System.out.println(“看家”);
}
}
Class Demo
{
Public static void main(String[]args)
{
Animal c=new Cat();
c.eat();//父类引用指向子类对象 并且 调用子类eat()功能
Cat b=(Cat)c;
b.catchMouse();//如果想用c调用子类独有的功能则必须 将c强行转换成b
function(new Cat());//父类引用接受子类对象
}
Public static void function(Animal a)
{
a.eat();
}
/*
Public static void function1(Cat a)
{
C.eat();
}
Public static void function2(Dog d)
{
d.eat();
}
/*很明显 有了function function1和function2都可以省了*/
}
二、多态的前提
必须是类与类之间有关系,或者继承或者实现。通常还会有一个前提:存在覆盖
三、多态的好处
多态的出现大大提高了程序的扩展性
举例说明:电脑运行基于主板,主板上面有声卡,显卡,网卡等等
Interface PCI//PCI接口
{
Public void oper();
Pulblic void close();
}
Class Main Board
{
Public void run()
{
System.out.print(“mainboard run”);
}
Public void usePCI(PCI p)//将这个接口 安装到主板上
{
P.oper();
P.close();
}
}
//所有要插在主板上运行的程序都要实现这个接口
Class NetCard implemets PCI
{
Public void open()
{
System.out.println(“netcard oper”);
}
Public void close()
{
Sysetem.out.println(“netcard close”);
}
}
Class SoundCard implemets PCI
{
Public void open()
{
System.out.println(“SoundCard oper”);
}
Public void close()
{
Sysetem.out.println(“SoundCard close”);
}
}
Class Demo
{
Public static void main(String[]args)
{
Mainboard mb=new MainBoad();
Mb.run();
mb.usePCI(new NetCard());
mb usePCI(new SoundCard ());
}
}
有了PCI这个接口 无论以后要在主板上加上个什么卡 都可以很容易
在现实生活中接口可以看做是 插座 所有要用电的机器都需要创建一个插头 即:实现
这个接口 就可以运行起来 当然没有插头的电器也可以运行起来 不过很麻烦
四、多态的特点及弊端
l 在多态中成员函数的特点
在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有编译报错
在运行时期:参阅对象所属的类中是否有调用的方法
简单的总结就是:成员函数在多态的调用时,编译看左边有木有,运行看右边有木有
l 在多态中,成员变量的特点:
无论编译和运行,都参考左边 即引用类型所属的类
l 在多态中,静态成员函数的特点
静态函数在继承中没有覆盖的情况
无论编译和运行,都参考左边
弊端:通过多态的特点我们发现 多态提高了扩展性,但是只能使用父类引用访问父类中(存在)的成员