Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!

简介: Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!

很多 Java 新手小白在学习面向对象编程时,经常会对“重载”和“重写”这两个概念感到困惑。它们看似相似,实则区别很大。

今天,本文就用通俗易懂的语言,结合实际例子,为大家详细讲解 Java 中的重载和重写。

一、 重载 (Overload)

重载是指在同一个类中,定义多个名称相同但参数列表不同的方法。参数列表的不同可以体现在参数的个数、类型或顺序上。

想象一下,你去餐厅吃饭,菜单上有各种菜品,比如:

  • 鱼香肉丝 (不辣)
  • 鱼香肉丝 (微辣)
  • 鱼香肉丝 (中辣)
  • 鱼香肉丝 (特辣)

虽然菜名都叫“鱼香肉丝”,但你可以根据自己的口味选择不同的辣度。这就是生活中的“重载”。

代码示例
public class Restaurant {
 
    // 不辣的鱼香肉丝
    public void orderYuXiangRouSi() {
        System.out.println("您点的是不辣的鱼香肉丝。");
    }
 
    // 微辣的鱼香肉丝
    public void orderYuXiangRouSi(String spicyLevel) {
        System.out.println("您点的是" + spicyLevel + "的鱼香肉丝。");
    }
 
    // 例如,可以根据人数点不同分量的鱼香肉丝
    public void orderYuXiangRouSi(int peopleCount) {
        System.out.println("您点了" + peopleCount + "人份的鱼香肉丝。");
    }
 
    // 还可以根据辣度和人数点餐
    public void orderYuXiangRouSi(String spicyLevel, int peopleCount) {
        System.out.println("您点了" + peopleCount +"人份" + spicyLevel + "的鱼香肉丝。");
    }
 
    public static void main(String[] args) {
        Restaurant restaurant = new Restaurant();
        restaurant.orderYuXiangRouSi(); // 调用不带参数的方法
        restaurant.orderYuXiangRouSi("微辣"); // 调用带辣度参数的方法
        restaurant.orderYuXiangRouSi(3); // 调用带人数参数的方法
        restaurant.orderYuXiangRouSi("中辣", 2); // 调用带辣度和人数参数的方法
    }
}

在上面的代码中,orderYuXiangRouSi() 方法根据参数个数和类型的不同,提供了多种点餐选择。

在实际开发中,我们经常需要根据不同的参数类型或数量执行不同的逻辑。例如:
public class Calculator {
 
    public int add(int a, int b) {
        return a + b;
    }
 
    public double add(double a, double b) {
        return a + b;
    }
 
    public int add(int... numbers) {
        int sum = 0;
        for (int number : numbers) {
            sum += number;
        }
        return sum;
    }
}

上面的 Calculator 类中,add() 方法根据传入参数的不同,实现了整数、浮点数以及多个数字的加法运算。

二、 重写 (Override)

重写是指子类重新定义父类中已存在的方法。重写要求子类方法与父类方法具有相同的方法名、参数列表和返回类型 (Java 5 后允许返回类型是协变的)。

你可以把“继承”想象成父子关系。父亲会做饭,儿子也会做饭,但儿子做的饭可能和父亲的味道不一样。这就是生活中的“重写”。

代码示例
class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
    
    public void eat(){
        System.out.println("动物正在进食");
    }
}
 
class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("喵喵喵");
    }
 
    @Override
    public void eat(){
        System.out.println("猫咪使用猫粮进食");
    }
}
 
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("汪汪汪");
    }
 
    @Override
    public void eat(){
        System.out.println("狗狗使用狗粮进食");
    }
}
 
public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.makeSound(); // 输出:动物发出声音
        animal.eat(); // 输出:动物正在进食
 
        Cat cat = new Cat();
        cat.makeSound(); // 输出:喵喵喵
        cat.eat(); // 输出:猫咪使用猫粮进食
 
        Dog dog = new Dog();
        dog.makeSound(); // 输出:汪汪汪
        dog.eat(); // 输出:狗狗使用狗粮进食
    }
}

在上面的代码中,Cat 类和 Dog 类都继承了 Animal 类,并分别重写了 makeSound() 方法和 eat() 方法, 使其拥有了各自的声音和进食习惯。

在图形界面开发中,我们经常需要重写父类的 paint() 方法来实现自定义的绘图逻辑。例如:

import javax.swing.*;
import java.awt.*;
 
public class MyPanel extends JPanel {
 
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // 自定义绘图逻辑,例如绘制一个红色的矩形
        g.setColor(Color.RED);
        g.fillRect(10, 10, 50, 50);
    }
}

上面的代码中,MyPanel 类继承自 JPanel 类,并重写了 paintComponent() 方法,实现了自定义的绘图逻辑。

三、 重载和重写的区别


四、 总结

重载和重写都是 Java 中非常重要的概念,掌握它们对于理解面向对象编程至关重要。希望通过本文的讲解,大家能够清晰地理解这两个概念,并在实际编程中灵活运用。

相关文章
|
1月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
234 3
|
18天前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
250 3
|
30天前
|
NoSQL Java 关系型数据库
Java 从入门到进阶完整学习路线图规划与实战开发最佳实践指南
本文为Java开发者提供从入门到进阶的完整学习路线图,涵盖基础语法、面向对象、数据结构与算法、并发编程、JVM调优、主流框架(如Spring Boot)、数据库操作(MySQL、Redis)、微服务架构及云原生开发等内容,并结合实战案例与最佳实践,助力高效掌握Java核心技术。
210 0
|
1月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
1月前
|
Java 编译器 API
Java Lambda表达式与函数式编程入门
Lambda表达式是Java 8引入的重要特性,简化了函数式编程的实现方式。它通过简洁的语法替代传统的匿名内部类,使代码更清晰、易读。本文深入讲解Lambda表达式的基本语法、函数式接口、方法引用等核心概念,并结合集合操作、线程处理、事件回调等实战案例,帮助开发者掌握现代Java编程技巧。同时,还解析了面试中高频出现的相关问题,助你深入理解其原理与应用场景。
|
9天前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
178 0
|
18天前
|
监控 Java API
2025 年全新出炉的 Java 学习路线:从入门起步到实操精通的详细指南
2025年Java学习路线与实操指南,涵盖Java 21核心特性、虚拟线程、Spring Boot 3、微服务、Spring Security、容器化部署等前沿技术,助你从入门到企业级开发进阶。
165 0
|
1月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
171 1
|
1月前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
99 0
|
2月前
|
存储 缓存 NoSQL
java 集合入门基础理论的核心概念与实用长尾知识
本文介绍了Java集合框架的基础理论知识,包括单列集合(List、Set、Queue)和双列集合(Map)的特点及常用实现类(如ArrayList、HashSet、HashMap等)。详细讲解了集合的遍历方式(迭代器、增强for循环、Lambda表达式)和典型应用场景(如数据去重、键值存储等)。通过具体代码示例,帮助初学者理解集合框架的核心概念和实际应用,为Java编程中的数据存储与管理提供基础指导。
84 0