Java面向对象编程:抽象类、接口、访问控制与多态性
立即解锁
发布时间: 2025-08-21 00:56:24 阅读量: 2 订阅数: 12 


Java编程艺术:从初学者到大师的进阶指南
### Java面向对象编程:抽象类、接口、访问控制与多态性
#### 1. 抽象方法与抽象基类
抽象方法是在类声明中出现但省略了方法体的方法。声明了一个或多个抽象方法的类必须被声明为抽象类。若创建了抽象方法却忘记将类声明为抽象类,Java编译器会报错。
即便一个类为其所有方法都提供了实现,也可以将其声明为抽象类,这样能防止使用`new`操作符直接创建该抽象类的对象,但这种情况并非普遍做法。
抽象基类的主要目的是提供一组公共接口方法,这些方法的实现预期在继承层次结构中更低层的某个派生类中找到。设计人员在希望基类指定而非实现行为,且期望派生类实现基类接口指定的行为时,会在应用程序架构中使用抽象类。这种设计方式(上层为抽象,下层为具体实现)能使架构更易于扩展新功能,而非进行修改,为应用程序架构注入稳定性。
在UML中表达抽象基类时,抽象类可以有字段和具体方法,就像普通类一样,但抽象方法用斜体表示。例如下面这个抽象类示例:
```java
// Example 11.9: AbstractClass.java
public abstract class AbstractClass {
public AbstractClass(){
System.out.println("AbstractClass object created!");
}
public abstract void printMessage();
public abstract void setMessage(String message);
}
```
```java
// Example 11.10: DerivedClass.java
public class DerivedClass extends AbstractClass {
private String _message = null;
public DerivedClass(String message){
_message = "Message from DerivedClass: " + message;
System.out.println("DerivedClass object created!");
}
public DerivedClass(){
this("DerivedClass message!");
}
public void printMessage(){
System.out.println(_message);
}
public void setMessage(String message){
_message = "Message from DerivedClass: " + message;
}
}
```
测试驱动程序如下:
```java
// Example 11.11: DriverApplication.java
public class DriverApplication {
public static void main(String[] args){
AbstractClass ac1 = new DerivedClass();
DerivedClass dc1 = new DerivedClass();
ac1.printMessage();
ac1.setMessage("I Love Java!!!");
ac1.printMessage();
dc1.printMessage();
dc1.setMessage("I hope you love Java too!!!");
dc1.printMessage();
}
}
```
总结来说,抽象方法省略了方法体,声明了抽象方法的类必须为抽象类。抽象类的主要目的是为一组类接口方法提供规范,设计人员使用抽象类可增强应用程序架构的稳定性。
#### 2. 接口
接口是一种Java构造,类似于隐式的抽象类。在Java中,一个派生类只能扩展一个类的行为,但可以实现任意数量的接口。
接口的目的是为一组公共接口方法提供规范,接口声明会引入一种新的数据类型。Java接口只能包含四种类型的成员:
- 常量字段:所有接口字段隐式为公共、静态和最终的。
- 抽象方法:所有接口方法隐式为公共和抽象的。
- 嵌套类声明:隐式为公共和静态的。
- 嵌套接口声明:具有与接口相同的特性。
抽象类和接口的区别如下表所示:
| 抽象类 | 接口 |
| --- | --- |
| 必须使用`abstract`关键字声明为抽象类。 | 隐式为抽象的,不鼓励在接口声明中使用`abstract`关键字。 |
| 可以包含抽象方法和具体方法,具体方法可以是公共、私有或受保护的。 | 只能包含抽象方法,所有方法隐式为公共和抽象的,冗余声明为公共和抽象是允许但不鼓励的。 |
| 可以包含公共、私有和受保护的变量数据字段和常量。 | 只能包含公共常量字段,所有字段隐式为公共、静态和最终的,冗余声明为公共、静态和最终是允许但不鼓励的。 |
| 可以包含嵌套类和接口声明,这些内部类和接口声明隐式为公共和静态的。 | 可以包含嵌套类和接口声明,这些内部类和接口声明隐式为公共和静态的。 |
| 可以扩展一个类但实现多个接口。 | 可以扩展多个接口。 |
在UML中,接口有两种表达方式:一种是用一个简单的圆圈,旁边标注接口名称;另一种是使用包含`<< interface >>`构造型的普通类图。
下面是一个接口的示例:
```java
// Example 11.12: MessagePrinter.java
interface MessagePrinter {
void printMessage();
void setMessage(String message);
}
```
```java
// Example 11.13: MessagePrinterClass.java
public class MessagePrinterClass implements MessagePrinter {
private String _message = null;
public MessagePrinterClass(String message){
_message = message;
}
public Me
```
0
0
复制全文
相关推荐










