Java(15) 多态

一.多态

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

 1.2 多态的表现

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

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

例:父类 = 子类

Pet p = new Dog();

  向上转型;父类=子类

   例:Pet p = new Dog();

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

例: Dog d = (Dog)p;

 1 public abstract class Pet {
 2     private String name;
 3     private int health=100;
 4     private int age;
 5     private int love=50;
 6     public Pet(){
 7
 8     }
 9     public Pet(String name,int health,int age,int love){
10         this.name = name;
11         this.health = health;
12         this.age = age;
13         this.love = love;
14     }
15     public String getName(){
16         return name;
17     }
18     public void setName(String name){
19         this.name= name;
20     }
21     public int getHealth(){
22         return health;
23     }
24     public void setHealth(int health){
25         this.health = health;
26     }
27     public int getAge(){
28         return age;
29     }
30     public void setAge(int age){
31         this.age = age;
32     }
33     public int getLove(){
34         return love;
35     }
36     public void setLove(int love){
37         this.love = love;
38     }
39     public void ji(){
40         System.out.println("宠物的自白:我的名字叫:"+this.name+",年龄为:"+this.age+"和主人的亲密度为:"+this.love);
41     }
42     public abstract void eat();
43 }

宠物抽象类

 1 public class Dog extends Pet{
 2     private String strain;
 3     public Dog(){
 4
 5     }
 6     public Dog(String name,int health,int age,int love,String strain){
 7         super(name,health,age,love);
 8         this.strain = strain;
 9     }
10     public void catchingFlyDisc(){
11         System.out.println("接飞盘");
12         int health = getHealth();
13         health = health-10;
14         setHealth(health);
15
16         int love = getLove();
17         love = love+5;
18         setLove(love);
19     }
20     public void eat(){
21         System.out.println("狗狗吃鱼");
22     }
23     public String getStrain(){
24         return strain;
25     }
26     public void setStrain(String strain){
27         this.strain = strain;
28     }
29
30 }

狗狗类继承宠物类

 1 public class Penguin extends Pet {
 2     private String sex;
 3     public Penguin(){
 4
 5     }
 6     public Penguin(String name,int health,int age,int love,String sex){
 7         super(name,health,age,love);
 8         this.sex = sex;
 9     }
10     public void swimming(){
11         System.out.println("游泳");
12         int health = getHealth();
13         health = health-10;
14         setHealth(health);
15
16         int love = getLove();
17         love = love+5;
18         setLove(love);
19     }
20     public void eat(){
21         System.out.println("企鹅喝水");
22     }
23     public String getSex(){
24         return sex;
25     }
26     public void setSex(String sex){
27         this.sex = sex;
28     }
29
30 }

企鹅类继承宠物类

 1 public class Master {
 2     public void feed(Pet p){
 3         p.eat();
 4     }
 5     public void play(Pet p){
 6         if(p instanceof Dog ){
 7             Dog d = (Dog) p;
 8             d.catchingFlyDisc();
 9         }else if(p instanceof Penguin){
10             Penguin pe = (Penguin) p;
11             pe.swimming();
12         }
13     }
14 }

主人类

 1 public class TestPMPD {
 2     public static void main(String[] args){
 3         Master m= new Master();
 4         //向下转型
 5         Pet p = new Dog();
 6         Dog d = (Dog) p;
 7         m.feed(d);
 8 //        Pet p = new Penguin();
 9 //        m.feed(p);
10     }
11 }

测试类

运行结果为:

注意: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){...}

时间: 2024-08-13 23:16:22

Java(15) 多态的相关文章

Java中多态的一些简单理解

什么是多态 1.面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 2.多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 3.实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 4.多态的作用:消除类型之间的耦合关系. 5.现实中,关于多态的例子不

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

什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 多态的作用:消除类型之间的耦合关系. 现实中,关于多态的例子不胜枚举. 下面是多态

JAVA泛型多态

先度娘一下多态的概念: 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误: 如果有,再去调用子类的该同名方法. (来源:http://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html) 那如果要在Java中泛型做多态如何使用

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

从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧,隐隐约约地记得是与Class文件格式中的方法表有关,但是不知道虚拟机在执行的时候,是如何选择正确的方法来执行的了.so,趁着周末,把压箱底的<深入理解Java虚拟机>拿出来,重新看了下第6.7.8章中的内容,梳理一下:从我们用开发工具(Intellij 或者Eclipse)写的 .java 源程

Java:多态乃幸福本源

01 多态是什么 在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变:一个二郎神,也能七十二变:他们都可以变成不同的形态,但只需要悄悄地喊一声“变”. Java的多态是什么呢?其实就是一种能力——同一个行为具有不同的表现形式:换句话说就是,执行一段代码,Java在运行时能根据对象的不同产生不同的结果.和孙悟空和二郎神都只需要喊一声“变”,然后就变了,并且每次变得还不一样:一个道理. 多态的前提条件有三个: 子类继承父类 子类覆盖父类的方法

java新手笔记15 多态

1.Animal类 package com.yfs.javase; public class Animal { public void cry() { System.out.println("动物叫..."); } } 2.Dog/Cat/Bird类 package com.yfs.javase; public class Dog extends Animal { public void cry() { System.out.println("汪 汪..."); }

黑马程序员——Java基础---多态、内部类、异常、包

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.多态 多态(Polymorphism)按字面的意思就是“多种状态”.在面向对象语言中,接口的多种不同的实现方式即为多态.引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.简单的说,就是一句话:允许将子类类型的对象赋值给父类类型的引用. 猫这个对象对应的类

Java(多态)动手动脑

1> 请看以下"变态"的类(参看示例ParentChildTest.java) 上述代码的特点是: 子类和父类定义了一模一样的字段和方法 运行以下测试代码 1. 上边的程序运行结果是什么? 2. 你如何解释会得到这样的输出? 第一个100:是parent调用PrintValue方法输出parent类中myValue值为100: 第二个200:是child调用PrintValue方法输出child类中myValue值为200: 第三个200:是parent = child,将子类对

Java中多态的理解

---------------------------------- 最近在学习Java,接触了 多态的概念,用了好久才 搞懂,来给大家分享一下 博主的想法: ---------------------------------- 多态,就是指一个对象在 不同时候体现出来的不同 状态: ---------------------------------- 多态的实现要有3个前提: 1.要有继承关系: 2.要有方法重写: 3父类引用指向子类对象: 即 父 f = new 子(): ---------