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 中非常重要的概念,掌握它们对于理解面向对象编程至关重要。希望通过本文的讲解,大家能够清晰地理解这两个概念,并在实际编程中灵活运用。

相关文章
|
29天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
44 3
|
8天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
14天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
20天前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
58 5
|
17天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
29 1
|
24天前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
43 3
|
25天前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。
|
27天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
44 4
|
26天前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
20 1
|
27天前
|
SQL IDE Java
入门Cloud Toolkit:简化你的Java应用开发与部署流程
【10月更文挑战第19天】作为一名长期从事Java开发的程序员,我一直致力于寻找能够简化日常开发工作的工具。在众多工具中,阿里巴巴推出的Cloud Toolkit引起了我的注意。这款免费的插件旨在帮助开发者更轻松地进行开发、测试及部署工作,尤其是在与云服务交互时表现尤为出色。本文将从个人的角度出发,介绍Cloud Toolkit的基本功能及其使用技巧,希望能帮助初学者快速上手这款实用工具。
20 1