黑马程序员——多态
来源:互联网 发布:企业出纳工作流程 知乎 编辑:程序博客网 时间: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
- 黑马程序员—多态
- 黑马程序员—多态
- 黑马程序员—多态
- 黑马程序员——多态
- 黑马程序员——多态
- 黑马程序员——多态
- 黑马程序员——多态
- 黑马程序员——多态
- 黑马程序员——多态
- 黑马程序员——多态
- 黑马程序员——多态
- 黑马程序员——多态
- 黑马程序员——多态
- 黑马程序员——多态
- 黑马程序员—泛型
- 黑马程序员—多线程
- 黑马程序员—DOM
- 黑马程序员—javabean
- MAC系统安装MySql
- SDWebImage详解
- POJ 百炼 保研机试 2713:肿瘤面积
- hybris 5.7下载安装教程
- Mysql学习篇之---四种Blob类型
- 黑马程序员——多态
- 网格部件如何实现列内容的自动换行
- 【Java并发编程】:使用synchronized获取互斥锁的几点说明
- bitnami redmine安装、配置、备份、恢复
- PopupWindow
- maven安装以及eclipse配置maven 和maven Integration for eclipse
- ubuntu下安装tensorflow到运行MNIST
- Android中Zxing扫描二维码
- CSDN网站系统升级公告