Java面向对象编程:深入理解继承、多态与异常处理
立即解锁
发布时间: 2025-08-18 02:33:38 阅读量: 2 订阅数: 8 

# Java面向对象编程:深入理解继承、多态与异常处理
## 1. final 方法和类
### 1.1 final 方法
在 Java 中,`final` 方法不能被重写。例如:
```java
public final int getVelocity()
{
return this.velocity;
}
```
这里的 `getVelocity` 方法被声明为 `final`,任何以 `SpaceShip` 类为基类的类都不能重写该方法,否则编译器会报错。
关于 `final` 方法,还有以下要点:
- 通常应避免使用 `final` 方法,除非有充分理由。因为很难预测他人如何使用你的类,子类可能需要重写方法。
- `final` 方法执行效率比非 `final` 方法高,因为编译器在编译时知道对 `final` 方法的调用不会被其他方法重写。对于对性能要求高的应用,这种性能提升可能会比较明显。
- 私有方法自动被视为 `final`,因为无法重写不可见的方法。
### 1.2 final 类
`final` 类不能作为基类。要声明一个类为 `final`,只需在类声明中添加 `final` 关键字:
```java
public final class BaseBall
{
// BaseBall 类的成员放在这里
}
```
声明为 `final` 的类,其所有方法也被视为 `final`。因为不能用 `final` 类作为其他类的基类,所以没有类能重写 `final` 类的方法。
## 2. 类型转换
### 2.1 向上转型
派生类型的对象可以被当作其基类型的对象处理。例如,如果 `BaseBall` 类扩展了 `Ball` 类,`BaseBall` 对象可以被当作 `Ball` 对象处理,这称为向上转型,Java 会自动完成,无需编写强制类型转换运算符:
```java
Ball b = new BaseBall();
```
假设有一个方法 `hit` 接受 `Ball` 类型的参数:
```java
public void hit(Ball b)
```
调用该方法时,可以传递 `Ball` 对象或 `BaseBall` 对象:
```java
BaseBall b1 = new BaseBall();
hit(b1);
Ball b2 = b1;
hit(b2);
```
### 2.2 向下转型
自动类型转换不能反向进行,即不能在需要 `BaseBall` 对象的地方使用 `Ball` 对象。例如:
```java
public void toss(BaseBall b)
```
以下代码无法编译:
```java
Ball b = new BaseBall();
toss(b); // 错误:无法编译
```
可以显式地将 `b` 变量转换为 `BaseBall` 对象:
```java
Ball b = new BaseBall();
toss((BaseBall) b);
```
但如果 `b` 引用的对象不是 `BaseBall` 对象,会抛出 `ClassCastException` 异常。
如果想从基类变量引用的对象调用子类定义的方法,可以创建子类变量并进行强制类型转换:
```java
Ball b = new SoftBall();
SoftBall s = (SoftBall)b;
s.riseBall();
```
也可以在同一语句中完成转换和方法调用:
```java
Ball b = new SoftBall();
((SoftBall) b).riseBall();
```
一般来说,应将方法参数的类型声明为类层次结构中尽可能高的类型。例如,可以创建一个接受 `Ball` 对象的 `toss` 方法,而不是分别创建接受 `BaseBall` 和 `SoftBall` 对象的 `toss` 方法。必要时,`toss` 方法可以使用 `instanceof` 运算符确定抛出的球的类型。
## 3. 确定对象的类型
一个类型的变量可能持有另一个类型对象的引用。例如:
```java
Employee emp = new SalariedEmployee();
```
这里 `emp` 变量的类型是 `Employee`,但它引用的对象是 `SalariedEmployee`。
假设有一个方法 `getEmployee` 返回 `Employee` 类型的对象,但实际上返回 `SalariedEmployee` 或 `HourlyEmployee` 对象:
```java
Employee emp = getEmployee();
```
有时需要知道返回的员工类型。例如,`SalariedEmployee` 类有一个 `getFormattedSalary` 方法,`HourlyEmployee` 类有一个 `getFormattedRate` 方法。可以使用 `instanceof` 运算符确定对象类型:
```java
Employee emp = getEmployee();
String msg;
if (emp instanceof SalariedEmployee)
{
msg = "The employee's salary is ";
msg += ((SalariedEmployee) emp).getFormattedSalary();
}
else
{
msg = "The employee's hourly rate is ";
msg += ((HourlyEmployee) emp).getFormattedRate();
}
System.out.println(msg);
```
## 4. 多态性
多态性指 Java 能够使用基类变量引用子类对象,跟踪对象所属的子类,并使用子类的重写方法,即使在编译时不知道子类的类型。
以井字棋游戏为例,创建一个 `Player` 类:
```java
class Player
{
public int move()
{
for (int i = 0; i < 9; i++)
{
System.out.println(
"\nThe basic player says:");
System.out.println(
"I'll take the first open square!");
return firstOpenSquare();
}
return -1;
}
private int firstOpenSquare()
{
int square = 0;
// 查找第一个开放方格的代码放在这里
return square;
}
}
```
创建 `Player` 类的子类 `BetterPlayer`,重写 `move` 方法:
```java
class BetterPlayer extends Player
{
public int move()
{
System.out.println("\nThe better player says:");
System.out.println(
"I'm looking for a good move...");
return findBestMove();
}
private int findBestMove()
{
int s
```
0
0
复制全文
相关推荐









