介绍
在本实验中,你将学习方法重载(method overloading)和方法重写(method overriding)。重写和重载是 Java 编程语言中使用的两个概念。这两个概念都允许程序员在相同的方法名下提供不同的实现。重载发生在编译时,而重写发生在运行时。静态方法可以被重载,但不能被重写。重载是一种静态绑定,而重写是一种动态绑定。
在本实验中,你将学习方法重载(method overloading)和方法重写(method overriding)。重写和重载是 Java 编程语言中使用的两个概念。这两个概念都允许程序员在相同的方法名下提供不同的实现。重载发生在编译时,而重写发生在运行时。静态方法可以被重载,但不能被重写。重载是一种静态绑定,而重写是一种动态绑定。
在前面的部分中,我们已经在 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!
如果一个类从其父类继承了一个方法,那么只要该方法没有被标记为 final
或 private
,就有机会重写该方法。通过重写,我们可以定义子类特有的行为,这意味着子类可以根据其需求实现父类的方法。在面向对象编程(OOP)中,重写意味着覆盖现有方法的功能。返回类型应与父类中原始(被重写)方法声明的返回类型相同或是其子类型。访问级别不能比被重写方法的访问级别更严格。例如:如果父类方法声明为 public
,那么子类中的重写方法不能是 private
或 protected
。我们同样以 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.
组织一个大型项目需要良好的架构设计思维,因此你应该掌握本实验所涵盖的核心概念。重写和重载为我们提供了更大的灵活性,以便更好地使用方法。