重载与重写

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习方法重载(method overloading)和方法重写(method overriding)。重写和重载是 Java 编程语言中使用的两个概念。这两个概念都允许程序员在相同的方法名下提供不同的实现。重载发生在编译时,而重写发生在运行时。静态方法可以被重载,但不能被重写。重载是一种静态绑定,而重写是一种动态绑定。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("`Java`")) -.-> java/ProgrammingTechniquesGroup(["`Programming Techniques`"]) java(("`Java`")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["`Object-Oriented and Advanced Concepts`"]) java/ProgrammingTechniquesGroup -.-> java/method_overloading("`Method Overloading`") java/ProgrammingTechniquesGroup -.-> java/method_overriding("`Method Overriding`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("`Classes/Objects`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/constructors("`Constructors`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/oop("`OOP`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/inheritance("`Inheritance`") subgraph Lab Skills java/method_overloading -.-> lab-178549{{"`重载与重写`"}} java/method_overriding -.-> lab-178549{{"`重载与重写`"}} java/classes_objects -.-> lab-178549{{"`重载与重写`"}} java/constructors -.-> lab-178549{{"`重载与重写`"}} java/oop -.-> lab-178549{{"`重载与重写`"}} java/inheritance -.-> lab-178549{{"`重载与重写`"}} end

重载

在前面的部分中,我们已经在 Person 类中使用了重载,因为它有三个构造函数。这是一个简单的例子。重载是一种允许一个类拥有多个同名方法的特性。通过这种方式,我们可以处理不同的情况而不会感到困惑。通常,有三种方式可以实现重载:

  • 参数数量不同
  • 参数类型不同
  • 不同类型的参数顺序不同

示例:

/home/labex/project/overloadingTest.java 文件中编写以下代码:

public class overloadingTest{
    public static void main(String[] args){
        overloadingTest test = new overloadingTest();
        System.out.println("add(10,20)= " + test.add(10,20));
        System.out.println("add(10,20,30)= " + test.add(10,20,30));
        System.out.println("add(5.5, 10.5)= " + test.add(5.5f, 10.5f));

        test.printInfo(1 , "an error!");
        test.printInfo("another error!" , 2);
    }
    // this method has two int params, returns an integer
    int add(int a, int b){
        return a+b;
    }
    // this method has three int params, returns an integer
    int add(int a, int b, int c){
        return a+b+c;
    }
    // this method has two float params, returns a float number
    float add(float a, float b){
        return a+b;
    }
    // this method has one string param and one int param, returns nothing
    void printInfo(String str, int code){
        System.out.println("Code: " + code + "\nMessage: " + str);
    }
    // this method has one int param and one string param, returns nothing
    void printInfo(int code, String str){
        System.out.println("Code: " + code + "\nMessage: " + str);
    }
}

输出:

使用以下命令运行 overloadingTest.java 文件:

javac /home/labex/project/overloadingTest.java
java overloadingTest

查看输出:

add(10,20)= 30
add(10,20,30)= 60
add(5.5, 10.5)= 16.0
Code: 1
Message: an error!
Code: 2
Message: another error!

重写

如果一个类从其父类继承了一个方法,那么只要该方法没有被标记为 finalprivate,就有机会重写该方法。通过重写,我们可以定义子类特有的行为,这意味着子类可以根据其需求实现父类的方法。在面向对象编程(OOP)中,重写意味着覆盖现有方法的功能。返回类型应与父类中原始(被重写)方法声明的返回类型相同或是其子类型。访问级别不能比被重写方法的访问级别更严格。例如:如果父类方法声明为 public,那么子类中的重写方法不能是 privateprotected。我们同样以 Animal(简化版)为例。

示例:

/home/labex/project/overridingTest.java 文件中编写以下代码:

class Animal{
    public void grow(){
        System.out.println("I'm animal, I grow up.");
    }
    public void sleep(){
        System.out.println("I'm animal, I am sleeping.");
    }
}
class Dog extends Animal{
    // overriding method
    public void grow(){
        System.out.println("I'm dog, I grow up.");
    }
}
class Bird extends Animal{
    // keep superclass grow(), add own statements
    // overriding method
    public void grow(){
        super.grow();
        System.out.println("I'm bird, I grow up.");
    }
    // overriding method
    public void sleep(){
        System.out.println("I'm bird, I am sleeping...");
    }
    // Bird own method
    public void sing(){
        System.out.println("I'm bird, I am singing a song...");
    }
}
public class overridingTest{
    public static void main(String[] args){
        Dog dog = new Dog();
        dog.grow();
        Bird bird = new Bird();
        bird.grow();
    }
}

输出:

使用以下命令运行 overridingTest.java 文件:

javac /home/labex/project/overridingTest.java
java overridingTest

查看输出:

I'm dog, I grow up.
I'm animal, I grow up.
I'm bird, I grow up.

总结

组织一个大型项目需要良好的架构设计思维,因此你应该掌握本实验所涵盖的核心概念。重写和重载为我们提供了更大的灵活性,以便更好地使用方法。

您可能感兴趣的其他 Java 教程