黑马程序员——多态

来源:互联网 发布:企业出纳工作流程 知乎 编辑:程序博客网 时间:2024/05/20 20:57

------- android培训、java培训、期待与您交流! ----------


定义:某一类事物的多种存在的形态
例如: 动物中 猫 狗

  猫 x = new 猫();

同时猫也是动物中的一种,也可以把猫成为动物。

动物 y = new 猫();动物是猫狗具体事物中抽取出来的父型父型引用指向了子类对象

例如 函数:重载跟覆盖,就是函数的多态性体现

1.多态的体现
父类的引用指向了自己的子类对象 【动物c=new猫();】
父类的引用也可以接收自己的子类对象

2.多态的前提
必须是类与类之间有关系,要么继承,要么实现。

3.多态的【好处】
多态的出现大大的提高了程序的扩展性
通常还有一个前提:存在覆盖。
【弊端】:只能访问父类中的成员

4.多态的应用

<code class="hljs php has-numbering"><span class="hljs-keyword">abstract</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Animal</span>//动物的共性行为{</span>    <span class="hljs-keyword">abstract</span> void eat();<span class="hljs-comment">//共性行为【吃】的方法不确定,抽象【强制】</span>}<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Cat</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Animal</span>{</span>    <span class="hljs-keyword">public</span> void eat()    {        System.out.println(<span class="hljs-string">"吃鱼"</span>);    }    <span class="hljs-keyword">public</span> void catchMouse()    {        System.out.println(<span class="hljs-string">"抓老鼠"</span>);    }}<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Dog</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Animal</span>{</span>    <span class="hljs-keyword">public</span> void eat()    {        System.out.println(<span class="hljs-string">"吃骨头"</span>);    }    <span class="hljs-keyword">public</span> void KanJia()    {        System.out.println(<span class="hljs-string">"看家"</span>);    }}<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Pig</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Animal</span>{</span>    <span class="hljs-keyword">public</span> void eat()    {        System.out.println(<span class="hljs-string">"饲料"</span>);    }    <span class="hljs-keyword">public</span> void gongdi()    {        System.out.println(<span class="hljs-string">"拱地"</span>);    }}<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DuoTaiDemo</span>{</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> void main(String[] args)     {        <span class="hljs-comment">//Cat c = new Cat();</span>        <span class="hljs-comment">//c.eat();</span>        <span class="hljs-comment">//Dog d = new Dog();</span>        <span class="hljs-comment">//d.eat();</span>        <span class="hljs-comment">/*        Cat c = new Cat();        //c.eat();        Cat c1 = new Cat();       [code]00[/code]        //c1.eat();        function(c1);        function(new Dog());        function(new Pig());        */</span>         <span class="hljs-comment">//Cat c = new Cat();//不是多态</span>        <span class="hljs-comment">//Animal c = new Cat();//一个对象具备多种形态造成的,既是猫类型 同时也是动物类型</span>        <span class="hljs-comment">//c.eat();</span>        <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(new Cat<span class="hljs-params">()</span>)</span>;</span>        <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(new Dog<span class="hljs-params">()</span>)</span>;</span>        <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(new Pig<span class="hljs-params">()</span>)</span>;</span>    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> void <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(Animal a)</span>//<span class="hljs-title">Animal</span> <span class="hljs-title">a</span> = <span class="hljs-title">new</span> <span class="hljs-title">Cat</span><span class="hljs-params">()</span>;</span>    <span class="hljs-comment">//提高代码的扩展性</span>    {        a.eat();    }    <span class="hljs-comment">/*    public static void function(Cat c)//Cat c= new Cat();    {        c.eat();    }    public static void function(Dog d)    {        d.eat();    }        public static void function(Pig p)    {        p.eat();    }    */</span>}</code>
<code class="hljs cs has-numbering">class DuoTaiDemo2{    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args)     {        Animal a = <span class="hljs-keyword">new</span> Cat();<span class="hljs-comment">//类型提升。byte b =2; int x =b;  b提升为int类型</span>        <span class="hljs-comment">//将猫提升为了动物。向上转型</span>        a.eat();        <span class="hljs-comment">//如果想要调用猫的特有方法时,如何操作?</span>        <span class="hljs-comment">//Cat c = new Cat();//又新建了一个对象不是原对象</span>        <span class="hljs-comment">//可以将 强制将父类的引】用,转成了子类类型。 向下转型</span>        Cat c =(Cat)a;<span class="hljs-comment">// 【左边】 为要转换的类型</span>        c.catchMouse();    <span class="hljs-comment">/*    //【合起来的这两句就是错误的,先建立了一个动物的对象,不确定是什么动物,然后把动物变成 猫,这个是不符合逻辑的】        Animal a = new Animal();        Cat c =(Cat)a;        【千万不要出现如此操作,将父类对象转成子类类型】,猫是动物,但动物不一定是猫。        我们能转换的是父类的引用指向了自己子类的对象是,有【明确的对象】,那该引用可以被提升也可以被强制转换。        简单的说 知道了对象是【猫】了,那根据程序的要求,猫的属性【既是动物】,【又是猫】        多态自始至终都是【子类对象】在做变化    */</span>    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">function</span>(Animal a)//Animal a = <span class="hljs-keyword">new</span> Cat();    {        a.eat();    }}</code>

在多态中成员函数的特点(非静态 重写特性)
在【编译】时期:参阅【引用型】变量所属类型红是否有调用的方法,如果有编译通过,如果没有则失败
在【运行】时期:参阅【对象】所属的类中是否有调用的方法

简单点总结就是:成员函数在多态调用时,编译看左边,运行看右边。

子类访问父类,子类有的就访问自己的,没有就找父类的,父类没有编译失败。局部有的变量,就看局部的,局部没有就找成员的,成员没有找父类,父类也没有就要失败

特殊一:
在多态中成员变量的特点
无论编译或者运行都是参考左边(引用型变量所属的类)

特殊二:
在多态中,【静态】成员函数的特点,无论是编译或者运行都是参考左边。


<code class="hljs fsharp has-numbering">/*需求:电脑运行实例电脑运行基于主板<span class="hljs-comment">//正常的写法</span><span class="hljs-keyword">class</span> MainBoard{    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> run()     {        System.out.println(<span class="hljs-string">"mianboarid run"</span>);    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> useNetCard(NetCard c)<span class="hljs-comment">//方法名上下一致。注意大小写 </span>    {        c.<span class="hljs-keyword">open</span>();        c.close();    }}<span class="hljs-keyword">class</span> NetCard{    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-keyword">open</span>()    {        System.out.println(<span class="hljs-string">"nercard open"</span>);    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> close()    {        System.out.println(<span class="hljs-string">"nercard close"</span>);    }}<span class="hljs-keyword">class</span>  DuoTaiDemo5<span class="hljs-comment">//文件名保持一致</span>{    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(String[] args)     {        MainBoard mb = <span class="hljs-keyword">new</span> MainBoard();        mb.run();        mb.useNetCard(<span class="hljs-keyword">new</span> NetCard());    }}*/<span class="hljs-comment">//接口的写法</span><span class="hljs-keyword">interface</span> PCI<span class="hljs-comment">//接口的出现增加了功能的扩展,多态的应用增加了程序的扩展性</span>{    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-keyword">open</span>();    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> close();}<span class="hljs-keyword">class</span> MainBoard{    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> run()    {        System.out.println(<span class="hljs-string">"mainboard run"</span>);    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> usePCI(PCI p)<span class="hljs-comment">//PCI p = new NetCard();// 接口型对象指向了自己的子类对象</span>    {        <span class="hljs-keyword">if</span>(p!=<span class="hljs-keyword">null</span>)        {            p.<span class="hljs-keyword">open</span>();            p.close();        }    }}<span class="hljs-keyword">class</span> NetCard implements PCI<span class="hljs-comment">//扩展保持规则</span>{    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-keyword">open</span>()    {        System.out.println(<span class="hljs-string">"nercard open"</span>);    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> close()    {        System.out.println(<span class="hljs-string">"nercard close"</span>);    }}<span class="hljs-keyword">class</span> SoundCard implements PCI<span class="hljs-comment">//扩展保持规则</span>{    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-keyword">open</span>()    {        System.out.println(<span class="hljs-string">"SoundCard open"</span>);    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> close()    {        System.out.println(<span class="hljs-string">"SoundCard close"</span>);    }}<span class="hljs-keyword">class</span> DuoTaiDemo5<span class="hljs-comment">//文件名保持一致</span>{    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(String[] args)     {        MainBoard mb = <span class="hljs-keyword">new</span> MainBoard();        mb.run();        mb.usePCI(<span class="hljs-keyword">null</span>);        mb.usePCI(<span class="hljs-keyword">new</span> NetCard());        mb.usePCI(<span class="hljs-keyword">new</span> SoundCard());    }}</code>
<code class="hljs axapta has-numbering"><span class="hljs-comment">/*    视屏 104需求:数据库的操作1.连接数据库 JDBC  Hibernate2.操作数据库    c cteate r read u upad d delete3.关闭数据库*/</span><span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">UseInfoDao</span>{</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> add(User user);    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> delete(User user);}<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UseInfoByJDBC</span> <span class="hljs-inheritance"><span class="hljs-keyword">implements</span></span> <span class="hljs-title">UseInfoDao</span> //实现接口功能{</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> add(User user)    {        <span class="hljs-number">1.</span>JDBC连接数据库;        <span class="hljs-number">2.</span>使用sql 添加语句 添加数据;        <span class="hljs-number">3.</span>关闭连接;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> delete(User user)    {        <span class="hljs-number">1.</span>JDBC连接数据库;        <span class="hljs-number">2.</span>使用sql 删除语句 删除数据;        <span class="hljs-number">3.</span>关闭连接;    }}<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UseInfoByHibernate</span> <span class="hljs-inheritance"><span class="hljs-keyword">implements</span></span> <span class="hljs-title">UseInfoDao</span>////实现接口功能{</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> add(User user)    {        <span class="hljs-number">1.</span>Hibernate连接数据库;        <span class="hljs-number">2.</span>使用sql 添加语句 添加数据;        <span class="hljs-number">3.</span>关闭连接;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> delete(User user)    {        <span class="hljs-number">1.</span>Hibernate连接数据库;        <span class="hljs-number">2.</span>使用sql 删除语句 删除数据;        <span class="hljs-number">3.</span>关闭连接;    }}<span class="hljs-class"><span class="hljs-keyword">class</span>  <span class="hljs-title">DBoperate</span>//使用功能{</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(String[] args)     {        <span class="hljs-comment">//UseInfoByJDBC ui = new UseInfoByJDBC();</span>        UserInfoDao ui =  ;        ui.add(user);        ui.delete(user);    } }</code>

------- android培训、java培训、期待与您交流! ----------

0 0
原创粉丝点击