Java从零开始学十六(多态)
一、什么是多态
多态有两种表现形式:重载和覆盖
首先说重载(overload),是发生在同一类中.与什么父类子类、继承毫无关系.
标识一个函数除了函数名外,还有函数的参数(个数和类型).也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同.
他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!
再说覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生.
我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍.
这样再调用这个方法的时候,就是执行子类中的过程了.父类中的函数就被覆盖了.(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系)
二、简单实现
package com.pb.demo6;
public abstract class Pet {
private String name; //宠物名字
private String sex; //宠物性别
private int health; //宠物的健康值
//宠物看病的方法
abstract void toHospital();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
}
package com.pb.demo6;
/*
* 小狗类
*/
public class Dog extends Pet { @Override
void toHospital() {
//小狗看病的方法
System.out.println("小狗看病:打针、吃药!"); } } package com.pb.demo6;
/*
* 小猪类
*/
public class Pig extends Pet { @Override
void toHospital() {
System.out.println("小猪看病:打针、睡觉!"); } }
package com.pb.demo6;
/*
* 小鸟类
*/
public class Bird extends Pet { @Override
void toHospital() {
//小鸟看病的方法
System.out.println("小鸟看病:吃药、休息!"); } }
package com.pb.demo6;
/*
* 宠物医生类
*/
public class Doctor { //医生治疗方法
public void cure(Pet pet){ //将宠物传参 if(pet.getHealth()<50){ //判断健康值小于50
//调用看病的方法
pet.toHospital();
//将健康值设置为60,健康
pet.setHealth(60);
}
} }
测试类
package com.pb.demo6;
/*
* 测试类
*/
public class Test { public static void main(String[] args) {
//声明医生对象
Doctor dc=new Doctor();
//声明宠物对象为小鸟
Pet brid=new Bird();
//调用医生的治疗方法
dc.cure(brid);
//声明宠物对象为小狗
Pet dog=new Dog();
//调用医生的治疗方法
dc.cure(dog);
//声明宠物对象为小猪
Pet pig=new Pig();
//调用医生的治疗方法
dc.cure(pig); } }
结果:
小鸟看病:吃药、休息!
小狗看病:打针、吃药!
小猪看病:打针、睡觉!
三、对象的多态性
3.1 对象向上转型:
//声明宠物对象为小鸟
Pet brid=new Bird();
//声明宠物对象为小狗
Pet dog=new Dog();
//声明宠物对象为小猪
Pet pig=new Pig();
编译时类型为:Pet,而运行时类型为具体的类型
也就是说编译时类型由声明该变量时使用类型决定,而运行时类型由实际赋给该变量的对象决定
3.2 对象向下转型:
四、instanceof 关键字
package com.pb.demo6;
public abstract class Pet {
private String name; //宠物名字
private String sex; //宠物性别
private int health; //宠物的健康值
//宠物看病的方法
abstract void toHospital();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
}
package com.pb.demo6;
/*
* 小鸟类
*/
public class Bird extends Pet { @Override
void toHospital() {
//小鸟看病的方法
System.out.println("小鸟看病:吃药、休息!"); }
public void fly(){
System.out.println("小鸟会飞!");
} }
package com.pb.demo6;
/*
* 小狗类
*/
public class Dog extends Pet { @Override
void toHospital() {
//小狗看病的方法
System.out.println("小狗看病:打针、吃药!"); }
public void run(){
System.out.println("小狗在地上跑!");
} }
package com.pb.demo6;
/*
* 小猪类
*/
public class Pig extends Pet { @Override
void toHospital() {
System.out.println("小猪看病:打针、睡觉!"); }
public void sleep(){
System.out.println("小猪要睡觉!");
}
}
package com.pb.demo6;
/*
* 宠物医生类
*/
public class Doctor { //医生治疗方法
public void cure(Pet pet){ //将宠物传参 if(pet.getHealth()<50){ //判断健康值小于50
//调用看病的方法
pet.toHospital();
//将健康值设置为60,健康
pet.setHealth(60);
//判断是宠物类型
if(pet instanceof Dog){
//向下转型,强制类型转制
Dog dog=(Dog)pet;
//调用小狗自己的方法
dog.run();
}else if(pet instanceof Bird){
//向下转型,强制类型转制
Bird bird=(Bird)pet;
//调用小鸟自己的方法
bird.fly();
}else if(pet instanceof Pig){
//向下转型,强制类型转制
Pig pig=(Pig)pet;
//调用小猪自己的方法
pig.sleep();
}
}
} }
package com.pb.demo6;
/*
* 测试类
*/
public class Test { public static void main(String[] args) {
//声明医生对象
Doctor dc=new Doctor();
//声明宠物对象为小鸟
Pet brid=new Bird();
//调用医生的治疗方法
dc.cure(brid);
//声明宠物对象为小狗
Pet dog=new Dog();
//调用医生的治疗方法
dc.cure(dog);
//声明宠物对象为小猪
Pet pig=new Pig();
//调用医生的治疗方法
dc.cure(pig); } }
结果:
小鸟看病:吃药、休息!
小鸟会飞!
小狗看病:打针、吃药!
小狗在地上跑!
小猪看病:打针、睡觉!
小猪要睡觉!
五、父类做为形参
package com.pb.demo2;
/*
* 商品类
*/
public class Goods {
//打印商品价格方法
public void printPrice(){
System.out.println("打印商品价格");
}
} package com.pb.demo2;
/*
* 食品类
*/
public class Foods extends Goods { @Override
public void printPrice() {
System.out.println("打印食品类的商品价格!");
} }
package com.pb.demo2;
/*
* 电视类
*/
public class TVs extends Goods { @Override
public void printPrice() {
System.out.println("打印电视类商品价格!");
} }
测试类:
package com.pb.demo2;
public class Test {
public static void main(String[] args) {
//声明3 个商品价格
Goods good=new Goods();
Foods food=new Foods();
TVs tvs=new TVs();
//调用方法
showPrice(good);
showPrice(food);
showPrice(tvs);
}
//显示商品价格方法
static void showPrice(Goods good){
good.printPrice();
}
}
结果:
打印商品价格
打印食品类的商品价格!
打印电视类商品价格!
Java从零开始学十六(多态)的更多相关文章
- Java从零开始学十八(抽象类和接口)
一.什么是抽象类和接口 抽象类.接口与类是一个层次的概念,是java中极其重要的概念. 抽象类是从多个类中抽象出来的公共模板,提供子类均具有的功能. 接口是从多个类中抽象出来的规范,体现的是规范和实现 ...
- Java从零开始学十九(异常)
一.什么是异常 从字面上讲,就是不正常的现实就是异常. 程序中的异常也是要在程序运行中才会偶尔发生.如果程序还没有运行,编译就报错,这种不叫异常,这种叫编译错误,通常是语法上的错误 二.java中异常 ...
- Java从零开始学十五(继承)
一.继承作用 继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性 继承使重一个类A能够直接使用另外一个类B的属性和方法的一种途径 类A可以有自己的属性和方法 ...
- Java从零开始学十四(包和访问控制)
一.java中的包 Java文件的组织形式Windows中的文件功能类似 在开发比较大的项目时,不可能只涉及到一个java文件,可能要创建几十,甚至几百个java文件,这个时候,我们就可以使用包,把相 ...
- Java从零开始学十(Arrays类对数组的常用方法)
一.Arrays类常用方法 二.简单例子 package com.pb.demo1; import java.util.Arrays; /* * Arrays工具类的中的几个常用方法 * 1.copy ...
- Java从零开始学十二(构造方法)
一.构造方法 构造方法的主要目的是为类中的属性初始化 二.构造方法的定义格式 class 类名称{ 访问权限 类名称(类型1 参数1,类型2 参数2,…){ 程序语句 ; … // 构造方法没有 ...
- “全栈2019”Java第五十六章:多态与字段详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java进阶(三十六)深入理解Java的接口和抽象类
Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...
- “全栈2019”Java多线程第二十六章:同步方法生产者与消费者线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
随机推荐
- BZOJ 1191: [HNOI2006]超级英雄Hero 匈牙利算法
1191: [HNOI2006]超级英雄Hero Time Limit: 2 Sec Memory Limit: 256 MBSubmit: xxx Solved: 2xx 题目连接 http:/ ...
- 如何添加mysql到环境变量
环境: 在自己安装的lampp环境下,当使用mysql的时候必须指定路径才能进入数据库:这样显得太过麻烦.我们可以通过将mysql加入到环境变量中来解决该问题(mysql执行路径/opt/lampp/ ...
- 基础设施即服务 PaaS, 平台即服务 IaaS
基础设施即服务(Infrastructure as a Service,简称IaaS)是消费者使用处理.储存.网络以及各种基础运算资源,部署与执行操作系统或应用程序等各种软件. 客户端无须购买服务器. ...
- 7407 74LS07 74LV07 74LVC07
SN7407 Convert TTL Voltage Levels to MOS LevelsHigh Sink-Current CapabilityInput Clamping Diodes Sim ...
- UVA LIVE-3263 - That Nice Euler Circuit
画一个顶点为偶数的封闭的二维图,当然.这个图能够自交,给出画的过程中的一些轨迹点.求出这个图把二次元分成了几部分,比如三角形把二次元分成了两部分. 这个的话,有图中顶点数+部分数-棱数=2的定律,这是 ...
- Arcgis Runtime for andriod 100 加载geodatabase
private void LoadMY(){ try { String mainGeodatabaseFilePath = YLPub.getMapData() + "/gismap/sl. ...
- CVS环境搭建
1.下载cvsnt(可以从附件中下载) 2.安装cvsnt 直接双击运行cvsnt安装文件,安装过程中可以选择以经典.自定义和完全三种方式安装,在自定义方式中可以选择安装路径.安装完成后,在控 ...
- Rsync服务介绍与配置
Rsync 简要介绍 rsync 是一个用于增量文件传输的开源工具,不得不说,rsync简直是不同服务器间传输文件.同步文件的利器.与FTP相比,它具有非常简单的安装和配置方法.而且,rsync可以只 ...
- 通过java读取HDFS的数据 (转)
原文链接:通过java读取HDFS的数据 通过JAVA直接读取HDFS中的时候,一定会用到FSDataInputStream类,通过FSDataInputStream以流的形式从HDFS读数据代码如下 ...
- OpenCV 脸部跟踪(2)
前面一篇文章中提到,我们在一副脸部图像上选取76个特征点,以及这些特征点的连通性信息来描述脸部形状特征,本文中我们会把这些特征点映射到一个标准形状模型. 通常,脸部形状特征点能 ...