Java 多态

Java 多态

多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:

dt-java.png

多态性是对象多种表现形式的体现。

多态的优点

●消除类型之间的耦合关系 ●可替换性 ●可扩充性 ●接口性 ●灵活性 ●简化性

多态存在的三个必要条件

●继承 ●重写 ●父类引用指向子类对象

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

以下是一个多态实例的演示

public class Test {
    public static void main(String[] args) {
      show(new Cat());  // 以 Cat 对象调用 show 方法
      show(new Dog());  // 以 Dog 对象调用 show 方法
                
      Animal a = new Cat();  // 向上转型  
      a.eat();               // 调用的是 Cat 的 eat
      Cat c = (Cat)a;        // 向下转型  
      c.work();        // 调用的是 Cat 的 work
  }  
            
    public static void show(Animal a)  {
      a.eat();  
        // 类型判断
        if (a instanceof Cat)  {  // 猫做的事情 
            Cat c = (Cat)a;  
            c.work();  
        } else if (a instanceof Dog) { // 狗做的事情 
            Dog c = (Dog)a;  
            c.work();  
        }  
    }  
}
 
abstract class Animal {  
    abstract void eat();  
}  
  
class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
    public void work() {  
        System.out.println("抓老鼠");  
    }  
}  
  
class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
    public void work() {  
        System.out.println("看家");  
    }  
}

输出结果

吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

你必须知道的指针基础-7.void指针与函数指针

  void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。和用int表示指针异曲同工,只是更明确是“指针”。

25420
来自专栏海天一树

小朋友学Java(7):继承

在学习Java的继承之前,可以先复习一下C++的继承: http://www.jianshu.com/p/bc9b7ddb141c 一、定义 继承就是子类(派生...

29950
来自专栏西安-晁州

js各种继承方式汇总

js中的各种继承实现汇总 首先定义一个父类: function Animal(name) { this.name = name || '动物' this...

40570
来自专栏后端沉思录

hashCode、equals的使用

hash code、equals是Java用来比较对象是否相等,下面介绍一下自己在工作中对hash code、equals的使用. 首先介绍下String类中的...

9220
来自专栏程序员互动联盟

【java基础】Java extends用法详解

理解继承是理解面向对象程序设计的关键。在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。在Ja...

39980
来自专栏海天一树

小朋友学C++(8):继承

先编写程序: #include <iostream> using namespace std; class Animal { protected: fl...

272100
来自专栏PHP在线

PHP数组操作

1.shuffle将数组打乱 <?php $my_array = array("a" => "Dog", "b" => "Cat", "c" => "Horse...

41770
来自专栏PhpZendo

带你入门 JavaScript ES6 (四)

使用类声明是,需要先声明类,然后才能访问,否则抛出ReferenceError。这一点不同于函数声,函数声明会提升作用域,而无需事先声明

7910
来自专栏xingoo, 一个梦想做发明家的程序员

【设计模式】—— 解释器模式Interpret

  模式意图   自定义某种语言后,给定一种文法标准,定义解释器,进行解析。   做过搜索的朋友们可能更了解一些,平时我们搜索所需要的词库,通常就需要用这种方...

22060
来自专栏Java技术栈

equals 和 hashCode 到底有什么联系?一文告诉你!

Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和ha...

12730

扫码关注云+社区

领取腾讯云代金券