在Java中,覆盖(Overriding)和隐藏(Hidden)是多态性的不同表现。
覆盖(Overriding):
当子类继承了父类并且定义了与父类相同名称和参数的方法时,我们说子类覆盖了父类的方法。这种情况下,子类对象调用该方法时会执行子类中的实现,而不是父类的。这是动态绑定的一种表现。
class Parent {
void print() {
System.out.println("Parent's print()");
}
}
class Child extends Parent {
@Override
void print() {
System.out.println("Child's print()");
}
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
p.print(); // 输出 "Child's print()"
}
}
隐藏(Hidden):
当子类定义了与父类相同名称的方法,但参数不同时,这就是隐藏。隐藏的方法不是多态的,因此,子类对象调用该方法时会执行父类的实现。
class Parent {
void print(int i) {
System.out.println("Parent's print() with int parameter");
}
}
class Child extends Parent {
void print(String s) {
System.out.println("Child's print() with String parameter");
}
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
p.print(5); // 输出 "Parent's print() with int parameter"
p.print("test"); // 编译错误,Child类的print方法不可见
}
}
重载(Overloading):
重载是指在同一个类中,定义了多个同名方法,但这些方法的参数类型、参数数量不同,这样的多个同名方法构成重载关系。
class Example {
void print() {
System.out.println("No parameter print()");
}
void print(int i) {
System.out.println("Int parameter print()");
}
void print(String s) {
System.out.println("String parameter print()");
}
}
public class Main {
public static void main(String[] args) {
Example ex = new Example();
ex.print(); // 输出 "No parameter print()"
ex.print(5); // 输出 "Int parameter print()"
ex.print("test"); // 输出 "String parameter print()"
}
}
在这里,print() 方法名被用于三个不同的方法,每个方法都有不同的参数,这就是方法重载。调用时,根据传入参数的不同,Java 编译器会决定调用哪一个方法。