前言
前面两篇我们分别说了面向对象四大基本特性:继承和多态,这一篇文章主要来说一下在Java中三大基本特性中的抽象是如何体现的.在Think in Java(Java编程思想)这本书中的第九章的接口章节中是对抽象这个概念的一个很好的体现.
抽象类和抽象方法
在Java中,我们经常有这样的需求,在基类中不需要对某个方法进行实现,只要声明这个方法的存在即可.我们在没有搞抽象类之前我们会怎么办呢?我们会在基类中写一个方法,但是具体内部实现是没有的,然后子类继承基类之后,重写了基类中的这个方法.如下所示.
protected void printName(String name) { }
假定我们只有一个抽象基类,也就说基类中的各种方法没有任何意义,所以当我们创建一个基类对象的时候是没有任何意义的,并且我们可能还想阻止使用者这么做.通过让基类中的所有方法都产生错误,就可以实现这个目的,但是这样做会将错误信息延时到运行时才获得.并且需要在客户端进行可靠、详细的测试.所以最好是在编译时补货这些问题.
为此,Java提供了一个叫做抽象方法的机制,这种方法是不完整的,只有声明而没有方法体.我们需要使用关键字abstract来修饰.示例如下所示.
abstract protected void printName(String name);
当然了,如果一个抽象类中有抽象方法的存在,那么我们必须使用abstract来修饰这个类.并且,如果子类继承于这个抽象基类,并想创建该子类的对象,那么就必须为基类中的所有抽象方法提供方法定义.如果不这样做编译器将会强制我们使用abstract关键字来限定这个子类.下面我们就看一个完整的抽象类示例.
public abstract class People {
abstract void printAge(int age);
}
class Children extends People {
public void printAge(int age) {
System.out.println("年龄:"+age);
}
}
接口
上一个模块,我们说到了抽象类的关键字abstract,我们通过抽象类可以实现方法的实现.这个模块主要说的是接口类,在抽象类中我们可以允许有已经实现部分的方法和非实现部分的类,但是在接口类是一个完全抽象的类,他根本没有任何具体实现.它允许创建者确定方法名、参数列表和返回类型,但是没有任何方法体.接口只提供形式,而未提供任何具体表现.接口类的关键字是interface.举例如下所示.
interface PeopleAction{
int age = 10;
void run();
void eat();
void play();
}
那么,当我们想要某个类来遵循某个接口,那么我们就需要用到关键字implements.同时要注意的是当要实现一个接口时,在接口中被定义的方法必须是被定义为是public.示例如下所示.
class People implements PeopleAction
{
public void run() {
System.out.println("跑步");
}
public void eat() {
System.out.println("吃饭");
}
public void play() {
System.out.println("玩耍");
}
}
当我们的类组合了具体的父类以及具体的接口类的时候,当通过这种方式将一个具体类和多个接口组合到一起的时候,这个具体类必须放在前面,后面跟着才是接口,否则编译器会报错.
class Children extends People implements PeopleAction
{
public void printAge(int age) {
System.out.println("年龄:"+age);
}
public void run() {
System.out.println("跑步");
}
public void eat() {
System.out.println("吃饭");
}
public void play() {
System.out.println("玩耍");
}
}
如果不是如上的写法就会爆如下的错误.
同时我们也可以通过继承来实现接口的扩展.这一点很具体类是一致的.示例如下所示.
interface ChildrenAction extends PeopleAction{
void cry();
}
本文所有内容详情可查看Think in Java(Java编程思想)第九章的接口部分,所以还是建议大家去看原书.本文只是作为学习笔记,如有纰漏,欢迎指出.
网友评论