美文网首页程序员互联网科技
Java之协变返回类型理解和简单实例

Java之协变返回类型理解和简单实例

作者: 阿_毅 | 来源:发表于2016-12-04 15:40 被阅读215次

    开心一笑

    【早上起来,发现天气越来越冷了,白粽子记得要多包几层叶】

    提出问题

    Java中协变返回类型如何理解???

    解决问题

    概念

    导出类(子类)覆盖(即重写)基类(父类)方法时,返回的类型可以是基类方法返回类型的子类。

    实例
    package com.evada.de;
    /**
     * @Author 阿毅
     * Created by Ay on 2016/12/4.
     */
    public class Ay {
    
        public static void main(String[] args) {
            Person person = new Boy();
            Flower flower = person.buy();
            flower.like();
            //! flower.love();  编译错误
            //因为是协变返回类型,所以可以向下转型
            RoseFlower roseFlower  = (RoseFlower) person.buy();
            //可以调用like方法
            roseFlower.like();
            //可以调用love方法
            roseFlower.love();
        }
    }
    class Person{
        public Flower buy(){
            System.out.println("Flower...");
            return new Flower();
        }
    }
    /**
     * 男孩
     */
    class Boy extends Person{
    
        /**
         * 这里覆盖Person类的buy
         * @return
         */
        @Override
        public RoseFlower buy(){
            System.out.println("RoseFlower...");
            //注意这里,这里就是协变返回类型
            //导出类**(子类)覆盖(即重写)**基类**(父类)方法时,
            // 返回的类型可以是基类方法返回类型的子类
            return new RoseFlower();
        }
    }
    class Flower{
        /**
         * 让普通人喜欢
         */
        public void like(){
            System.out.println("like");
        }
    }
    class RoseFlower extends Flower{
        /**
         * 让女孩喜欢
         */
        public void love(){
            System.out.println("love....");
        }
    }
    

    打印结果:

    RoseFlower...
    like
    RoseFlower...
    like
    love....
    

    协变返回类型运行返回更加具体的类,比如上面的RoseFlower类,而不是Flower类,在java中,儿子比父亲强,返回子类适用范围更为广泛,因为除了可以调用父类的方法,还可以调用自己的方法,get起来。

    参考文章

    【1】理解Java中的协变返回类型

    【2】Thinking in Java(Java编程思想)

    【3】关于java可变(协变)返回类型的解说之一------------基类与派生类

    读书感悟

    来自《徒然草》吉田兼好

    • 世上的事,最令人回味的,是始和终这两端。
    • 人心是不待风吹而自落的花。从前的恋人,还记得她情真意切的话,但人已离我而去,形同路人。此种生离之痛,犹甚于死别也。故见到染丝,有人会伤心;面对岔路,有人会悲泣。
    • 不管什么事,不要一副行家里手的样子。有教养的杰出人士,即使完全懂得的问题,难道就无节制地炫耀吗?在自己精通的专门领域,言辞一定要慎重,只要别人不提问就不要发言,这才是风度。
    • 那所有应该做而没有做的,逐日侵蚀沉淀之后,贮满泪水,就成为遗憾湖。那所有不该做而又做了的,层层堆积重叠之后,暗影耸然,就成为悔恨山。
    • 什么是真智慧呢?即是要明白可与不可都一样的道理。
    • 立志要成就一事的人,就不要因他事之无法兼顾而感到痛惜;也不要因他人之嘲笑自己有诸般不能而感到羞耻。一事之成,要以舍弃万事为代价。
    • 凡事一知半解,却夸夸其谈、品头论足,必令听者闻之生厌。

    其他

    如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

    相关文章

      网友评论

        本文标题:Java之协变返回类型理解和简单实例

        本文链接:https://www.haomeiwen.com/subject/nvuhmttx.html