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多 ...
随机推荐
- "Blessing of Dimisionality: High Dimensional Feature and Its Efficient Compression for Face Verification"学习笔记
这\(^{[1]}\)是一篇关于如何使用高维度特征在人脸验证中的文章,作者以主要LBP为例子,论述了高维特征和验证性能存在着正相关的关系,即人脸维度越高,验证的准确度就越高.由于那时候没有用DeepL ...
- JVM垃圾回收(GC)流程
/* 首先介绍一下JVM中堆内存的组成: JVM堆内存主要由三部分组成: (1)新生代: 伊甸园区,存活区,伸缩区 (2)老年代: 老年区,伸缩区 (3)元空间(永久代): 元空间,伸缩区 注意:JD ...
- Complete list of APDU responses
https://www.eftlab.com.au/index.php/site-map/knowledge-base/118-apdu-response-list List of APDU resp ...
- JTAG接线描述
http://www.dzsc.com/data/html/2008-12-23/75397.html JTAG测试信号由下面5个信号组成. TRST:测试复位输入信号,测试接口初始化 TCK:测试时 ...
- iframe动态改变内嵌页面高度
test.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://w ...
- 查找(二)简单清晰的B树、Trie树具体解释
查找(二) 散列表 散列表是普通数组概念的推广.因为对普通数组能够直接寻址,使得能在O(1)时间内訪问数组中的任何位置.在散列表中,不是直接把keyword作为数组的下标,而是依据keyword计算出 ...
- java 入门书籍(java7)
一.Java从入门到精通 <Java从入门到精通(第3版)>从刚開始学习的人角度出发,通过通俗易懂的语言.丰富多彩的实例.具体介绍了使用Java语言进行程序开发须要掌握的知识. <J ...
- 80x86 CPU 的工作模式
8086/8088微处理器只有一种工作模式:实地址模式. 32为的80x86微处理器有3种工作模式:实地址模式.保护模式和虚拟8086模式. 实地址模式 对于8086/8088微处理器,实模式是它 ...
- JDBC进阶之PreparedStatement执行SQL语句(MySQL)
一.什么是PreparedStatement 参阅Java API文档,我们可以知道,PreparedStatement是Statement的子接口(如图所示),表示预编译的 SQ ...
- 约合¥1720 LG法国称G Watch将于6月开卖
近来LG法国官方透露音讯称旗下首款智能手表G Watch将于本年6月份正式出售,预定报价为199欧元(约合¥1720). 这就意味着这款智能手表会在googleI/O大会完成之后就会开端出售,从goo ...