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多 ...
随机推荐
- Codeforces Round #283 (Div. 2) B. Secret Combination 暴力水题
B. Secret Combination time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- SMACH(五)----用户数据UserData类和重映射Remapper类的原理和例子
用户数据UserData类和重映射Remapper类包含在smach中的user_data.py文件中实现,该博文主要介绍其原理和例子 UserData主要用于状态之间的数据传递,包括数据的输入inp ...
- SpringMVC和Springboot的区别(网摘)
spring boot 我理解就是把 spring spring mvc spring data jpa 等等的一些常用的常用的基础框架组合起来,提供默认的配置,然后提供可插拔的设计,就是各种 sta ...
- C#(静态String类)
[转]http://blog.csdn.net/angelazy/article/details/8501776 C#中提供了比较全面的字符串处理方法,很多函数都进行了封装为我们的编程工作提供了很大的 ...
- 【IDEA】【maven】idea使用maven插件 打包提示找不到符号找不到类,但是却没有错误
[本篇方法如果无效,请使用终极解决方法] [终极解决方法]:https://www.cnblogs.com/sxdcgaq8080/p/10117852.html 如下,在右侧maven工具中进行打包 ...
- CMMI5级——原因分析及解决方案(Causal Analysis and Resolution)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010825142/article/details/15338085 聪明的人在出现问题的时候,除了 ...
- Selenium2+python自动化60-异常后截图(screenshot)
前言 在执行用例过程中由于是无人值守的,用例运行报错的时候,我们希望能对当前屏幕截图,留下证据. 在写用例的时候,最后一步是断言,可以把截图的动作放在断言这里,那么如何在断言失败后截图呢? 一.截图方 ...
- error: conflicting type qualifiers for 'xxxxx'
网上的非常多解释--非常难理解-- 情景描写叙述: 在代码中,写了A\B两个文件,A:是.c文件,B是.h文件和.c文件. 在A中包括了B.h文件. 在B.h文件里声明了A中定义的变量. 这样编译的情 ...
- Mac 在启动eclipse时 Failed to load JavaHL Library解决方法
在Mac 10.9.1系统里, 在Eclipse中安装svn的插件,出现如下提示 方法一: 1.根据提示进入链接 http://subclipse.tigris.org/wiki/JavaHL 2. ...
- hadoop安装入门
1.jdk安装和配置 1.1下载最新jdk文件 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-18802 ...