zoukankan      html  css  js  c++  java
  • Java基础14-多态(思想、转型、instanceof)

    一、什么是多态?

    1.多态的定义

    多态,字面意思就是多种状态,他表示一种事物的多种状态。

    class Animal{
        public void eat() {
            System.out.println("吃一般的食物");
        }
    }
    //狗和猫类继承动物类并重写eat方法
    class Dog extends Animal{
        public void eat() {
            System.out.println("吃骨头");
        }
    }
    class Cat extends Animal{
        public void eat() {
            System.out.println("吃鱼");
        }
    }
    public class duotai {
        public static void main(String[] args) {
            //当代码变为一下样子多态就产生了
            Animal a=new Dog();
            a.eat();
            a=new Cat();
            a.eat();
            }
    }

    上边对象a具有两种类型
    编译类型:声明对象变量的类型,Animal表示把对象看出什么类型
    运行类型:对象的真实类型,Dog运行类型 对象的真实类型
    编译类型必须是运行类型的父类或相同
    当编译类型和运行类型不同的时候,多态就出现了

    所谓多态:对象具有多种形态,对象可以存在不同的形式。

    其实就是,我们创建了一个动物对象,这个动物对象即可以是猫,也可以是狗,是猫的时候吃鱼,是狗的时候吃骨头。
    Animal a=new Dog() //此时a表示Dog类型的形态
    a=new Cat() //此时a表示Cat类型的形态

    2.多态的前提和特点

    多态的前提:必须有继承关系(错误的说法)
    可以是继承关系,也可以是实现关系(接口和实现类)。正确
    多态的特点:
    把子类对象赋给父类变量,在运行时期会表现出具体的子类特征

     2.多态的好处

    假设我们目前有这样的需求,给饲养员提供一个喂养动物的方法,用于喂养动物

    没有多态, 针对不同类型的动物,我们要提供不同的feed方法来喂食,非常繁琐,不够简洁。

    那怎样才能只提供一个方法就可以统一喂养所有动物?

    这就是多态的好处

    把不同的子类对象当做父类类型来看待,可以屏蔽不同子类对象之间的实现差异,从而写出通用的代码的代码达到通用编程,以适应需求的不同变化、

    提高了代码的扩展性

     二、多态的转型

    1.向上转型

    l当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。

    2.向下转型

     一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!

    运行报错,因为我们无法将猫转换成狗

    那什么时候使用向上转型呢?

    当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。

    如:Animal a = new Dog();

        a.eat();

    l什么时候使用向下转型?

    当要使用子类特有功能时,就需要使用向下转型。

    如:Dog d = (Dog) a; //向下转型

        d.lookHome();//调用狗类的lookHome方法

    l向下转型的好处:可以使用子类特有功能。

    弊端是:需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。

    那怎么解决这个弊端呢?

    3.instanceof关键字

    当发生以上这种情况时,我们就需要用到instance of这个关键字

    instanceof 判断对象是否是某一个类的实例
    * 语法格式: boolean b= 对象A instance of 类B
    * 判断A对象是否是B对象的实例

     

  • 相关阅读:
    Delphi如何处理在进行大量循环时,导致的应用程序没有响应的情况
    [转]:Delphi 中的哈希表(1): THashedStringList
    C# 计算两个字符串的相似度
    中文字号VS英文字号(磅)VS像素值
    在C#中如何将多个rtf文件内容组合在一起用一个rtf文件保存?
    C#中用RichTextBox实现图文混排和保存的例子
    ISE MAP报错: Unsupported programming for BSCAN block and JTAG_CHAIN attribute value 1的解决方法
    [转]matlab如何复制spectrum scope的图
    iMpACT中的Xilinx Prom烧录
    【verilog】fdisplay中如何保存有符号形式
  • 原文地址:https://www.cnblogs.com/LuckyGJX/p/8973350.html
Copyright © 2011-2022 走看看