Java中的向下转型和向上转型理解

来源:互联网 发布:淘宝火拼下架 编辑:程序博客网 时间:2024/06/05 06:10

例子1:

/*毕姥爷    讲课    钓鱼毕老师 extends 毕姥爷    讲课    看电影要求体现多态要看到向上转型,向下转型*///描述毕姥爷class 毕姥爷{    public void 讲课()    {        system.out.println("xx");    }    public void 钓鱼()    {         system.out.println("ss");    } } //描述毕老师 class 毕老师 extends 毕姥爷{    public void 讲课()    {        system.out.println("xx");    }    public void 看电影()    {         system.out.println("ddd");    } } class DuoTai{    public static void main(String[] args)    {        //多态形式        毕姥爷 x=new 毕老师();//向上转型        x.讲课();        x.钓鱼();        //要想使用毕老师的特有方法,看电影        毕老师 y=(毕老师)x;//向下转型        y.看电影();        y.钓鱼();    //转型过程中,至始至终,只有子类对象在做类型的变化

例子2:
阶段一:
笔记本电脑运行,笔记本中有一个运行功能
阶段二:
想用一个鼠标,又有一个功能使用鼠标,并多了一个鼠标对象
阶段三:
还想使用一个键盘功能,又要多一个功能
问题:每多一个功能就需要在笔记本对象中定义一个函数,不好,扩展性怎能解决?
降低鼠标,键盘等外围设备和笔记本电脑的耦合性。

//阶段一//描述笔记本电脑class NoetBook{    public void run()    {        system.out.println("book run");    }}class USBTest{    public static void main(String[] args)    {        NoteBook book=new NoteBook();        book.run();    }}

//阶段二:需要一个鼠标//多一个对象,鼠标class Mouse{    //开启功能    public void open()    {        system.out.println("mouse open");    }    //关闭功能    public void close()    {        system.out.println("mouse close");    }}class NoetBook{    public void run()    {        system.out.println("book run");    }    //定义使用鼠标功能,鼠标不确定,定义成参数    public void useMouse(Mouse m)    {    //m必须指向鼠标对象才可以调用方法    if(m!=null)        m.open();        m.close();    }}class USBTest{    public static void main(String[] args)    {        NoteBook book=new NoteBook();        book.run();        book.useMouse(new Mouse());    }}

阶段三:如果还想使用其他设备如:键盘、外置键盘。可以通过在笔记本对象中继续定义usekey()等方法来完成,但是其需要不断改动笔记本类中的内容。扩展性太差,维护性也不好。
每增加一个设备就加一个功能,说明设备和笔记本的耦合性太强
所以不要每次都面对具体的类型,只要定义一个规则,让后期的设备都符合这个规则,应该采用接口的方式来进行解耦

//重新设计  1.先定义规则interface USB{    //设备开启    public void open();    //设备关闭    public void close();}//描述笔记本class NoteBook{    //运行    public void run()    {        System.out.println("book run");    }}    //使用符合规则的外围设备public void useUSB(USB usb)//定义了一个接口类型的引用{    if(usb!=null)    {        usb.open();        usb.close();    }}class MouseByUSB implements USB{    public void open()    {        System.out.println("mouse open");    }    public void close()    {        System.out.println("mouse close");    }}class USBTest{    public static void main(String[] args)    {        NoteBook book=new NoteBook();        book.run();        book.useUSB(null);        book.useUSB(new MouseByUSB());    }}