文章目录
- 多态的主要概念和实现方式:
- 重写
- 重写方法的规则:
- 示例:
- 调用重写方法:
- 注意事项:
- 重载
- 方法重载的条件:
- 方法重载的例子:
- 重载方法的调用:
- 注意事项:
在 Java 中,多态性是面向对象编程中的一个重要概念,它允许不同的子类对象被当作其父类类型来使用,从而使得同一个方法调用可以表现出不同的行为。多态性实现了一个接口或者抽象类的多种实现方式,使得代码更加灵活、可扩展和易维护。
多态的主要概念和实现方式:
-
继承和多态性:多态性依赖于继承,子类可以使用父类的对象并且重写父类方法以提供特定的实现。
-
方法的重写(Override):子类可以重写父类的方法来提供特定的实现。当父类的引用指向子类对象时,调用这个方法时会执行子类的实现。
-
方法的重载(Overload):与方法重载不同,方法重载是在同一个类中,而方法的重写是子类重写父类的方法。
重写
方法的重写(Method Overriding)是面向对象编程中的一个重要概念,它允许子类重新定义(覆盖)从其父类继承的方法,以提供特定于子类的实现。当子类重写(覆盖)父类的方法时,子类中的方法签名(方法名、参数列表)必须与父类中的方法相同。
重写方法的规则:
-
方法签名相同:子类中重写的方法必须与父类中被重写的方法具有相同的方法名、参数列表和返回类型。
-
访问修饰符不能缩小:子类中重写的方法不能降低访问权限。例如,父类方法是
public
,则子类重写方法也必须是public
或者protected
。 -
异常类型限制:子类重写的方法不能抛出比父类方法更多的异常,但可以不抛出异常或者抛出父类方法抛出的异常的子类异常。
示例:
class Animal {
void makeSound() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}
调用重写方法:
Animal myDog = new Dog();
myDog.makeSound(); // 输出 "Bark",因为 myDog 是 Dog 类的实例,调用的是子类重写的方法
注意事项:
- 动态绑定:在运行时,会根据对象的实际类型来调用相应的方法,即使是用父类的引用指向子类对象。
- 子类方法覆盖父类方法:子类重写的方法会覆盖父类的同名方法。如果使用子类的对象调用这个方法,将执行子类的方法实现。
方法重写允许子类修改继承的方法实现,使得代码更具灵活性和可扩展性。通常用于实现多态性,让不同的子类对象能够有自己特定的行为。
重载
在Java中,方法重载是指在同一个类中可以存在多个方法名相同但参数列表不同的情况。方法重载使得您可以使用相同的方法名,但根据参数的类型、数量或顺序来执行不同的操作。
以下是方法重载的几个关键点:
方法重载的条件:
- 方法名相同:重载方法必须有相同的方法名。
- 参数列表不同:参数列表必须有所区别,可以是参数的类型、数量或者顺序的不同。
方法重载的例子:
public class Example {
// 方法重载示例
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
在这个例子中,add
方法被重载了三次。第一个 add
方法接受两个整数参数,第二个 add
方法接受两个双精度浮点数参数,第三个 add
方法接受三个整数参数。
重载方法的调用:
编译器会根据方法调用时提供的参数类型,数量和顺序来决定使用哪个重载方法。例如:
Example example = new Example();
int sumInt = example.add(2, 3); // 调用第一个 add 方法
double sumDouble = example.add(2.5, 3.7); // 调用第二个 add 方法
int sumThreeInt = example.add(1, 2, 3); // 调用第三个 add 方法
注意事项:
- 返回类型不作为重载的条件:方法重载可以拥有不同的返回类型,只要参数列表不同即可。
- 方法重载不依赖于访问修饰符:方法可以使用不同的访问修饰符进行重载。
- 方法重载与继承无关:方法重载是在同一个类中进行的,与继承无关。
方法重载是提高代码的可读性和灵活性的重要方式。通过合理使用方法重载,可以让代码更清晰、简洁并且更容易维护。