java面向对象(多态)

来源:互联网 发布:相马光子 知乎 编辑:程序博客网 时间:2024/05/01 07:29

多态:可以理解为事物存在的多中体现形态。
人:男人,女人,
动物:猫,狗。
猫 x = new 猫();
动物 x = new 猫();
1,多态的体现。
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类的对象。
2,多态的前提。
必须是是类与类之间有关系,要么继承,要么实现。
通常还是有一个前提:存在覆盖。
3,多态的好处。
多态的出现大大的提高程序的扩展性。
4,多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。

abstract class Animal{    abstract void eat();}class Cat extends Animal{    public void eat()    {        System.out.println("吃鱼");    }    public void catchMouse()    {        System.out.println("抓老鼠");    }}class Dog extends Animal{    public void eat()    {        System.out.println("吃骨头");    }    public void kanjia()    {        System.out.println("看家");    }}class DuoTaiDemo{    public static void main(String[] args)    {    /*        //Cat c = new Cat();        //c.eat();        //Dog d = new Dog();        //d.eat();        Cat c = new Cat();        Cat c1 = new Cat();        funcation(c1);        funcation(new Dog());    }    public static void funcation(Cat c)    {        c.eat();    }    public static void function(Dog d)    {        d.eat();    }    */    public static void funcation(Animal a)    {        a.eat();    }    funcation(new Cat());    funcation(new Dog());}

多态的转型:

abstract class Animal{    abstract void eat();}class Cat extends Animal{    public void eat()    {        System.out.println("吃鱼");    }    public void catchMouse()    {        System.out.println("抓老鼠");    }}class Dog extends Animal{    public void eat()    {        System.out.println("吃骨头");    }    public void kanjia()    {        System.out.println("看家");    }}class DuoTaiDemo2{    public static void main(String[] args)    {        Animal a = new Cat();//类型提升。向上转型。        a.eat();        //如果想要调用猫的特有方法时,如何操作?        //强制将父类的引用,转成子类类型,向下转型。        Cat c = (Cat)a;        c.catchMouse();        //千万不要出现这样的操作。就是将父类对象转成子类类型。        //我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换.        //多态自始至终都是子类对象在做着变化。        //Animal a = new Animal();        //Cat c = (Cat)a;        function(new Dog());    }    public static void function(Animal a)    {        a.eat();        //instanceof:引用数据类型判断是否是所属类型.        if(a instanceof Cat)        {            Cat c = (Cat)a;            c.catchMouse();        }        else if(a instanceof Dog)        {               Dog c = (Dog)a;            c.kanjia();        }    }}

多态的成员特点:

在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调

用的方法。如果有,编译通过,如果没有,编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。

在多态中,静态成员函数的特点:
无论编译和运行。都参考做左边。

class Fu{    void method1()    {        System.out.println("fu method_1");    }}class Zi extends Fu{    void method2()    {           System.out.println("zi method_2");    }    void method3()    {        System.out.println("zi method_3");    }}class DuoTaiDemo4{    public static void main(String[] args)    {        Fu f = new Zi();        z.method1();        z.method2();        //z.method3();当调用这个方法时,编译失败.        //Zi z = new Zi();        //z.method1();        //z.method2();        //z.method3();    }}
0 0
原创粉丝点击