Java中多态与接口示例详解

 更新时间:2026年03月03日 09:08:58   作者:Komore315  
这篇文章主要介绍了Java中多态与接口的相关资料,多态允许一个接口或父类引用指向不同子类或实现类的对象,并在运行时执行相应子类或实现类的方法,接口定义了一组方法,但没有实现,实现接口的类必须提供这些方法的具体实现,需要的朋友可以参考下

一、多态

1.1多态的概念

多态是面向对象的三大特性之一,核心是 **"一个接口,多种实现"**。具体表现为:父类 / 接口的引用可以指向子类 / 实现类的对象,调用方法时会执行实际对象的重写方法。

1.2多态的前提:

  • 存在继承 / 实现关系
  • 方法重写(@Override)
  • 父类 / 接口引用指向子类 / 实现类对象 

1.3多态的实现方式

方法重写(Override)子类继承父类并重写父类方法,通过父类引用调用子类对象时,实际执行的是子类的方法。

// 1. 父类:只定义一个通用方法
class Animal {
    void shout() { // 通用行为:叫
        System.out.println("动物叫");
    }
}

// 2. 子类1:狗(重写父类的叫方法)
class Dog extends Animal {
    @Override
    void shout() {
        System.out.println("汪汪汪");
    }
}

// 3. 子类2:猫(重写父类的叫方法)
class Cat extends Animal {
    @Override
    void shout() {
        System.out.println("喵喵喵");
    }
}

// 测试:多态的核心体现
public class SimplePolymorphism {
    public static void main(String[] args) {
        // 核心:父类引用 指向 子类对象
        Animal a1 = new Dog(); // 狗装到Animal类型的“盒子”里
        Animal a2 = new Cat(); // 猫装到Animal类型的“盒子”里
        
        // 调用同一个方法,执行不同逻辑(多态)
        a1.shout(); // 输出:汪汪汪
        a2.shout(); // 输出:喵喵喵
    }
}

代码解释:

  • 先定义一个Animal(动物)父类,有个shout()(叫)方法;
  • Dog(狗)和Cat(猫)继承Animal,各自重写shout()方法,实现自己的 “叫声”;
  • 测试时,用Animal类型的变量(父类引用)分别指向DogCat对象;
  • 调用shout()方法时,变量是Animal类型,但实际执行的是子类(狗 / 猫)的方法 —— 这就是多态:同一个方法,不同对象执行不同逻辑

1.4向上和向下转型

  • 向上转型:把子类对象 “装” 到父类类型的变量里(自动完成,不用手动操作),这是多态的基础;
  • 向下转型:把已经向上转型的父类变量,“还原” 回子类类型(必须手动强转,且有风险)
// 父类
class Animal {
    void shout() {
        System.out.println("动物叫");
    }
}

// 子类
class Dog extends Animal {
    @Override
    void shout() {
        System.out.println("汪汪汪");
    }
    // 子类独有方法
    void wagTail() {
        System.out.println("摇尾巴");
    }
}

public class CastTest {
    public static void main(String[] args) {
        // 向上转型:子类对象 → 父类引用(自动完成,不用写额外代码)
        Animal a = new Dog(); 
        
        // 能调用父类定义的方法(执行子类重写的逻辑)
        a.shout(); // 输出:汪汪汪
        
        // 不能调用子类独有的方法(父类引用“看不到”子类独有方法)
        // a.wagTail(); // 编译报错!
    }
}

向上转型只能引用父类有的方法 如果没有,编译则会报错

多态就是基于向上转型实现的。

public class CastTest {
    public static void main(String[] args) {
        // 第一步:先向上转型
        Animal a = new Dog(); 
        
        // 第二步:向下转型(强制转换,必须加 (子类类型))
        Dog d = (Dog) a; 
        
        // 转型后:既能调用重写的方法,也能调用子类独有方法
        d.shout(); // 输出:汪汪汪
        d.wagTail(); // 输出:摇尾巴
        
        // ❌ 错误示范:父类对象不能转成子类(会抛运行时异常)
        // Animal a2 = new Animal();
        // Dog d2 = (Dog) a2; // 运行时抛出 ClassCastException
    }
}
  • 必须手动强转:要写 (Dog) a,告诉编译器 “我确认这个父类引用指向的是 Dog 对象”;
  • 前提条件:只有当父类引用实际指向的是该子类对象时,向下转型才安全(比如 a 实际是 Dog,才能转成 Dog);

二、接口

2.1接口的定义

接口(Interface)是纯抽象的 “行为契约 / 规范” —— 只规定 “要做什么”(定义方法名),不规定 “怎么做”(无方法体),由实现类(implements)去完成具体逻辑。

  • 类比:就像 “遥控器接口”,只定义 “开机、换台” 按钮,电视、空调各自实现自己的开机 / 换台逻辑。
  • 核心价值:统一行为标准、解耦代码、弥补 Java 单继承的不足。

2.2接口的实现

接口使用 interface 关键字声明,默认所有方法为 public abstract(隐式修饰符),属性为 public static final

interface MyInterface {
    void method1(); // 隐式为 public abstract
    String CONSTANT = "VALUE"; // 隐式为 public static final
}

类通过 implements 关键字实现接口,必须重写接口中所有抽象方法(除非是抽象类)

class MyClass implements MyInterface {
    @Override
    public void method1() {
        System.out.println("Implemented method");
    }
}

