Java重载与重写:理解与示例

需积分: 0 0 下载量 72 浏览量 更新于2024-08-04 收藏 197KB DOCX 举报
"Java重载与重写的概念及应用" 在Java编程语言中,"重载"(Overloading)和"重写"(Overriding)是两个重要的多态性概念,它们都涉及到类与继承的关系,但有着不同的作用和规则。 **重载(Overloading)** 重载发生在同一个类中,指的是一个类可以有多个同名的方法,但这些方法的参数列表必须不同,包括参数的数量、类型或者顺序。返回类型并不影响方法的重载,因为调用方法时是根据方法名和传入的参数来决定调用哪个方法的。例如: ```java public class Test { public void print(int a) { System.out.println("打印整数:" + a); } public void print(String s) { System.out.println("打印字符串:" + s); } } ``` 在这个例子中,`print` 方法被重载了两次,一次接受整数参数,一次接受字符串参数。在调用时,编译器会根据传递的参数类型自动选择合适的方法。 **重写(Overriding)** 重写发生在子类与父类之间,当子类继承父类后,可以对父类中已有的非私有方法(`private` 方法无法被重写)进行重新定义,以实现不同的功能。重写方法的签名(方法名、参数列表)必须与被重写的方法完全一致,但子类重写的方法不能降低访问权限,且抛出的异常不能更广泛或与父类不匹配。例如: ```java class Animal { public void move() { System.out.println("动物可以移动"); } } class Dog extends Animal { @Override public void move() { System.out.println("狗可以跑和走"); } } ``` 在这个例子中,`Dog` 类重写了 `Animal` 类的 `move` 方法。当创建 `Dog` 对象并调用 `move` 方法时,实际执行的是子类 `Dog` 的重写版本。 **运行时多态性** 在Java中,运行时多态性是通过重写实现的。虽然在编译时,编译器只能看到引用类型(如 `Animal a = new Dog()` 中的 `Animal`),但在运行时,JVM会根据实际的对象类型(`Dog`)来调用相应的方法,这就是所谓的动态绑定。例如: ```java Animal a = new Animal(); // Animal对象 Animal b = new Dog(); // Dog对象 a.move(); // 执行Animal类的方法 b.move(); // 执行Dog类的方法 ``` 即使 `b` 是 `Animal` 类型的引用,但在运行时,`b.move()` 实际上调用了 `Dog` 类的 `move` 方法,这是因为 `b` 引用的对象是 `Dog` 类的实例。 **注意事项** 1. 重写方法不能抛出比被重写方法更广泛的异常,或者声明新的检查异常。 2. 重写方法的访问权限不能低于被重写方法的访问权限。 3. `final`、`static` 和 `private` 方法不能被重写。 4. 构造方法不能被重写,但可以被重载。 5. 方法的返回类型不影响重写,但应保持一致,除非使用了 `@Override` 注解,这会要求方法签名完全匹配。 了解并熟练掌握重载和重写的概念及其应用,对于编写可扩展和灵活的Java代码至关重要。通过这两个特性,开发者可以在不改变原有代码结构的情况下,为类添加新的行为,实现面向对象设计中的开闭原则。