Java面向对象之多态与重写

引入

多态

  • 我们之前举得例子中,遍历输出Arraylist<People> peoples中的内容,内容中既持有Student类的对象,又有持有Teacher类的对象,而且我们输出的对象并不是一串对象所在的地址,而是对象的内容,这是因为我们在People的子类Student和Teacher中都创建了toString方法,在输出时持有子类对象的父类引用调用了子类的toString方法 ,那么对于People类的Arraylist<People> peoples容器中的Student对象和Teacher对象来说,遍历出的内容会自动匹配相对应的其类中toString方法进行输出,当子类中没有该方法的重写才会去调用基类中的toString方法,也就是输出对象所在的地址,这种特性就叫做多态。

重写

  • 而在每个子类中都有一个和基类Object中的toString方法重名的方法,并且在方法体上方都标注了@Override,这时就是在子类中对父类方法进行了重写

  • 多态是java的一种特性,持有子类对象的父类引用访问子类中的方法,在不同的子类中如果有同名的方法会自动匹配,也就是持有子类的父类对象调用和父类的同名的子类方法,此时会根据调用对象的特征(持有的是哪个类型的子类)呈现多种状态。

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

// 定义具体子类
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow!");
    }
}

// 使用抽象类引用
public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();  // 使用抽象类引用指向具体子类对象
        Animal myCat = new Cat();

        myDog.makeSound();  // 输出 "Woof!"
        myCat.makeSound();  // 输出 "Meow!"
    }
}

形成条件

  • 实现多态,必须要存在继承的关系
  • 父类变量必须持有了子类的对象
方法的重写
  • 对于抽象类子类中必须重写父类的方法(即为必须都要有这个方法),没有只需return null即可,但子类必须有,重写即为子类中方法的名字,参数列表必须时相同的,这样才可以达成覆盖父类的方法。这一过程就是方法的重写(toSting方法似乎可以在父类中没有方法体也能实现多态)

注释@Override的重要性

  • 注意被重写的方法最好加上注释@Override,这样ide可以帮我们检查父类中有没有该方法,没有会提醒我们要加上。
相关推荐
前端一小卒21 小时前
我用 Claude Code 的 Superpowers 技能链写了个服务,部署前差点把服务器搞炸
前端·javascript·后端
曹牧1 天前
Spring:@RequestMapping注解,匹配的顺序与上下文无关
java·后端·spring
阿丰资源1 天前
SpringBoot+Vue实战:打造企业级在线文档管理系统
vue.js·spring boot·后端
Rust研习社1 天前
使用 Axum 构建高性能异步 Web 服务
开发语言·前端·网络·后端·http·rust
0xDevNull1 天前
Spring Boot 自动装配:从原理到实践
java·spring boot·后端
IT_陈寒1 天前
SpringBoot配置加载顺序把我坑惨了
前端·人工智能·后端
Moment1 天前
面试官:给 llm 传递上下文,有哪几个身份 role ❓❓❓
前端·后端·面试
snakeshe10101 天前
SpringBoot 多人协作平台实战(5):从零开始集成 MyBatis ORM 连接 MySQL 数据库
后端
SamDeepThinking1 天前
中小团队需要一个资源微服务
后端·微服务·架构
超梦dasgg1 天前
Spring AI 智能航空助手项目实战
java·人工智能·后端·spring·ai编程