[info]多态[/info]

多态:如上图,我们有一个打印机超类,有两个子类,子类A打印彩色图片,子类B打印黑白照片,子类A与子类B都有超类的打印功能,而打印出的效果却不同,子类A既有具备了超类打印机的形态,也有自己的形态,这便是多态,不是多种状态,而是多种形态。


/*创建父类*/
public abstract class Animal {

    public abstract void eat();
}
/*Cat子类*/
public class Cat extends Animal{

    @Override
    public void eat() {
        System.out.println("吃鱼");
    }
}
/*Dog子类*/
public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("吃骨头");
    }
}
/*测试类*/
public class Test {
    public static void main(String[] args) {

        //多态形式  创建对象
        Animal cat = new Cat();
        //调用Cat 的eat
        cat.eat();

        System.out.println("--------------");

        //多态形式  创建对象
        Animal dog = new Dog();
        //调用Dog 的eat
        dog.eat();
    }
}

打印输出结果:

吃鱼
--------------
吃骨头

多态类型转换:

向上转型多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的,当父类引用指向子类对象时,便是向上转型

父类类型 变量名 = new 子类类型();
 如:Animal a = new Cat();

向下转型:父类类型向子类类型转换的过程,这个过程时强制的

子类类型 变量名 = (子类类型) 父类变量名; 
如:Cat c =(Cat) a;

为什么要转型:在多态方式调用方法时,首先检查父类是否有该方法,如果没有则编译错误,也就是说不能调用子类独有的方法,如果想调用子类独有的方法,必须做向下转型:

/*创建父类*/
public abstract class Animal {

    public abstract void eat();
}
/*Cat子类*/
public class Cat extends Animal{

    @Override
    public void eat() {
        System.out.println("吃鱼");
    }

    public void watchHouse(){
        System.out.println("抓老鼠");
    }
}
/*测试类*/
public class Test {
    public static void main(String[] args) {

        //向上转型
        Animal cat = new Cat();
        //调用Cat 的eat
        cat.eat();

        System.out.println("-----------------");

        //向下转型
        Cat cat1 = (Cat) cat;
        cat1.watchHouse();
    }
}
打印输出结果:
吃鱼 ----------------- 抓老鼠

总结:

多态存在的三个条继承,重写,父类指向子类对象

多态的优点:消除类型之间的耦合关系,可替换性强 ,可扩充 ,灵活

您必须 登录 才能发表评论