Java(15) 多态
一.多态
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) 多态的更多相关文章
- Java 中多态的实现(下)
Java 中多态的另一个语法实现是重写.重载是通过静态分派实现的,重写则是通过动态分派实现的. 在学习动态分派之前,需要对虚拟机的知识有一个初步的了解. 虚拟机运行时数据区 运行 Java 程序时,虚 ...
- 关于java中多态的理解
java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...
- 深入Java核心 Java中多态的实现机制(1)
在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...
- 个人对Java中多态的一些简单理解
什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...
- Java中多态的一些简单理解
什么是多态 .面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. .多态的定义:指允许不同类的对象对同一消息做出响应.即 ...
- Java JVM 多态(动态绑定)
Java JVM 多态(动态绑定) @author ixenos 摘要:绑定.动态绑定实现多态.多态的缺陷.纯继承与扩展接口.向下转型与RTTI 绑定 将一个方法的调用和一个方法的主体关联起来,称作( ...
- Java:多态乃幸福本源
01 多态是什么 在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变:一个二郎神,也能七十二变:他们都可以变成不同的形态,但只需要悄悄地喊一声 ...
- 从虚拟机指令执行的角度分析JAVA中多态的实现原理
从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧 ...
- 学习博客之Java继承多态接口
这一篇博客主要是对软工前一阶段学习的总结,主要是对Java的学习总结,包括三部分:Java的继承.多态和接口 Java的继承 继承是面向对象的三大特性之一,能够实现软件的复用. Java子类继承父类的 ...
随机推荐
- java倒计时三种简单实现方式
写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...
- windows10+VS+CUDA+cuDNN+TensorFlow-gpu环境搭建(问题及解决)
TensorFlow-gpu环境需要CUDA+cuDNN+python,CUDA又需要VS,所以,,,环境越来越大哈哈. 1.主要环境: Python 3.6 CUDA9.0 Cudann7.0 Te ...
- c语言static关键字的理解
static 一.概述 在c语言中static恰当的使用能让程序更加完美,细节上的严谨,代码会更好,也更利于程序的维护与扩展. 而static使用灵活,且又有两种完全无关的用法,所以整理总结一下. 二 ...
- Webstorm 2018 激活破解
本文最后更新于 2018-5-4 可能会因为没有更新而失效.如已失效或需要修正,请留言! 问题 激活 webstorm 2018 最新版 解决步骤 License server:http://hb5. ...
- java的环境变量配置失败(java.exe、javaw.exe、javaws.exe优先级问题冲突)
前言:首先安装了intelliJ Idea 其次安装了JDK 1.8 配置完三个系统变量后,java和javac执行不通过 配置过程 1.我的电脑(右键)--->属性---->高级---& ...
- spring【一】 学习
Spring 源码学习 通过注解的形式注入IOC 简单的创建一个maven的项目的 下载指定的spring的核心jar包(https://mvnrepository.com/artifact/org. ...
- Linux学习-汇总
1.基础linux学习 Linux-基础学习(一)-基本命令 Linux-基础学习(二)-基本部署 Linux-基础学习(三)-Nginx学习 Linux-基础学习(四)-部署图书管理系统项目 Lin ...
- MYSQL内置MYSQL数据库中你可以得到的信息
1:help_topic 可以查看函数帮助,例如:SELECT * from help_topic WHERE name='concat' 可以查看concat函数. 2:SLOW_LOG 慢查询日 ...
- .NET Core开源快速开发框架Colder发布 (NET Core2.1+AdminLTE版)
引言 上星期发布的.NET452+AdminLTE版框架得到了大家的大力支持,目前GitHub已获近100星,鄙人十分高兴能够帮助大家.其中有不少关心.NET Core的支持情况,因为未来的.NET平 ...
- 记一次因为session引起的并发问题
在做一个DSP系统(不要纠结这个系统是做什么的)时,碰到了一个很奇特的bug. 事情背景: 1.媒体方要求素材必须通过API提交给他们审核后,方可投放使用. 2.上线不久,运营反馈“每当提交素材的时候 ...