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子类继承父类的 ...
随机推荐
- 网页验证码出不来,读取验证码时出错:javax.imageio.IIOException: Can't create cache file!
版权声明:本文为博主原创文章,仅作为学习交流使用 转载请注明出处 https://www.cnblogs.com/linck/p/10593053.html 今天打开项目时,发现登陆界面的验证码出不来 ...
- 数据库【mysql篇】学习笔记
Windows服务 -- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意 ...
- handsontable合并表头
想在页面中做类似excel的操作,发现handsontable符合要求. 然后发现这个文章 http://blog.csdn.net/wynan830/article/details/9054195 ...
- python open 函数的读写追加
- maven导入外部jar包的方法
maven的导入外部jar包的方法(前提还有外部jar包) 1.问题: 在maven添加依赖包时,添加不成功,可以选择通过外部命令导入到仓库里. 2.命令:(在Dos命令行) mvn install: ...
- RMQ 问题 ST 算法(模板)
解决区间查询最大值最小值的问题 用 $O(N * logN)$ 的复杂度预处理 查询的时候只要 $O(1)$ 的时间 这个算法是 real 小清新了 有一个长度为 N 的数组进行 M 次查询 可 ...
- JEECG BOOT
JEECGBOOT - 开源搜索 - 开源中国https://www.oschina.net/search?scope=blog&q=JEECGBOOT JEECG 基于代码生成器J2EE智能 ...
- PHP程序员的成长路线
作为一名PHP程序员,从你入门到现在我相信也学了很多东西,但是有的PHP程序员却是还在第一阶段,那么作为初级PHP程序员我们应该如何弥补自己的不足往中级阶段或者高级阶段发展呢?下面小编就为大家梳理了一 ...
- windows 监控
监控time_wait状态tcp/ip连接 > netstat -an | findstr "TIME_WAIT" 如果监控此值发现量比较大,且有类似socketExcept ...
- Springboot读取Jar文件中的resource
如题,碰到了问题. 事情是这样的. 一个导入模板, 因为比较少, 所以就直接放在后台的resources中了.调试的时候是下载没有问题的. 等到发布后,下载就出问题了. 参照: ***.jar!\BO ...