代码改变世界

黑马程序员-多态

2014-06-06 18:16  黑马程序员*  阅读(148)  评论(0)    收藏  举报

多态;可以理解为事物存在的多种形态。

1.多态的体现

       父类的引用指向了自己的子类对象。

       父类的引用也可以接受自己的子类对象。

2,多态前提

       必须是类与类之间必须是继承或是实现

       通常还有一个前提;具有共有方法。

       1.继承 2.重写3.父类引用指向子类对象。

3,多态的好处

       多态的出现大大的提高了程序的扩展性。

4,多态多弊端

       提高了扩展性,但是只能使用父类的引用访问父类中的成员。

多态的成员函数的特点;

       在编译时期;看所引用的类是否有调用的方法。

       在运行时期;参阅对象所属的类中是否有调用的方法。

       简单总结;成员函数在编译时看左边,在运行时看右边。

在多态中,成员变量的特点;

       无论编译和运行,都参考左边(引用型变量所在的类,成员变量没有覆盖的说法,覆盖只是相对于方法)

在多态中,静态成员变量的特点;

       无论编译和运行,都参考左边(静态不需要对象,引用找其所在的类,不需要参考右边的对象0)

       方法区分静态和非静态(包含this super)。

       静态方法都绑定在其所属的类上,静态绑定。

       动态绑定this.super,对象是谁就看谁。     

多态体现:一个接口,多个方法,如重载,覆盖,一个名字,多个方法

       Animal a = new Cat();

       在编译时期:a 为animal

       在运行时期:a 为Cat

class fu{

}

class zi extends fu{

       void show(){}

}

fu f  =new zi();

问题:f.show为什么不可以,f在运行期间不是调用zi的方法吗?

       在编译时期,编译器会查找f中是否有show()方法,没有编译失败,

       运行时期,运行子类的show(),那你查看父类的有无show()方法干什么,你又不调用!

       网上:多态的基础是动态的方法调度,它在运行时期调用重载方法的机制???

需求;

电脑运行实例,电脑运行基于主板

interface pci{

       public void open();

       public void close();

}

class Mainboard{

       public void run()    {

              System.out.println("mainboard run");

       }

       public void usepci(pci p){//主板要使用pci接口,接口必定要传入子类。   

              if (p!=null){//如果传入为空,则报错。                  

              p.open();

              p.close();

              }}}

class NetCard implements pci{// 一年后接了一个网卡,使网卡符合pci的标准,多态

       public void open()  {

              System.out.println("netcard open");

       }

       public void close()  {

              System.out.println("netcard close");

       }}

用户user---->接口Dao------主程序main:主程序使用接口,用户实现接口。

user implements Dao

多态: Dao d = new user();

d.add();

d.delete();

练习:对数据库的操作。

crud;creat read update delete

abstract interface UserDao{

       public abstract void add();

       public abstract void delete();

}

class jdbc implements UserDao{

       public void add(){....}  

       public void (delete){....}

}

class hibernate implements UserDao{

       public void add(){....}  

       public void (delete){....}

}