JAVA多态

一、多态概念

所谓多态,是指一个引用(类型)在不同情况下的多种状态。

父类的引用指向自己的子类对象,这就是多态的代码体现形式。

 

多态通过“继承”和“接口”两种现象构成。

 

二、多态的前提

类与类之间必须有关联,要么“继承”,要么“实现”

存在覆盖

 

三、多态好处

提高了程序的扩展性

 

四、多态的弊端

 只能使用父类的引用访问父类的成员。

如果所创建的子类象要访问子类自己所特有的属性或访问时,则需要类型强制转换。

 

 

示例:

以下示例中,子类Cat和Dot继承了父类Animal的方法,重写了父类的方法。

在创建子类对象时,可以直接使用父类引用来引用它的子类对象。

附值=左侧的引用变量一样,对象类型由右侧实例决定。

这样,就可以用一个父类引用来创建N个子类实例,方便开发。

package javastudy;

public class Demo1 {

    public static void main(String[] args) {

        // TODO Auto-generated method stub
        /*
         * 以下非多态 Cat c=new Cat(); //创建子类Cat的对象 c.cry();
         * 
         * Dog d=new Dog(); //创建子类Dog的对象 d.cry();
         */
        // 以下为多态
        myFun(new Cat()); // 直接用父类的         如果不使用以下的myFun方法,可以写成Animal a=new Cat(); a.cry();类型提升,向上转型
        myFun(new Dog());

    }

    public static void myFun(Animal a){  //相当于Animal a=new Cat();
        a.cry();
    }

}

class Animal {

    public void cry() {
        System.out.println("不知道怎么叫");
    }
}

// 子类

class Dog extends Animal {
    // 狗叫
    public void cry() { // 函数的重写
        System.out.println("汪汪叫");
    }
}

class Cat extends Animal {
    // 猫叫
    public void cry() {
        System.out.println("喵喵叫");
    }
}

输出:

喵喵叫
汪汪叫

 

示例二

package javastudy;

public class Demo2 {

    public static void main(String[] args) {
        Master master=new Master();            //创建Master实例
        master.feed(new MyDog(), new Bone());    //
        master.feed(new MyCat(), new Fish());
    }
}


//主人类
class Master
{
    //给动物喂食,使用多态,方法就用一个
    public void feed(MyAnimal a,Food f) {        //如果再加动物和食物,feed方法名不用改,形参会自动调用
        a.eat();            //调用对应的子类的方法
        f.showName();        //调用对应的子类的方法
    }
}

//动物类
class MyAnimal{
    
    //动物会叫
    public  void cry() {
        System.out.println("不知道怎么叫");
    }
    //动物会吃东西
    public void eat(){
        System.out.println("不知道喜欢吃什么");
    }
}


//动物子类——狗

class MyDog extends MyAnimal{
    //狗叫
    public void cry(){
        System.out.println("汪汪叫");
    }
    //狗吃东西
    public void eat(){
        System.out.println("狗吃骨头");
    }
}

//动物子类——猫
class MyCat extends MyAnimal{
    //猫叫
    public void cry(){
        System.out.println("喵喵叫");
    }
    //猫吃东西
    public void eat(){
        System.out.println("猫吃鱼");
    }
    
}

//食物类
class Food
{
    String name;
    public void showName(){

    }
}
//食物的子类——鱼
class Fish extends Food{
    public void showName() {
        System.out.println("我是一条鱼");
    }
}

//食物的子类——骨头
class Bone extends Food{
    public void showName() {
        System.out.println("我是一跟骨头");
    }
}

输出:

狗吃骨头
我是一跟骨头
猫吃鱼
我是一条鱼

 

posted @ 2017-02-17 13:35  自学开发的老司机  阅读(971)  评论(0编辑  收藏  举报