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

例子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());
    }
}

你可能感兴趣的:(java-学习)