一.多态

 1.1 多态:一个事物的多种形态

 1.2 多态的表现

行为(方法)多态:重写和重载。

引用多态(动态绑定):编译时的类型和运行时不一致的这种现象

例:父类 = 子类

Pet p = new Dog();

  向上转型;父类=子类

   例:Pet p = new Dog();

向下转型:子类 = (子类)父类

例: Dog d = (Dog)p;

 public abstract class Pet {
private String name;
private int health=100;
private int age;
private int love=50;
public Pet(){ }
public Pet(String name,int health,int age,int love){
this.name = name;
this.health = health;
this.age = age;
this.love = love;
}
public String getName(){
return name;
}
public void setName(String name){
this.name= name;
}
public int getHealth(){
return health;
}
public void setHealth(int health){
this.health = health;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public int getLove(){
return love;
}
public void setLove(int love){
this.love = love;
}
public void ji(){
System.out.println("宠物的自白:我的名字叫:"+this.name+",年龄为:"+this.age+"和主人的亲密度为:"+this.love);
}
public abstract void eat();
}

宠物抽象类

 public class Dog extends Pet{
private String strain;
public Dog(){ }
public Dog(String name,int health,int age,int love,String strain){
super(name,health,age,love);
this.strain = strain;
}
public void catchingFlyDisc(){
System.out.println("接飞盘");
int health = getHealth();
health = health-10;
setHealth(health); int love = getLove();
love = love+5;
setLove(love);
}
public void eat(){
System.out.println("狗狗吃鱼");
}
public String getStrain(){
return strain;
}
public void setStrain(String strain){
this.strain = strain;
} }

狗狗类继承宠物类

 public class Penguin extends Pet {
private String sex;
public Penguin(){ }
public Penguin(String name,int health,int age,int love,String sex){
super(name,health,age,love);
this.sex = sex;
}
public void swimming(){
System.out.println("游泳");
int health = getHealth();
health = health-10;
setHealth(health); int love = getLove();
love = love+5;
setLove(love);
}
public void eat(){
System.out.println("企鹅喝水");
}
public String getSex(){
return sex;
}
public void setSex(String sex){
this.sex = sex;
} }

企鹅类继承宠物类

 public class Master {
public void feed(Pet p){
p.eat();
}
public void play(Pet p){
if(p instanceof Dog ){
Dog d = (Dog) p;
d.catchingFlyDisc();
}else if(p instanceof Penguin){
Penguin pe = (Penguin) p;
pe.swimming();
}
}
}

主人类

 public class TestPMPD {
public static void main(String[] args){
Master m= new Master();
//向下转型
Pet p = new Dog();
Dog d = (Dog) p;
m.feed(d);
// Pet p = new Penguin();
// m.feed(p);
}
}

测试类

运行结果为:

注意:java.lang.ClassCastException:类型转换异常

父类的运行时类型跟要转成的子类的类型不一致

注意:引用多态存在继承关系

二.instanceof

语法: 对象A instanceof 类型B

判断对象A的类型是否是类型B,是就返回true,否则返回false

例:d instanceof Dog

三.实现多态的2种形式

a.使用父类作为方法形参实现多态

public void play(Pet p){...}

b.使用父类作为方法返回值实现多态

public Pet getPet(int type){...}

Java(15) 多态的更多相关文章

  1. Java 中多态的实现(下)

    Java 中多态的另一个语法实现是重写.重载是通过静态分派实现的,重写则是通过动态分派实现的. 在学习动态分派之前,需要对虚拟机的知识有一个初步的了解. 虚拟机运行时数据区 运行 Java 程序时,虚 ...

  2. 关于java中多态的理解

    java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...

  3. 深入Java核心 Java中多态的实现机制(1)

    在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...

  4. 个人对Java中多态的一些简单理解

    什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...

  5. Java中多态的一些简单理解

    什么是多态 .面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. .多态的定义:指允许不同类的对象对同一消息做出响应.即 ...

  6. Java JVM 多态(动态绑定)

    Java JVM 多态(动态绑定) @author ixenos 摘要:绑定.动态绑定实现多态.多态的缺陷.纯继承与扩展接口.向下转型与RTTI 绑定 将一个方法的调用和一个方法的主体关联起来,称作( ...

  7. Java:多态乃幸福本源

    01 多态是什么 在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变:一个二郎神,也能七十二变:他们都可以变成不同的形态,但只需要悄悄地喊一声 ...

  8. 从虚拟机指令执行的角度分析JAVA中多态的实现原理

    从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧 ...

  9. 学习博客之Java继承多态接口

    这一篇博客主要是对软工前一阶段学习的总结,主要是对Java的学习总结,包括三部分:Java的继承.多态和接口 Java的继承 继承是面向对象的三大特性之一,能够实现软件的复用. Java子类继承父类的 ...

随机推荐

  1. Python基础之字典

    字典初识 字典的认识 首先,我们来认识一下字典: # 定义一个字典 user_dict = {"name": "zhangsan", "age&quo ...

  2. 【原创】谈谈线上CPU100%排查套路

    引言 不知道在大家面试中,有没有遇到这个问题 生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,你如何定位出问题呢? 这个问题分为两版回答! 高调版 对不起,我是做研发的,这个问 ...

  3. 记录使用nodejs时,未正确使用import导致的错误

    2019/04/08 今天看了es6入门,才发现以前碰到的关于import的错误,是因为使用了import,但nodejs默认不支持导致的. 如果想要使用es6的module功能,需要把整个文件的导入 ...

  4. Swing 混合布局

    案例一:Border边境边界 package swing; /** * swing 混合布局 */ import java.awt.*; import javax.swing.*; public cl ...

  5. Mistwald zoj 3497

    链接 [https://vjudge.net/contest/294259#problem/K] 题意 就是有个m*n矩阵 出发(1,1) 出口(m,n) 然后给出每个点能到大的四个位置 而且一旦到达 ...

  6. 使用队列实现栈(1)(Java)

    class MyStack { private Queue q1; private Queue q2; public MyStack(int size) { this.q1 = new Queue(s ...

  7. HTML之表单

    目录 表单的结构 get方式与post方式 输入 单行文本输入框 提交按钮和重置按钮 密码输入框 复选框 单选按钮 图像按钮 文本选择输入框 隐藏框 多行文本输入框 下拉列表框 新增输入元素 新增其他 ...

  8. Jdbc、Mybatis、Hibernate各自优缺点及区别

    文章出处:Jdbc,Mybatis,Hibernate各自优缺点及区别 先比较下jdbc编程和hibernate编程各自的优缺点. 1.JDBC 我们平时使用jdbc进行编程,大致需要下面几个步骤:  ...

  9. vscode 安装插件SVN 报vscode SVN not found

    1.软件环境 svn客户端安装的是TortoiseSVN: vscode 安装的为SVN的插件: 2. 问题现象 vscode打开文件夹后右下角提示如下报错:SVN not found. Instal ...

  10. (五)jdk8学习心得之默认方法

    五.默认方法 1. 使用方法:写在接口中,就是为了接口可以做一些事情. 2. 目的:有很多实现类,有一个公共的抽象方法,其实这些实现类实现该抽象方法的内容是完全一致的,完全没有必要都重新实现一遍.并且 ...