• Java多态


    多态,顾名思义就是有多种形态,什么时候有多种形态呢?继承(实现)。一个子类可以在任何时候使用父类类型表示。下面看一个例子:

    一个抽象类
    public  abstract class Person {
     
        public abstract void say();
    }

    两个实现类
    public class Jerry extends Person {
        @Override
        public void say() {
            System.out.println("我是jerry");
        }
    }
    public class Tom extends Person {
    
    
        @Override
        public void say() {
            System.out.println("我是tom");
        }
    }

    如果现在需要把Jerry和Tom放进一个集合遍历操作
    public class Client4 {
        public static void main(String[] args) {
            ArrayList<Person> people = new ArrayList<>();
            people.add(new Tom());
            people.add(new Jerry());
            for (int i = 0; i < people.size(); i++) {
    //判断实例属于哪个类  instanceof 如果属于这个类或者这个类得子类的实例 就会返回true,否则返回false
                if (people.get(i) instanceof Tom) {
                    Tom tom = (Tom) people.get(i);
                    tom.say();
                } else {
                    Jerry jerry = (Jerry) people.get(i);
                    jerry.say();
                }
            }
        }
    }


    毫无疑问这是很麻烦的,取出之后还需要判断始于哪个类再执行操作。如果person的子类太多的话 判断是一件很痛苦的事,当使用多态之后上述代码可以简化为
    public class Client4 {
        public static void main(String[] args) {
            ArrayList<Person> person = new ArrayList<>();
            person.add(new Tom());
            person.add(new Jerry());
            for (int i = 0; i < person.size(); i++) {
                person.get(i).say();
            }
        }
    }

    在这里需要注意。Peoson不是一个接口。其实这个实例只是向上转型为Person类型而已,他真实的类型为Tom,他只是在需要的时候转为超类的类型存在。在任何情况下都可以把子类转换成超类类型存在。


    不和别人一样,不复制只真正理解
  • 相关阅读:
    DataImport(译)
    Spring JDBC最佳实践(1)
    在Spring中快速使用EHCache注解
    VS 2010 WPF核心是哪些功能特性 ?
    [你必须知道的.NET]第十五回:继承本质论
    C#设置本地网络(DNS、网关、子网掩码、IP)
    [你必须知道的.NET]第十六回:深入浅出关键字using全接触
    逆变与协变
    C# 判断网站是否能访问或者断链
    接口与抽象类
  • 原文地址:https://www.cnblogs.com/Vinlen/p/12750771.html
Copyright © 2020-2023  润新知