Java多态详解

多态的概念:多态其实是同一个对象在不同时刻体现出来的不同状态

多态的前提:
1、有继承或者实现关系。
2、有方法重写(因为多态就是靠方法重写来体现不同状态的)。
3、要有父类引用指向子类对象。
  格式:父 f = new 子()

多态中的成员访问特点:
1、成员变量
  编译看左边(父类),运行看左边(子类)。

2、构造方法
  创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化

3、成员方法
  编译看左边(父类),运行看右边(子类)
  (因为成员方法存在方法重写,所以成员方法访问的时候访问的是子类)。

4、静态方法
  编译看左边(父类),运行看左边(子类)
  (静态和类相关,算不上重写,所以,访问还是左边)

多态的好处:
1、提高了代码的维护性(由继承来保证)
2、提高了代码的扩展性(由多态来保证)

对于下面的代码,是没有用多态来写的,如果创建一个新的子类,就要在工具类中多增加一个方法,如果创建很多个,那么同样的代码要重复好多遍,如果用多态,就可以保证在多增加一个类的同时,工具类中不用再增加一个方法。这就提高了代码的扩展性。


public class Main {
    public static void main(String[] args) {
        cat c = new cat();
        dog d = new dog();
        AnimalTool.useCat(c);
        AnimalTool.useDog(d);
    }
}

//创建工具类
class AnimalTool {
    private AnimalTool() {}

    //调用猫的功能
    public static void useCat(cat c) {
        c.eat();
        c.sleep();
    }

    //调用狗的功能
    public static void useDog(dog d) {
        d.eat();
        d.sleep();
    }

    //如果我创建一个新的子类,就要在这里多增加一个方法,如果创建很多个,那么同样的代码要重复好多遍

}

//创建父类
class Animal {
    public void eat() {
        System.out.println("eat");
    }

    public void sleep() {
        System.out.println("sleep");
    }
}

//创建子类
class cat extends Animal {
    public void eat() {
        System.out.println("猫吃鱼");
    }

    public void sleep() {
        System.out.println("猫卧着睡");
    }
}

//创建子类
class dog extends Animal {
    public void eat() {
        System.out.println("狗吃肉");
    }

    public void sleep() {
        System.out.println("狗趴着睡");
    }
}

如果用多态,就会节省很多代码:


public class Main {
    public static void main(String[] args) {
        Animal c = new cat();
        Animal d = new dog();
        AnimalTool.useAnimal(c);
        AnimalTool.useAnimal(d);
    }
}

class AnimalTool {
    private AnimalTool() {}
    //运用多态就能很好的解决代码重复的问题
    public static void useAnimal(Animal a) {
        a.eat();
        a.sleep();
    }
}

class Animal {
    public void eat() {
        System.out.println(eat);
    }

    public void sleep() {
        System.out.println(sleep);
    }
}

class cat extends Animal {
    public void eat() {
        System.out.println("猫吃鱼");
    }

    public void sleep() {
        System.out.println("猫卧着睡");
    }
}

class dog extends Animal {
    public void eat() {
        System.out.println("狗吃肉");
    }

    public void sleep() {
        System.out.println("狗趴着睡");
    }
}

多态的弊端:不能使用子类的特有功能。

猜你喜欢

转载自blog.csdn.net/k_young1997/article/details/81156929