让你彻底读懂Java多态

Java多态,我真是看立刻很多次,记了很多次,但是还是容易忘,容易不理解,其实根本原因就是没在实际应用过,不知道具体场景,今天我也终于实际用到了,大彻大悟了。
接下来我一层层的,给大家抛开迷雾。
首先开看一段最简单的多态代码。

// 父类 Animal
class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

// 子类 Dog 继承自 Animal
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("狗发出汪汪的声音");
    }
}

// 子类 Cat 继承自 Animal
class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("猫发出喵喵的声音");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog(); // 父类引用指向子类对象
        Animal cat = new Cat(); // 父类引用指向另一个子类对象
        
        dog.makeSound(); // 调用 Dog 的 makeSound 方法
        cat.makeSound(); // 调用 Cat 的 makeSound 方法
    }
}

这就是一个很简单的,父类引用指向子类对象,调用对应子类的方法,没错我以前学的都是这个,这感觉什么多不多态的,没啥用啊,这我都知道是哪个子类, 我直接用子类去定义就好了啊, 干嘛还用父类去接受子类的对象。
你是对的,没毛病,我就一直是这个疑惑所有一直没搞懂。/(ㄒoㄒ)/~~
再看一段代码。

class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

// 子类 Dog 继承自 Animal
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("狗发出汪汪的声音");
    }
}

// 子类 Cat 继承自 Animal
class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("猫发出喵喵的声音");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal;
        
        // 根据输入内容自动识别是哪个子类
        String input = "dog"; // 可以替换为 "dog" 或者 "cat" 测试不同情况
        if (input.equalsIgnoreCase("dog")) {
            animal = new Dog(); // animal 引用指向 Dog 对象
        } else if (input.equalsIgnoreCase("cat")) {
            animal = new Cat(); // animal 引用指向 Cat 对象
        } else {
            animal = new Animal(); // 默认情况下指向 Animal 对象
        }
        
        animal.makeSound(); // 根据具体指向的对象来调用相应的 makeSound 方法
    }
}

这里我们把这个main函数想成是 前端的调用,这样可以if判断到底是哪个子类了, 但是这就还是有问题, 我还是在写代码的时候就知道是哪个子类, 那我还用父类干哈,这不是自己给自己找事吗。
ok,接着往下看。

import java.lang.reflect.InvocationTargetException;

// 父类 Animal
class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

// 子类 Dog 继承自 Animal
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("狗发出汪汪的声音");
    }
}

// 子类 Cat 继承自 Animal
class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("猫发出喵喵的声音");
    }
}

// 动物工厂类
class AnimalFactory {
    public static Animal createAnimal(String animalType) {
        try {
            Class<?> clazz = Class.forName(animalType);
            return (Animal) clazz.getDeclaredConstructor().newInstance();
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }
}

public class Main {
    public static void main(String[] args) {
        String animalType = "Cat"; // 根据输入选择要创建的子类类型
        
        Animal animal = AnimalFactory.createAnimal(animalType);
        if (animal != null) {
            animal.makeSound();
        }
    }
}

嗯,看完这个代码,是不是大彻大悟了。这个代码我们在全程一直不知道到底是哪个子类了,是哪个子类全靠我们前端传递的animalType 参数来判断。这样是不是就不是多次一举使用多态了。
我也是到了这里,才真正明白了多态的用法, 更详细分,其实这种写法叫做动态多态,其实我也觉得这才是多态最应该应用的场景,能够解放我们在开发阶段去手动判断子类的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值