Java中的方法覆盖与多态

需积分: 12 1 下载量 29 浏览量 更新于2024-07-10 收藏 1.11MB PPT 举报
"Java编程中,父类与子类之间的成员方法同名或者同原型的情况" 在面向对象编程(OOP)中,继承是核心概念之一,它允许我们创建一个新类(子类)从一个现有类(父类)派生,以便子类可以继承父类的特性并对其进行扩展或修改。在Java中,使用`extends`关键字来实现继承。在处理继承时,有时会出现父类和子类中有同名成员的情况,包括成员变量和成员方法。本节将重点关注成员方法的同名处理,特别是方法覆盖和方法重载的概念。 ### 方法覆盖(Method Overriding) 当子类中的方法与父类中的方法有相同的名称、返回类型和参数列表时,我们说子类覆盖了父类的方法。这是Java中多态性的一个重要体现。例如: ```java class SuperClass { // 定义父类 public void fun() { // 具体实现代码略 } } class SubClass extends SuperClass { // 子类继承于父类 public void fun() { // 与父类中的方法完全同原型 // 具体实现代码略 } } ``` 在上述代码中,`SubClass`的`fun()`方法覆盖了`SuperClass`的`fun()`方法。当通过子类对象调用`fun()`方法时,将执行子类的实现,而不是父类的实现。这是多态性的一个例子,因为不同的对象(父类和子类)可以对同一方法做出不同的响应。 ### 方法重载(Method Overloading) 另一方面,如果两个方法名字相同,但参数列表不同(比如参数数量、顺序或类型不同),则构成了方法重载。方法重载不涉及继承,而是同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同即可。例如: ```java class BaseClass { // 定义基类 public void fun(int x) { // 具体实现代码略 } } class DerivedClass extends BaseClass { // 派生类继承于基类 public void fun(String s) { // 跟父类中名称相同但参数列表不同的方法 // 具体实现代码略 } } ``` 在这个例子中,`DerivedClass`的`fun(String s)`方法并没有覆盖`BaseClass`的`fun(int x)`方法,因为它们的参数列表不同,所以它们是两个独立的方法,称为方法重载。 ### 关键字`super` 在处理父类和子类的成员同名问题时,`super`关键字可以帮助我们显式地调用父类的成员。对于方法,可以这样使用: ```java class SubClass extends SuperClass { public void fun() { super.fun(); // 调用父类的fun()方法 // 其他子类的实现代码 } } ``` `super`关键字用于访问父类的非私有成员,包括方法和变量。 ### 抽象类和抽象方法 在Java中,如果一个类包含一个或多个抽象方法(没有具体实现的方法),那么这个类必须被声明为抽象类,使用`abstract`关键字。子类继承抽象类后,必须实现所有的抽象方法,除非子类也是抽象类。 ### 接口(Interface) 接口是一种完全抽象的类型,只能包含抽象方法(默认为`public abstract`)和常量。一个类可以实现多个接口,使用`implements`关键字。接口是实现多继承的方式,因为Java不支持类的多重继承。 ### `final`关键字 `final`关键字可以用于方法、变量和类。当应用于方法时,它使方法不能被覆盖;应用于变量时,它创建一个常量;应用于类时,它表示类不能被继承。 ### 类与类之间的关系 在Java中,类的关系主要有继承、实现接口和关联(组合/聚合)。继承用于创建层次结构,接口用于多继承,而关联则表示类之间的逻辑关系,如“汽车有发动机”。 总结来说,理解并掌握方法覆盖、方法重载以及如何处理父类和子类中同名成员的方法,是进行有效面向对象编程的关键。这些概念不仅帮助我们设计更灵活、可扩展的代码,还能利用多态性提高程序的复用性和可维护性。