Java继承、多态、方法重写与重载及抽象类详解
立即解锁
发布时间: 2025-08-18 01:24:34 阅读量: 2 订阅数: 7 

### Java 继承、多态、方法重写与重载及抽象类详解
在 Java 编程中,继承、多态、方法重写与重载以及抽象类是非常重要的概念。它们为代码的复用、灵活性和可扩展性提供了强大的支持。下面我们将详细探讨这些概念。
#### 方法重写(Overriding)
当从父类重写一个方法时,实际上是在履行一个契约。这个契约规定了方法的参数和返回类型。例如,父类的方法可能声明为“不接受任何参数并返回一个布尔值”,那么子类重写的方法在外部看来,其参数和返回类型必须与父类被重写的方法完全一致。
以下是一个简单的示例,展示了方法重写的规则:
```java
class Appliance {
public boolean turnOn() {
return true;
}
public boolean turnOff() {
return true;
}
}
class Toaster extends Appliance {
// 这不是一个合法的重写,因为改变了参数
// boolean turnOn(int level) {
// return true;
// }
// 这也不是一个合法的重写,因为降低了访问级别
// private boolean turnOn() {
// return true;
// }
}
```
方法重写有以下规则:
1. **参数必须相同,返回类型必须兼容**:父类方法接受的参数,子类重写方法必须使用相同的参数。父类声明的返回类型,重写方法必须声明相同类型或其子类类型。因为子类对象保证能够执行其父类声明的任何操作,所以在期望父类类型的地方返回子类类型是安全的。
2. **方法的访问权限不能更低**:访问级别必须相同或更友好。例如,不能将一个公共方法重写为私有方法。如果在编译时调用者认为调用的是一个公共方法,但在运行时由于重写版本是私有的而无法访问,这会导致错误。
#### 方法重载(Overloading)
方法重载是指在一个类中有两个或多个方法具有相同的名称,但参数列表不同。重载方法与多态无关,它主要是为了方便调用者。例如,如果有一个方法只接受一个整数参数,调用代码在调用该方法之前可能需要将一个双精度数转换为整数。但如果重载了该方法,使其接受一个双精度数参数,那么调用者就会更方便。
以下是一个方法重载的示例:
```java
public class Overloads {
String uniqueID;
public int addNums(int a, int b) {
return a + b;
}
public double addNums(double a, double b) {
return a + b;
}
public void setUniqueID(String theID) {
// 大量的验证代码,然后:
uniqueID = theID;
}
public void setUniqueID(int ssNumber) {
String numString = "" + ssNumber;
setUniqueID(numString);
}
}
```
方法重载有以下规则:
1. **返回类型可以不同**:只要参数列表不同,重载方法的返回类型可以自由改变。
2. **不能仅改变返回类型**:如果仅返回类型不同,这不是一个有效的重载,编译器会认为你试图重写方法。而且,除非返回类型是父类版本返回类型的子类型,否则这也不是一个合法的重写。要重载一个方法,必须改变参数列表,虽然可以将返回类型改为任何类型。
3. **访问级别可以任意改变**:可以用一个更严格的方法重载另一个方法,因为新方法不需要履行被重载方法的契约。
#### 方法重写与重载的对比
| 比较项 | 方法重写(Overriding) | 方法重载(Overloading) |
| ---- | ---- | ---- |
| 参数 | 必须相同 | 必须不同 |
| 返回类型 | 必须兼容 | 可以不同 |
| 访问权限 | 不能更低 | 可以任意改变 |
| 与多态的关系 | 与多态相关 | 与多态无关 |
#### 练习与示例
下面是一些练习,帮助你更好地理解方法重写和重载:
##### 练习 1:匹配代码与输出
```java
class A {
int ivar = 7;
void m1() {
System.out.print("A’s m1, ");
}
void m2() {
System.out.print("A’s m2, ");
}
void m3() {
System.out.print("A’s m3, ");
}
}
class B extends A {
void m1() {
System.out.print("B’s m1, ");
}
}
class C extends B {
void m3() {
System.out.print("C’s m3, " + (ivar + 6));
}
}
public class Mixed2 {
public static void main(String [] args) {
A a = new A();
B b = new B();
C c =
```
0
0
复制全文
相关推荐










