首页 > 代码库 > 黑马程序员 多态

黑马程序员 多态

多态:
定义:某一事物的多种存在形态。
比如说:动物,它有多种存在形态,猫、狗、猪都是动物的具体存在形态,动物是它们的父类,比如猫是动物的一种,同时可以说动物的一种是猫。父类型引用指向了子类对象。
1、多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接受自己的子类对象。(在下面的 3、多态的好处 最后那段代码有所体现)
2、多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
abstract class Animal
{
abstract static void eat();
}
//继承抽象类Animal,并实现了父类的抽象函数
class Cat extends Animal
{
public static void eat()
{
System.out.println("吃鱼");
}
}
//直接继承Cat类,无需实现
class BoSiCat extends Cat
{

}
class Test
{
public static void main(String[] args)
{
function(new Cat());
function(new Bosimao());
}
public static Animal function(Animal a)
{
a.eat();
}
}
上述代码中,我们看到Animal存在eat()方法,但是并没有实现,Cat类继承后进行了实现,而在BoSiCat类中,直接继承Cat类,并没有覆盖实现,在这里是符合多态的前提的
3、多态的好处
多态的出现大大的提高了程序的扩展性。
如果没有多态的话,上述可独立运行的Test类的实现方式就变成了
public static void main(String[] args)
{
Cat c=new Cat();
c.eat();
BoSiCat bsc=new BoSiCat();
bsc.eat();
}
我们发现里面有重复的部分,c.eat();和bsc.eat();为了提高代码复用性,我们进行了优化,变成如下方式:
public static void main(String[] args)
{
Cat c=new Cat();
function(c);
BoSiCat bsc=new BoSiCat();
function(bsc);
public static void funtion(Cat c)
{
c.eat();
}
public static void funtion(BoSiCat bsc)
{
bsc.eat();
}
}
但是如此这样的话,我们又发现了另一个问题,每次新建一个具体的对象,而为了达到同样的目的我们就得在Test类里面写一个相对应的function()函数,而运用多态就变得更加简单和实用
,如下方式不仅是提高了代码的复用性,而且使得程序扩展性更
强,不管再增加什么样的动物,公共的行为代码function(new XXXX());就可以搞定。
public static void main(String[] args)
{
| Animal c=new Cat();
function(new Cat()); | function(c);
或 Animal bsc=new BoSiCat();
function(new BoSiCat()); | function(bsc);
|
public static void funtion(Animal a)
{
a.eat();
}
}
当应用了多态以后,为了调用子类的特有的函数,我们通过向下转型将父类型对象强制转换成子类:
Animal a=new Cat();
a.eat();
Cat c=(Cat)a
c.catchMouse();(子类特有函数)
但是如下操作,将父类对象转换为子类对象,是禁止的:
Animal a=new Animal();
Cat c=(Cat)a;
在多态里操作的始终是子类的对象,而且在创建了一个父类对象的时候,我们并不知道父类对象具体是什么,盲目的进行强制转换也是不对的。
4、多态的弊端:
虽然提高了扩展性,但是只能通过父类的引用访问父类的成员

5、多态的应用
下面的一段代码不仅是多态应用的体现,而且体现了接口的扩展性
package com.test;

interface PCI{
public void open();
public void close();
}
class MainBoard{
public void usePCI(PCI p){
if(p!=null){
p.open();
p.close();
}
}
public static void mbrun(){
System.out.println("mainboard run");
}
}
class NetCard implements PCI{
public void open(){
System.out.println("NetCard Open");
}

public void close() {
System.out.println("NetCard Open");
}
}

class SoundCard implements PCI{
public void open(){
System.out.println("SoundCard Open");
}

public void close() {
System.out.println("SoundCard Open");
}
}

 

public class DuoTaiDemo {
public static void main(String[] ars){
MainBoard mb=new MainBoard();
/* MainBoard.mbrun();*/
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());
}
}

6、多态的出现在代码中的特点:(多态的使用的注意事项)

接口:增强功能扩展性
多态:程序扩展性

在多态中成员函数的特点:
在编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有编译失败。
在运行时期,参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用中,编译看左边,运行看右边。

在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。

在多态中,静态成员函数的特点:
无论编译和运行,都参考左边。

见识浅薄,有错误和不足的地方,请博友指正,谢谢了