• Java学习之多态(Polymorphism)


    多态==晚绑定

    不要把函数重载理解为多态。

    因为多态是一种运行期的行为,不是编译期的行为。

    多态:父类型的引用可以指向子类型的对象。

    比如 Parent p = new Child();

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

        如果有,再去调用子类的该同名方法。

    (注意此处,静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)

    如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将p转换为子类Child类型的引用。

    因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。   

    package cn.logan.Poly;
    
    public class Animal {
        public void sing(){
            System.out.println("Animal is singsing!");
        }
    
    }
    package cn.logan.Poly;
    
    public class Cat extends Animal {
        public void sing(){
            System.out.println("Cat is singing!");
        }
        public void eat(){
            System.out.println("Cat is eating!");
        }
    
    }
    package cn.logan.Poly;
    
    public class Dog extends Animal {
        public void sing(){
            System.out.println("Dog is singing!");
        }
    
    }
    package cn.logan.Poly;
    
    public class PolyTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Cat cat = new Cat();
            Animal animal = cat;
            animal.sing();
            
            Animal a = new Cat();
            Cat c = (Cat) a;
            c.sing();
            c.eat();
            
            //编译错误
            //用父类引用调用父类不存在的方法
            //Animal a1 = new Cat();
            //a1.eat();
            
            //编译错误
            //向下类型转换时只能转向指向的对象类型        
            //Animal a2 = new Cat();
            //Cat c2 = (Dog)a2;
    
        }
    
    }
  • 相关阅读:
    .net core使用NLog+Elasticsearch记录日志
    .net core使用EasyNetQ做EventBus
    .net core使用Apollo做统一配置管理
    .net core使用App.Metrics+InfluxDB+Grafana进行APM监控
    .net core使用Ocelot+Identity Server统一网关验证
    .net core微服务之基于Docker+Consul+Registrator服务注册服务发现
    windows上禁止某个软件联网
    Windows修改命令行默认启动路径
    Win10对调Esc和CapsLock键
    animation模块的使用
  • 原文地址:https://www.cnblogs.com/LoganChen/p/6545297.html
Copyright © 2020-2023  润新知