2.2.2多接口实现

一个类可同时实现多个接口,需重写所有接口的抽象方法。

interface InterfaceA { void methodA(); }
interface InterfaceB { void methodB(); }

class MyClass implements InterfaceA, InterfaceB {
    @Override
    public void methodA() { /* 实现 */ }
    @Override
    public void methodB() { /* 实现 */ }
}

2.2.3接口继承

接口可通过 extends 继承其他接口,支持多继承。子接口会合并父接口的方法。

interface ParentA { void methodA(); }
interface ParentB { void methodB(); }
interface Child extends ParentA, ParentB { void methodC(); }

class MyClass implements Child {
    @Override
    public void methodA() { /* 实现 */ }
    @Override
    public void methodB() { /* 实现 */ }
    @Override
    public void methodC() { /* 实现 */ }
}

2.3接口+类基本用法

// 1. 定义接口:只规定行为,不实现
interface Runable {
    // 抽象方法:只定义“跑”,无逻辑
    void run();
    
    // 默认方法:有通用逻辑,可选重写
    default void warmUp() {
        System.out.println("热身:活动关节");
    }
    
    // 静态方法:接口专属,只能通过接口名调用
    static void rule() {
        System.out.println("跑步规则:不要违规");
    }
    
    // 常量:默认public static final
    int SPEED_LIMIT = 10; // 限速10
}

// 2. 实现类1:学生跑步(实现接口)
class Student implements Runable {
    @Override
    public void run() { // 必须实现抽象方法
        System.out.println("学生慢跑,速度≤" + SPEED_LIMIT);
    }
    // 可选重写默认方法
    @Override
    public void warmUp() {
        System.out.println("学生热身:拉伸腿");
    }
}

// 3. 实现类2:运动员跑步(实现接口)
class Athlete implements Runable {
    @Override
    public void run() {
        System.out.println("运动员冲刺,速度≤" + SPEED_LIMIT);
    }
    // 不重写默认方法,直接用接口的warmUp
}

// 测试
public class InterfaceDemo {
    public static void main(String[] args) {
        // 接口引用指向实现类(多态)
        Runable s = new Student();
        Runable a = new Athlete();
        
        s.run();      // 输出:学生慢跑,速度≤10
        s.warmUp();   // 输出:学生热身:拉伸腿
        
        a.run();      // 输出:运动员冲刺,速度≤10
        a.warmUp();   // 输出:热身:活动关节
        
        Runable.rule(); // 静态方法:接口名.方法名调用
    }
}

三、总结

  • 接口是多态的 “规范载体”,定义统一行为;多态是接口的 “落地方式”,实现灵活适配;
  • 多态核心:统一引用、不同实现;接口核心:只定规则、多实现、解耦;
  • 实战中 “接口 + 多态” 是 Java 面向对象编程的核心组合,能让代码更灵活、易扩展、易维护。

到此这篇关于Java中多态与接口的文章就介绍到这了,更多相关Java多态与接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 修改jvm-sandbox源码导致线程安全分析

    修改jvm-sandbox源码导致线程安全分析

    这篇文章主要为大家介绍了修改jvm-sandbox源码导致线程安全分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java中CountDownLatch用法解析

    Java中CountDownLatch用法解析

    这篇文章主要为大家详细介绍了Java中CountDownLatch用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • JavaWeb Listener 利用Session统计在线人数

    JavaWeb Listener 利用Session统计在线人数

    这篇文章主要为大家介绍了JavaWeb Listener 利用Session统计在线人数,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题(最新推荐)

    解决org.apache.ibatis.binding.BindingException: Invalid boun

    这篇文章主要介绍了解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 深入了解Java核心类库--Objects类

    深入了解Java核心类库--Objects类

    这篇文章主要介绍了Java中的Object类详细介绍,本文讲解了Object类的作用、Object类的主要方法、Object类中不能被重写的方法、Object类的equals方法重写实例等内容,需要的朋友可以参考下
    2021-07-07
  • idea左下角的Git(Version Control)中显示Local Changes窗口方式

    idea左下角的Git(Version Control)中显示Local Changes窗口方式

    在IDEA中,通过使用快捷键Alt+9(Windows)或Cmd+9(Mac)可以快速打开LocalChanges窗口,查看当前Git仓库的本地变更,若此方法不可用,可尝试进入settings,点击VersionControl,选择Commit,并取消Use interface的勾选
    2024-10-10
  • Java设计模式编程之解释器模式的简单讲解

    Java设计模式编程之解释器模式的简单讲解

    这篇文章主要介绍了Java设计模式编程之解释器模式的讲解,解释器设计模式要注意其引发的性能问题,需要的朋友可以参考下
    2016-04-04
  • 基于jvm java内存区域的介绍

    基于jvm java内存区域的介绍

    下面小编就为大家带来一篇基于jvm java内存区域的介绍。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java中volatile关键字的作用与用法详解

    Java中volatile关键字的作用与用法详解

    volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。这篇文章主要介绍了Java中volatile关键字的作用与用法详解的相关资料,需要的朋友可以参考下
    2016-09-09
  • 浅谈Java自定义注解相关知识

    浅谈Java自定义注解相关知识

    今天带大家来学习Java注解的相关知识,文中对自定义注解作了非常详细的介绍,对正在学习Java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05

最新评论