一、什么是多态

多态性是指允许不同类的对象对同一消息作出响应.多态性包括参数化多态性和包含多态性.多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题.
多态有两种表现形式:重载和覆盖
首先说重载(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 对象向下转型:

向下转型:父类对象 ->子类对象
对于向下转型时,必须明确的指明要转型的子类类型,格式:
子类 子类对象 = (子类)父类实例 ;强制类型转换
 
 上面的例中,子类没有自己的方法,如果子类有自己的方法,医生类中还能调用吗?显然不能,因为是向上转为父类后,只能调用父类的方法,如果要调用子类的方法就需要用到向下转型要用到instannceof

四、instanceof 关键字

在java中可以使用instanceof关键字判断一个对象到底是那个类的实例
对象 instanceof 类   ->返回boolean类型
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从零开始学十六(多态)的更多相关文章

  1. Java从零开始学十八(抽象类和接口)

    一.什么是抽象类和接口 抽象类.接口与类是一个层次的概念,是java中极其重要的概念. 抽象类是从多个类中抽象出来的公共模板,提供子类均具有的功能. 接口是从多个类中抽象出来的规范,体现的是规范和实现 ...

  2. Java从零开始学十九(异常)

    一.什么是异常 从字面上讲,就是不正常的现实就是异常. 程序中的异常也是要在程序运行中才会偶尔发生.如果程序还没有运行,编译就报错,这种不叫异常,这种叫编译错误,通常是语法上的错误 二.java中异常 ...

  3. Java从零开始学十五(继承)

    一.继承作用 继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性 继承使重一个类A能够直接使用另外一个类B的属性和方法的一种途径 类A可以有自己的属性和方法 ...

  4. Java从零开始学十四(包和访问控制)

    一.java中的包 Java文件的组织形式Windows中的文件功能类似 在开发比较大的项目时,不可能只涉及到一个java文件,可能要创建几十,甚至几百个java文件,这个时候,我们就可以使用包,把相 ...

  5. Java从零开始学十(Arrays类对数组的常用方法)

    一.Arrays类常用方法 二.简单例子 package com.pb.demo1; import java.util.Arrays; /* * Arrays工具类的中的几个常用方法 * 1.copy ...

  6. Java从零开始学十二(构造方法)

    一.构造方法 构造方法的主要目的是为类中的属性初始化 二.构造方法的定义格式 class 类名称{ 访问权限 类名称(类型1 参数1,类型2 参数2,…){ 程序语句 ; …    // 构造方法没有 ...

  7. “全栈2019”Java第五十六章:多态与字段详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. Java进阶(三十六)深入理解Java的接口和抽象类

    Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...

  9. “全栈2019”Java多线程第二十六章:同步方法生产者与消费者线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. "Blessing of Dimisionality: High Dimensional Feature and Its Efficient Compression for Face Verification"学习笔记

    这\(^{[1]}\)是一篇关于如何使用高维度特征在人脸验证中的文章,作者以主要LBP为例子,论述了高维特征和验证性能存在着正相关的关系,即人脸维度越高,验证的准确度就越高.由于那时候没有用DeepL ...

  2. JVM垃圾回收(GC)流程

    /* 首先介绍一下JVM中堆内存的组成: JVM堆内存主要由三部分组成: (1)新生代: 伊甸园区,存活区,伸缩区 (2)老年代: 老年区,伸缩区 (3)元空间(永久代): 元空间,伸缩区 注意:JD ...

  3. Complete list of APDU responses

    https://www.eftlab.com.au/index.php/site-map/knowledge-base/118-apdu-response-list List of APDU resp ...

  4. JTAG接线描述

    http://www.dzsc.com/data/html/2008-12-23/75397.html JTAG测试信号由下面5个信号组成. TRST:测试复位输入信号,测试接口初始化 TCK:测试时 ...

  5. iframe动态改变内嵌页面高度

    test.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://w ...

  6. 查找(二)简单清晰的B树、Trie树具体解释

    查找(二) 散列表 散列表是普通数组概念的推广.因为对普通数组能够直接寻址,使得能在O(1)时间内訪问数组中的任何位置.在散列表中,不是直接把keyword作为数组的下标,而是依据keyword计算出 ...

  7. java 入门书籍(java7)

    一.Java从入门到精通 <Java从入门到精通(第3版)>从刚開始学习的人角度出发,通过通俗易懂的语言.丰富多彩的实例.具体介绍了使用Java语言进行程序开发须要掌握的知识. <J ...

  8. 80x86 CPU 的工作模式

    8086/8088微处理器只有一种工作模式:实地址模式. 32为的80x86微处理器有3种工作模式:实地址模式.保护模式和虚拟8086模式.   实地址模式 对于8086/8088微处理器,实模式是它 ...

  9. JDBC进阶之PreparedStatement执行SQL语句(MySQL)

    一.什么是PreparedStatement           参阅Java API文档,我们可以知道,PreparedStatement是Statement的子接口(如图所示),表示预编译的 SQ ...

  10. 约合¥1720 LG法国称G Watch将于6月开卖

    近来LG法国官方透露音讯称旗下首款智能手表G Watch将于本年6月份正式出售,预定报价为199欧元(约合¥1720). 这就意味着这款智能手表会在googleI/O大会完成之后就会开端出售,从goo ...