多态 使用场景

多态允许不同类的对象对同一消息做出不同的响应。在 Java 中,多态主要通过继承和接口实现。

场景一:方法参数多态

java 复制代码
// 定义一个动物抽象类
abstract class Animal {
    public abstract void makeSound();
}

// 定义猫类,继承自动物类
class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("喵喵喵");
    }
}

// 定义狗类,继承自动物类
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("汪汪汪");
    }
}

// 定义一个动物操作类
class AnimalOperator {
    public void operate(Animal animal) {
        animal.makeSound();
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        AnimalOperator operator = new AnimalOperator();
        Cat cat = new Cat();
        Dog dog = new Dog();

        operator.operate(cat); // 传入猫对象
        operator.operate(dog); // 传入狗对象
    }
}

场景二:返回值多态

java 复制代码
// 定义一个形状抽象类
abstract class Shape {
    public abstract double area();
}

// 定义圆形类,继承自形状类
class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
}

// 定义矩形类,继承自形状类
class Rectangle extends Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double area() {
        return width * height;
    }
}

// 定义一个形状工厂类
class ShapeFactory {
    public Shape createShape(int type) {
        if (type == 1) {
            return new Circle(5);
        } else {
            return new Rectangle(4, 6);
        }
    }
}

public class ReturnPolymorphismExample {
    public static void main(String[] args) {
        ShapeFactory factory = new ShapeFactory();
        Shape shape1 = factory.createShape(1);
        Shape shape2 = factory.createShape(2);

        System.out.println("Shape 1 area: " + shape1.area());
        System.out.println("Shape 2 area: " + shape2.area());
    }
}

向上转型和向下转型示例

java 复制代码
// 定义一个父类
class Parent {
    public void print() {
        System.out.println("This is Parent class");
    }
}

// 定义一个子类
class Child extends Parent {
    @Override
    public void print() {
        System.out.println("This is Child class");
    }

    public void childMethod() {
        System.out.println("This is a child-specific method");
    }
}

public class TypeCastingExample {
    public static void main(String[] args) {
        // 向上转型
        Parent parent = new Child(); // 子类对象赋值给父类引用
        parent.print(); // 调用子类重写的方法

        // 向下转型
        if (parent instanceof Child) {
            Child child = (Child) parent; // 父类引用转换为子类引用
            child.print();
            child.childMethod(); // 调用子类特有的方法
        }
    }
}

instanceof 关键字使用示例

instanceof 关键字用于检查一个对象是否是某个类或接口的实例。

java 复制代码
// 定义一个接口
interface Flyable {
    void fly();
}

// 定义一个鸟类,实现 Flyable 接口
class Bird implements Flyable {
    @Override
    public void fly() {
        System.out.println("Bird is flying");
    }
}

// 定义一个飞机类,实现 Flyable 接口
class Plane implements Flyable {
    @Override
    public void fly() {
        System.out.println("Plane is flying");
    }
}

public class InstanceOfExample {
    public static void main(String[] args) {
        Flyable bird = new Bird();
        Flyable plane = new Plane();

        System.out.println(bird instanceof Bird); // 输出 true
        System.out.println(bird instanceof Flyable); // 输出 true
        System.out.println(plane instanceof Bird); // 输出 false
    }
}
相关推荐
涉密IT资质笔记9 分钟前
涉密人员脱密期管理规范:期限分级模型、就业限制边界与违规认定标准
java·服务器·前端·网络·数据库
mmsx10 分钟前
Android Dialog 插槽模式:用一套壳统一全应用的弹窗风格
android·java·dialog·开发语言
u01110267518 分钟前
工具页案例图如何编写 alt让图片说明与处理场景对应
java·前端·javascript·图像处理·人工智能·算法·ai作画
码上有光23 分钟前
Linux:进程间通信——匿名管道通信、命名管道通信
android·java·linux·linux通信·匿名通信·命名通信
落魄实习生31 分钟前
Agent Scope Java 2.x 系列【11】AgentState 与状态存储
java·开发语言·ai
Ivanqhz1 小时前
干涉图着色
java·服务器·网络·数据库·人工智能·深度学习
程序鉴定师2 小时前
2026年深圳小程序/App开发公司技术选型指南:从架构设计到交付标准全维度评估
java·小程序·uni-app·php·objective-c
用户094248568032 小时前
第20章:JVM G1 GC原理、日志与调优实战
java·jvm
打工仔折腾 AI2 小时前
把模型切换交给平台:用蓝耘智能路由搭建商品评论分析工具
java·服务器·前端·后端·python·性能优化·ai agent 实战
后端LV2 小时前
Caffeine 源码详解:为什么它是最快的 Java 本地缓存——一次压测引发的源码考古
java·后端