Java的多态性:方法重写和覆盖
Java中的多态性是一种允许不同类的对象对同一消息做出响应的能力。多态性主要通过两种方式实现:方法重写(Method Overriding)和方法覆盖(Method Overloading)。
方法重写(Method Overriding)
方法重写是指在子类中重新定义父类的方法。这是实现多态性的一种方式,它允许子类根据需要改变继承自父类的行为。要使方法重写发生,必须满足以下条件:
- 方法名、参数列表必须与被重写的方法相同。
- 返回类型应该与被重写的方法相同或是其子类型(协变返回类型)。
3.访问权限不能比被重写的方法更严格。
4.重写的方法不能抛出新的检查异常或比被重写的方法声明更广泛的检查异常。
5.被重写的方法必须在父类中定义为非final。
例如:
```javaclass Animal {
void makeSound() {
System.out.println(“Some sound”);
}
}
class Dog extends Animal {
@Override void makeSound() {
System.out.println(“Bark”);
}
}
public class Test {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.makeSound(); // 输出 “Bark”
}
}``在这个例子中,
Dog类重写了
Animal类的
makeSound方法,因此当
Dog类的对象调用
makeSound方法时,会执行
Dog` 类中定义的方法。
方法覆盖(Method Overloading)
方法覆盖是指在一个类中可以有多个同名方法,只要它们的参数列表不同(即参数的类型、数量或顺序至少有一个不同)。这是编译时多态的一个例子,因为JVM在编译时根据方法的参数列表来决定调用哪个方法。
例如:
```javaclass Calculator {
int add(int a, int b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
}
public class Test {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(1,2)); // 输出3 System.out.println(calc.add(1,2,3)); // 输出6 }
}``在这个例子中,
Calculator类有两个
add方法,它们通过参数列表的不同来区分。当调用
add` 方法时,JVM会根据传递的参数数量来决定调用哪个方法。
总结来说,方法重写是运行时多态,它允许子类改变继承自父类的行为;而方法覆盖是编译时多态,它允许一个类中存在多个同名方法,只要它们的参数列表不同。
还没有评论,来说两句吧...