zoukankan      html  css  js  c++  java
  • Java 多态

    多态存在的三个必要条件

    继承

    重写

    父类引用指向子类的对象

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

    多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

    实例:

    public class Test {
        public static void main(String[] args) {
            Animal a = new Cat(); //向上转型
            a.eat(); //调用的是Cat的eat
            
            Cat c = (Cat)a; //向下转型
            c.worrk(); //调用的是Cat的work()
        }
    }
    
    class Animal{ //父类
        public void eat() {
            System.out.println("动物要吃东西~~~");
        }
    }
    
    class Dog extends Animal{ //子类
        public void eat() {
            System.out.println("狗狗要吃骨头~~~");
        }
        public void work() {
            System.out.println("狗狗要看家!!!");
        }
        
    }
    
    class Cat extends Animal{ //子类
        public void eat() {
            System.out.println("猫咪要吃小鱼~~~");
        }
        public void worrk() {
            System.out.println("猫咪要抓老鼠!!!");
        }
    }

    运行结果:

    猫咪要吃小鱼~~~
    猫咪要抓老鼠!!!

    我们主要来分析下面这一段代码:

    Animal a = new Cat(); //向上转型

    Animal 是引用类型,声明了 a 这个对象可以做哪些事,但是在对象生成的过程中,用的是 Cat 类的构造器,所以Animal相当于一个空头支票,对象 a 实际上能做的事是 Cat 决定的。此时的 a 可以调用 Cat 类或者以 Cat 类为父类的子类里面的成员变量和成员方法,而不能调用 Animal 类里面的成员变量和成员方法。

    为什么叫向上转型呢?因为 a 是属于 Cat 里面的对象,而它的引用类型是 Animal,显然,Animal是 Cat 的父类,高于 Cat,所以类型就相当于向上转型了。

    Cat c = (Cat)a; //向下转型

    这行代码中,Cat 是引用类型,创建了一个对象 c ,并且给 c 赋值为 a。因为一开始 a 是 Animal 类型的,所以要做一次强制类型转换才能和前面的 c 配得上。这就叫做向下转型。

    但是,做强制类型转化是有条件的,对象的能实际使用的哪个类型(a 实际使用的类型是Cat)不能低于将要转化的类型。

    举个例子,如下图:

    向上类型转换就向是茶杯往茶壶里倒水,即便全部倒进去也不用担心溢出。

    但是向下类型转换就有风险了,一不小心就有可能把水倒的溢出。

    多态的实现方式

    方式一:重写:

    https://www.cnblogs.com/chuijingjing/p/9461729.html

    方式二:接口

    https://www.cnblogs.com/chuijingjing/p/9472472.html

    方式三:抽象类和抽象方法

     https://www.cnblogs.com/chuijingjing/p/9476943.html

  • 相关阅读:
    防火墙透明模式
    HP管理工具System Management Homepage安装配置
    kbmmw 中JSON 中使用SQL 查询
    kbmmw 中JSON 操作入门
    第一个kbmmw for Linux 服务器
    kbmmw 5.02发布
    kbmmw 5.01 发布
    使用delphi 10.2 开发linux 上的Daemon
    使用unidac 在linux 上无驱动直接访问MS SQL SERVER
    使用delphi 10.2 开发linux 上的webservice
  • 原文地址:https://www.cnblogs.com/chuijingjing/p/9461787.html
Copyright © 2011-2022 走看看