Java基础_多态

来源:互联网 发布:onenote for mac 离线 编辑:程序博客网 时间:2024/04/30 00:44

方法的重写和重载分别体现了动态多态和静态多态。

将多态,这一Java核心特性再次做一个总结:

1、静态多态,程序健壮性的一个体现

举例:比较两个数的大小,类型可能是short、int、long、float等类型,如果你建立4个不同名字的方法,那么对于该方法的调用者来说,无疑是不便利的,当然你可以为每个方法起一个方法名,如:maxShort(short a, short b)、maxInt(int a, int b)等,但是终究没有我只写几个同名的max(short a, short b)、max(int a, int b)方法对调用者更方便吧?如此这般,调用者只要用就好了,具体调用哪个max方法,由编译器在编译期间根据参数类型的不同去决定!


public class OverLoadDemo {
    
    public static void main(String[] args) {
        max(3, 4);
        max(3.0, 4.0);
    }
    
    static void max(short a, short b) {
        System.out.println(a > b ? a : b);
    }
    
    static void max(int a, int b) {
        System.out.println(a > b ? a : b);
    }
    
    static void max(float a, float b) {
        System.out.println(a > b ? a : b);
    }
    
    static void max(double a, double b) {
        System.out.println(a > b ? a : b);
    }
}
2、动态多态,程序可扩展性的良好体现

举例:一位女士要养宠物。若女士现在要养一个新宠物Bird,那么这种动态多态机制可以使得我们完全不去修改Lady类,即使再增加多少种宠物都是一样的,再者在Lady类中我们完全不用使用instance of去判断这个实例是哪个特定类Cat或者是Dog等,Java运行时系统会根据具体调用enjoy方法的对象具体是哪个来确定调用的是哪个类中的方法。

动态多态机制的前提有1、存在继承关系;2、要有子类重写父类方法;3、父类引用指向子类对象。当然也可以是接口和实现类。

public class Test {
    public static void main(String[] args) {
        Cat c = new Cat("mimi", "yellow");
        Dog d = new Dog("doudou", "white");
        Lady lady1 = new Lady("lady1", c);
        Lady lady2 = new Lady("lady2", d);
//        Lady lady3 = new Lady("lady3", new Bird("freedom", "red"));
        lady1.myPetEnjoy();
        lady2.myPetEnjoy();
//        lady3.myPetEnjoy();
    }
}

class Animal {
    String name;
    Animal(String name){
        this.name = name;
    }
    void enjoy(){
        System.out.println("大叫...");
    }
}

class Cat extends Animal {
    private String eyeColor;
    Cat(String name, String eyeColor){
        super(name);
        this.eyeColor = eyeColor;
    }
    void enjoy(){
        System.out.println("喵喵...");
    }
}

class Dog extends Animal {
    private String furColor;
    Dog(String name, String furColor){
        super(name);
        this.furColor = furColor;
    }
    void enjoy(){
        System.out.println("旺旺...");
    }
}

class Bird extends Animal {
    private String featherColor;
    Bird(String name, String featherColor) {
        super(name);
        this.featherColor = featherColor;
    }
    void enjoy(){
        System.out.println("叽叽喳喳...");
    }
}

class Lady {
    private String name;
    private Animal pet;
    Lady(String name, Animal pet){
        this.name = name;
        this.pet = pet;
    }
    void myPetEnjoy(){
        pet.enjoy();
    }
}


原创粉丝点击