面向对象三大特性一一多态(polymorphism)
1 package com.bjsxt.oop.polymorphism; 2 3 public class Animal { 4 public void voice(){ 5 System.out.println("动物叫声"); 6 } 7 } 8 class Cat extends Animal{ 9 public void voice(){ 10 System.out.println("喵喵喵"); 11 } 12 } 13 class Dog extends Animal{ 14 public void voice(){ 15 System.out.println("汪汪汪"); 16 } 17 } 18 class Pig extends Animal{ 19 public void voice(){ 20 System.out.println("吭哧吭哧"); 21 } 22 }
1 package com.bjsxt.oop.polymorphism; 2 3 /**引用变量的2中类型 4 * 1,编译时类由声明事类型决定 5 * 2,运行时类型 由实际传入的对象类型决定 6 * 7 * 8 * 三个必要条件 9 * 要有继承 10 * 要有重写 11 * 父类引用指向子类对象 12 * @author Administrator 13 * 14 */ 15 public class Test { 16 /*如果没有多态,我们需要把每个子类的叫的方法写一遍,重载动物叫声方法 显然不方便 17 public static void testAnimalVoice(Cat c){ 18 c.voice(); 19 public static void testAnimalVoice(Dog d){ 20 d.voice(); 21 public static void testAnimalVoice(Pig p){ 22 p.voice(); 23 }*/ 24 //使用多态就很简单 编译时类由声明事类型决定 25 public static void testAnimalVoice(Animal a){ 26 a.voice(); 27 } 28 public static void main(String[] args) { 29 //运行时类型 由实际传入的对象类型决定 30 /*父类引用指向子类对象 31 Cat c = new Cat(); 32 Animal a = c; 33 我们写成下面这样 34 */ 35 Animal c = new Cat(); 36 Animal d = new Dog(); 37 Animal p = new Pig(); 38 testAnimalVoice(c); 39 testAnimalVoice(d); 40 testAnimalVoice(p); 41 42 } 43 }
我们试着重写方法
我们每一个动物,重写一个属于自己的方法;
1 package com.bjsxt.oop.polymorphism; 2 3 public class Animal { 4 public void voice(){ 5 System.out.println("动物叫声"); 6 } 7 } 8 class Cat extends Animal{ 9 public void voice(){ 10 System.out.println("喵喵喵"); 11 } 12 public void catchMouse(){ 13 System.out.println("猫抓老鼠"); 14 } 15 } 16 class Dog extends Animal{ 17 public void voice(){ 18 System.out.println("汪汪汪"); 19 } 20 public void seeDoor(){ 21 System.out.println("狗看门"); 22 } 23 } 24 class Pig extends Animal{ 25 public void voice(){ 26 System.out.println("吭哧吭哧"); 27 } 28 public void sleep(){ 29 System.out.println("猪在睡觉"); 30 } 31 } 32 class Tiger extends Animal{ 33 public void voice(){ 34 System.out.println("吼吼吼"); 35 } 36 public void eat(){ 37 System.out.println("老虎在吃饭"); 38 } 39 }
我们试着 调用一下
package com.bjsxt.oop.polymorphism;/**引用变量的2中类型* 1,编译时类由声明事类型决定* 2,运行时类型 由实际传入的对象类型决定* * * 三个必要条件* 要有继承* 要有重写* 父类引用指向子类对象* @author Administrator**/ public class Test {/*如果没有多态,我们需要把每个子类的叫的方法写一遍,重载动物叫声方法 显然不方便public static void testAnimalVoice(Cat c){c.voice();public static void testAnimalVoice(Dog d){d.voice();public static void testAnimalVoice(Pig p){p.voice();}*///使用多态就很简单 编译时类由声明事类型决定public static void testAnimalVoice(Animal a){a.voice();}public static void main(String[] args) {//运行时类型 由实际传入的对象类型决定/*父类引用指向子类对象Cat c = new Cat();Animal a = c;我们写成下面这样*/Animal c = new Cat();Animal d = new Dog();Animal p = new Pig();Animal t = new Tiger();testAnimalVoice(c);testAnimalVoice(d);testAnimalVoice(p);testAnimalVoice(t);//我们在我们重写了很多类的方法 我们试着调一下//c.cathMouse(); 报错The method cathMouse() is undefined for the type Animal//咦?说我们的抓老鼠的方法在Animal类里没定义 我让猫抓老鼠和你Animal有什么关系? 原来编译器不通过(编译器没那么智能,你传什么对象他就是啥了你得声明)是因为//编译器 只认证不认人 比如 你掉方法 c.cathMouse(); c是什么呢? Animal c = new Cat(); c的前面 类型写的是Animal 你就是Animal类型//既然 我们想让猫抓老鼠 那么 就强制转型被//在编译器的角度看c是Animal 类型我们强制转换(Cat)然后 用 新的Cat c1来接受新的对象Cat c1 = (Cat)c;c1.catchMouse();Dog d1=(Dog)d;d1.seeDoor();Pig p1 = (Pig)p;p1.sleep();Tiger t1 = (Tiger)t;t1.eat();//能把老虎转成猫吗?Cat c2 = (Cat)t;c2.catchMouse();//通过了,再次证明编译器死板//跑起来报错Exception in thread "main" java.lang.ClassCastException: com.bjsxt.oop.polymorphism.Tiger cannot be cast to com.bjsxt.oop.polymorphism.Cat//at com.bjsxt.oop.polymorphism.Test.main(Test.java:59)//老虎不能转成猫 } }
打印一下
喵喵喵 汪汪汪 吭哧吭哧 吼吼吼 猫抓老鼠 狗看门 猪在睡觉 老虎在吃饭
显然,这么做比较繁琐 ,不如做个逻辑判断,是啥就是啥。
1 //由于最后面的对象转型太繁琐,索性做一个逻辑判断 2 public static void testAnimalVoice(Animal a){ 3 a.voice(); 4 if(a instanceof Cat){ 5 ((Cat)a).catchMouse(); 6 }else if(a instanceof Dog){ 7 ((Dog)a).seeDoor(); 8 }else if(a instanceof Pig){ 9 ((Pig)a).sleep(); 10 }else{ 11 ((Tiger)a).eat(); 12 } 13 }
当然 里面也得做强制转换,否则,编译器不认,通不过。
1 public static void main(String[] args) { 2 //运行时类型 由实际传入的对象类型决定 3 /*父类引用指向子类对象 4 Cat c = new Cat(); 5 Animal a = c; 6 我们写成下面这样 7 */ 8 Animal c = new Cat(); 9 Animal d = new Dog(); 10 Animal p = new Pig(); 11 Animal t = new Tiger(); 12 testAnimalVoice(c); 13 testAnimalVoice(d); 14 testAnimalVoice(p); 15 testAnimalVoice(t); 16 }
打印看一下结果
喵喵喵 猫抓老鼠 汪汪汪 狗看门 吭哧吭哧 猪在睡觉 吼吼吼 老虎在吃饭
对象转型可以使父类对象的引用可以指向子类对象,给程序带来了比较好的可扩展性:我们可以在一个方法的参数里面定义父类的引用,然后实际当中传的时候传的是子类的对象,然后我们再在方法里面判断这个传过来的子类对象到底属于哪个子类,然后再去执行这个子类里面的方法或者调用这个子类里面的成员变量,因此程序的可扩展性比单独定义好多个方法要好一些。
转载于:https://www.cnblogs.com/PoeticalJustice/p/7617975.html
面向对象三大特性一一多态(polymorphism)相关推荐
- java 面向对象三大特性之多态 万字详解(超详细)
目录 前言 : 一.为什么需要多态 : 1.白璧微瑕 : 2.举栗(请甘雨,刻晴,钟离吃饭): 3.代码 : 4.问题 : 二.什么是多态 : 1.定义 : 2.多态的实现步骤(重要) : 三.多态的 ...
- 面向对象三大特性(多态)
一.今日回顾: 1.课程: <高等数学>,写了关于函数极值与最值,凹凸性的题目.从小学到大,第一次感觉到学习是一件非常考验定力的事情. 2.阅读: <java核心技术>< ...
- java面向对象三大特性之多态---编译时多态和运行时多态详解
一.引言 1.什么是多态? 说到重载和重写,大家可能都知道.它们都是多态性的体现,那么说什么是多态呢?多态是指允许不同子类型的对象对同一行为作出不同的响应.例如在生活中,比如跑的动作,小猫.小狗和大象 ...
- 【Java SE】面向对象三大特性之多态
何为多态? 多态,通俗一点说就是在完成某一个行为的时候,不同的对象会产生不同的形态. 比如说:打印机在完成打印行为的时候,可以根据不同的对象打印不同的类型,有黑白,有彩色等等,打印的结果是不一样的. ...
- 4 [面向对象]-三大特性:多态
1.多态 多态指的是一类事物有多种形态,比如 动物有多种形态:人,狗,猪 # 多态:同一类事物的多种形态 import abcclass Animal(object, metaclass=abc.AB ...
- 面向对象三大特性之多态
多态 什么是多态? 多态就是函数调用的多种形态,使用多态能够使得不同对象去完成同一件事,产生不同的动作和结果. 例如,在现实生活中普通人买票是全价,学生买票是半价,而军人允许有先买票.不同身份的人去买 ...
- 面向对象三大特性一一封装(encapsulation)
为什么要封装? 我们看电视,只要按一下开关和换台就行了.有必要了解电视的内部结构吗?有必要了解显像管吗? 封装是为了隐藏对象内部的复杂性,只对外公开简单的接口.便于外界调用,从而提高系统的可扩展性,可 ...
- polymorphism java_Java基础-面向对象第三大特性之多态(polymorphism)
Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...
- java 面向对象多态_乐字节Java面向对象三大特性以及Java多态
以上就是本次学习的6大任务.我们依次来看. 1 Object类 Object类是所有Java类的根基类. 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类. cla ...
最新文章
- 怎样开启mysql慢检查_如何开启mysql的慢查询
- [转]java中byte转换int时为何与0xff进行与运算
- git clone时出现 error:inflate:data stream error(incorrect data check)
- 前向验证对于模型的更新作用
- SSM(Spring+Spring MVC+Mybatis)整合 1:整体概述、目录内容及实验环境介绍
- Z-Stack Home Developer's Guide—5. Compilation Flags中文翻译【Z-Stack Home 1.2.0开发文档】
- 转 sqlserver 中NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、TABLOCKX
- asp.net core 2.0 web api + Identity Server 4 + angular 5 可运行前后台源码
- 解决“终端服务器超过了最大允许连接数”
- Leetcode 110.平衡二叉树
- Oracle常用SQL总结
- The New iPad’s Achilles Heel
- python 股票行情_十分钟学会用Python交易股票
- 【优化算法】差分松鼠搜索优化算法(DSSA)【含Matlab源码 1330期】
- OPNET网络仿真实验
- 泽林主办前沿IT技术分享峰会隆重召开,深度探讨人工智能、大数据与物联网 的未来发展趋势
- 如何阻止事件冒泡与默认事件?
- android 模拟器 blue,Win下的Android模拟器BlueStacks
- k8s学习笔记(10)--- kubernetes核心组件之controller manager详解
- 天津教育杂志天津教育杂志社天津教育编辑部2022年第30期目录
热门文章
- box-sizing: border-box;的作用
- Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现
- 微众银行电话面试java_微众银行面试试题是什么?微众银行怎么面试的?
- VisionMaster 学习笔记(USB 孔定位)
- 谷歌公开自动驾驶新专利:通过眼睛注视向量,精确判断注意力
- android 登陆界面动画,【Android开发】动画登录页面
- 2018年常用的7款Java框架
- h5 java实现微信分享_WebApp实现微信分享功能
- VisionPro空间转换
- WIFI基本知识及802.11协议整理