zoukankan      html  css  js  c++  java
  • 多态的作用

    什么是多态

    在同一个方法中,这种由于参数类型不同而导致执行效果各异的现象就是多态。继承是多态得以实现的基础
    在Java中,为了实现多态,允许使用一个父类类型的变量来引用一个字类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果。

    interface Anmal{
        void show();    //抽象类,抽象方法
    }
    class Cat implements Anmal{
        @Override
        public void show() {        //实现抽象方法
            System.out.println("我是一只猫,喵喵喵喵");
        }
    }
    class Dog implements Anmal{
        @Override
        public void show() {
            System.out.println("我是一只狗,旺旺旺旺");
        }
    }
    public class Example01 {
        public static void main(String[] args) {
            Anmal cat = new Cat();         //创建Cat对象
            Anmal dog = new Dog();         //创建Dog对象
            animalshow(cat);
            animalshow(dog);
        }
        //定义静态的animalshow方法,接收一个Animal类型的参数
        public static void animalshow(Anmal an) {
            an.show();
        }
    }

    多态不仅解决了方法同名的问题,而且还使程序变得更加灵活,从而有效地提高了程序的可扩展性和可维护性

    对象的类型转换

    在多态的学习中,涉及到将子类对象当做父类类型使用的事情,此钟情况在Java的语言环境中称为"向上转型",例如以下两行代码

    Animal an1 = new Cat();         //将Cat对象当做Animal类型来使用
    Animal an2 = new Dog();         //将Dog对象当做Animal类型来使用

    将子类对象当做父类使用时不需要任何显式的声明,需要注意的是,此时不能通过父类变量去调用子类中的特有方法

    将父类类型的变量强制转为子类类型:

    public static void animalshow(){
        Cat cat = (Cat) animal;            //将animal对象强制转换为Cat类型
        cat.show()                                //调用cat的show()方法
        cat.sleep()                                //调用cat 的sleep()方法
    }

    这种父类型当做子类型使用的情况,在Java的语言环境中被称为"向下转型"。
    Java提供一个instanceof关键字,它可以判断一个对象是否为某个类(或接口)的实例或者子类实例,语法格式如下:

    对象(或者对象引用变量) instanceof 类(接口)

    示 例:

    public static void animal(Animal animal){
        if(animal instanceof Cat ){                //判断animal是否是Cat类的实例对象
            Cat cat = (Cat) animal;                //animal强转为Cat类型
            cat.sleep();                                    //调用Cat的sleep()方法
            cat.show();                                    //调用Cat的show()方法
        }else{
            System.out.println("this animal is not a cat");
        }

    使用instanceof关键字判断animalshow()方法中传入的对象是否为Cat类型,如果是Cat类型就进行强制类型转换,否则就打印"this animal is not a cat"

    Object类

    在JDK中提供了一个Object类,它是类层次结果的根类,每个类都直接或间接继承自该类。所有对象(包括数组)都实现了这个类的方法

    equals()                  指示其他某个对象是否与此对象"相等"
    getClass()                返回此Object的运行时类
    hashCode()                返回该对象的哈希码值
    toString()                返回该对象的字符串表示

    在实际开发中,通常希望对象的toString()方法返回的不仅仅是基本信息,而是一些特有的信息。这时重写Object的toString()方法便可以实现

    class Animal{
        //重写Object类的toString()方法
        public String toString() {
            return "这是一个动物";
        }
    }
    public class Example01 {
        public static void main(String[] args) {
            Animal animal = new Animal();           //创建Animal类对象
            System.out.println(animal.toString());    //调用toString方法
        }
    }

    匿名内部类

    在编写Java程序时,在类里面定义的类称之为内部类(Inner Class),内部类是外部眼泪第一个成员。Java内部类可以分为成员内部类、方法内部类和匿名内部类等

    在多态的讲解中,如果方法的参数被定义为一个接口类型,那么就需要定义一个类来实现接口,并根据该类进行对象实例化。除此之外,还可以使用匿名内部类来实现接口。当程序中使用匿名内部类时,在定义匿名内部类的地方往往直接创建该类的一个对象。匿名内部类是实现接口垫 一种简便写法。

    普通内部类实现方式:

    interface Animal{
        void show();        //定义抽象方法show()
    }
    //定义测试类
    public class Example01 {
        public static void main(String[] args) {
            //定义一个内部类Cat实现Animal接口
            class Cat implements Animal{
                @Override
                public void show() {
                    System.out.println("嘻嘻...");
                }
            }
            animalshow(new Cat());         //调用animalshow()方法并传入Cat对象
        }
        public static void animalshow(Animal an) {
            an.show();
        }
    }

    匿名内部类的格式:

        new 父类(参数列表)    或 父接口(){
            //匿名内部类实现部分
        }

    匿名内部类实现方式:

    //定义动物类接口
    interface Aniaml{   
        void show();        
    }
    public class Example01 {
        public static void main(String[] args) {
            //定义匿名内部类作为参数传递给animalshow()方法
            animalshow(new Aniaml() {
                @Override
                public void show() {
                    System.out.println("喵喵喵喵...");
                }
            });
        }
        //定义静态方法animalshow{}
        private static void animalshow(Aniaml an) {
            an.show();
        }
    }

    分两步来编写匿名内部类,具体如下:

    1. 在调用animalshow()方法时,在方法的参数位置写上new Aniaml(){},这相当于创建了一个实例对象,并将对象作为参数传给animalshow()方法。在new Aniaml()后面有一对大括号,表示创建的对象为Aniaml的子类实例,该子类是匿名的。

    animalshow(new Animal(){});

    2. 在大括号中编写匿名子类的实现代码

    animalshow(new Aniaml() {
        @Override
        public void show() {
            System.out.println("喵喵喵喵...");
        }
    });
    学习中,博客都是自己学习用的笔记,持续更新改正。。。
  • 相关阅读:
    系统安全及应用
    进程和计划任务管理
    Java技术体系
    开机十步和进程管理
    Raid
    LVM逻辑卷
    sed命令
    磁盘管理
    你的背景,是这个时代 张璁
    别将梦想停留在二十岁
  • 原文地址:https://www.cnblogs.com/Tunan-Ki/p/11668745.html
Copyright © 2011-2022 走看看