java复习 02
谢谢伟大的ai给我出卷子,,谢谢,,谢谢大模型,感恩,我像是一只皮革。。。。
1 实现接口必须实现其所有抽象方法,否则类必须声明为抽象类。
2 子类重新实现父类同名方法称为方法重写,需遵循 "两同两小一大" 原则。
在 Java 的方法重写(覆盖,Overriding) 中,子类重写父类方法时需要遵循 “两同两小一大” 原则,这是确保重写合法性和多态正确性的关键规则。以下是对该原则的详细解析:
一、两同
1. 方法名相同
子类重写的方法必须与父类被重写的方法完全同名。
示例:
java
class Parent {public void show() { ... } // 父类方法名是 show
}
class Child extends Parent {public void show() { ... } // 子类方法名必须也是 show
}
2. 参数列表相同
子类方法的参数类型、顺序、数量必须与父类方法完全一致,不能修改参数列表。
示例:
java
class Parent {public void print(int num) { ... } // 父类参数是 int
}
class Child extends Parent {public void print(int num) { ... } // 子类参数必须也是 int,不能改为 long 或其他类型
}
二、两小
1. 子类方法的返回值类型小于或等于父类方法的返回值类型
- 若父类方法返回基本数据类型,子类返回值类型必须与父类完全相同。
示例:java
class Parent {public int getNum() { return 1; } // 父类返回 int } class Child extends Parent {public int getNum() { return 2; } // 子类必须也返回 int,不能改为 long }
- 若父类方法返回引用数据类型(如类),子类返回值类型必须是父类返回值类型的子类或相同类型(称为 协变返回类型)。
示例:java
class Animal { ... } class Dog extends Animal { ... }class Parent {public Animal getPet() { return new Animal(); } // 父类返回 Animal } class Child extends Parent {public Dog getPet() { return new Dog(); } // 子类返回 Dog(Animal 的子类),合法 }
2. 子类方法声明抛出的异常类型小于或等于父类方法声明抛出的异常类型
- 子类方法可以声明抛出父类方法异常的子类或不抛出异常,但不能抛出父类方法未声明的更宽泛的异常。
示例:java
import java.io.IOException;class Parent {public void work() throws IOException { ... } // 父类抛出 IOException } class Child extends Parent {public void work() throws FileNotFoundException { ... } // FileNotFoundException 是 IOException 的子类,合法 }
- 若父类方法未声明抛出异常,子类方法不能声明抛出受检异常(但可以抛出非受检异常,如
RuntimeException
)。
- 若父类方法未声明抛出异常,子类方法不能声明抛出受检异常(但可以抛出非受检异常,如
三、一大
子类方法的访问权限大于或等于父类方法的访问权限
- 父类方法的访问修饰符决定了子类方法的最低权限要求:
父类方法修饰符 子类方法允许的修饰符 示例(父类方法) 子类合法修饰符 private
只能在子类中重新定义为 private
private void method()
必须也是 private
默认(包访问)
可以是 默认
、protected
、public
void method()
protected
、public
protected
可以是 protected
、public
protected void method()
public
public
必须是 public
public void method()
只能是 public
- 核心逻辑:子类不能缩小父类方法的访问范围,否则会破坏多态的可用性(例如,父类引用调用子类方法时可能因权限不足无法访问)。
四、违反原则的后果
若不遵循 “两同两小一大” 原则,编译器会报错,提示 “方法未正确覆盖父类方法”。例如:
- 改方法名 → 变成方法重载,而非重写。
- 改参数列表 → 变成方法重载,父类方法未被覆盖。
- 缩小访问权限 → 编译错误(如父类方法是
public
,子类改为protected
)。
五、总结图示
plaintext
父类方法:
修饰符 返回值 方法名(参数列表) throws 异常列表 { ... }子类重写要求:
↓ ↓ ↓ ↓ ↓
│ │ │ │ ├─ 异常类型 ≤ 父类异常(两小)
│ │ │ ├─ 参数列表必须相同(两同)
│ │ └─ 方法名必须相同(两同)
│ └─ 返回值类型 ≤ 父类返回值(两小)
└─ 修饰符 ≥ 父类修饰符(一大)
通过遵循该原则,可确保多态机制在运行时正确调度子类方法,避免逻辑错误和编译问题。
3 接口中的方法默认是public abstract
(可省略),属性默认是public static final
。
4 super
可调用父类构造方法、成员方法或属性。
5 final
修饰的类不可被继承,修饰的方法不可被重写。
6 一个对象只能属于一个类,但可实现多个接口。
7 构造方法不能被继承,但子类构造默认调用父类无参构造。
8 抽象类可以不含抽象方法,但含抽象方法的类必须声明为抽象类。
9 面向对象三大特征
-
封装:
将数据(属性)和操作(方法)绑定为一个整体,并隐藏内部细节。
示例:java
public class Person {private String name; // 私有属性,外部不可直接访问public String getName() { return name; } // 公共访问方法 }
-
继承:
子类继承父类的属性和方法,实现代码复用和扩展。
示例:java
class Animal { void eat() { ... } } class Dog extends Animal { void bark() { ... } } // Dog继承eat()方法
-
多态:
同一操作作用于不同对象,产生不同行为。
示例:java
Animal a = new Dog(); // 父类引用指向子类对象 a.eat(); // 调用Dog重写的eat()方法
10 接口与抽象类的区别
维度 | 接口 | 抽象类 |
---|---|---|
结构 | 仅含抽象方法和常量 | 含抽象方法、非抽象方法和变量 |
继承限制 | 允许多实现(implements) | 单继承(extends) |
成员修饰符 | 方法默认public abstract ,属性默认public static final | 无强制要求 |
设计目的 | 定义行为规范,实现 "has-a" 关系 | 定义共性,实现 "is-a" 关系 |
11 方法重载与方法重写的区别
维度 | 方法重载(Overloading) | 方法重写(Overriding) |
---|---|---|
范围 | 同一个类中 | 子类与父类间 |
条件 | 方法名相同,参数列表不同 | 方法名、参数列表、返回类型均相同 |
机制 | 编译时多态(静态绑定) | 运行时多态(动态绑定) |
访问权限 | 无限制 | 子类权限≥父类权限 |