前面为大家介绍了类的相关概念以及使用方式,在Java中有两种特殊的类,分别为抽象类和接口(本质上还是类),这一片博客就为大家介绍一下抽象类以及接口的使用。对这两种特殊的类进行比较。
抽象类
如果一个类中存在某个或某些方法必须由继承该类的子类实现,这个时候我们就可以使用抽象类。使用了关键词abstract声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”属于一种不完整的方法,只含有一个声明,没有方法主体。定义抽象类的语法格式为: public abstract class className {
......
}
继承和实现接口与普通类一样,只是在类名前面加上abstract关键字,以表明该类为抽象类。
在 面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是 所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、 三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念 在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。 我们可以构造出一个固定的一组行为的抽象描 述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个 抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。
抽象类的使用有如下几点需要注意的地方:
1. 如果将一个类声明为abstract,此类不能生成对象,只能被继承使用。
2. 抽象方法必须存在于抽象类中。
3. 抽象类中可以有一般的变量和一般的方法。
4. 子类继承抽象类必须实现其中抽象方法,除非子类为抽象类。
还是以之前的Animal类为例,我们将其改造为一个抽象类:
public abstract class Animal {
private String type;
private int age;
public String getType() {
return type;
}
public int getAge() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void setAge(int age) {
this.age = age;
}
public abstract void say();
}
在这个抽象类中,我们定义了一个抽象方法say()。用于子类去重写实现。子类与之前的编写几乎相同。
public class Dog extends Animal{
public void say() {
System.out.println("汪汪...");
}
}
这样我们就继承了抽象类,并实现了其中的抽象方法say();。
接口
接口其实和抽象类是非常像的,只是接口着重于体现这个类能做什么,即有哪些方法。比如电脑上的主板,提供了一个显卡的插槽,不同的厂商生产显卡时要按照插槽的标准去生产,这和接口是同样的道理,接口提供了一套标准。
接口的定义格式为: public interface className {
......
}
接口的一些用法可以总结为如下几点:
1. 因为java不支持多重继承,所以有了接口,一个类只能继承一个父类,但可以实现多个接口,接口本身也可以继承多个接口。
2. 接口里面的成员变量默认都是public static final类型的。必须被显示的初始化。
3. 接口里面的方法默认都是public abstract类型的。隐式声明。
4. 接口没有构造方法,不能被实例化。
5. 接口不能实现另一个接口,但可以继承多个接口。
6. 类如果实现了一个接口,那么必须实现接口里面的所有抽象方法,否则类要被定义为抽象类。
我们以显卡作为例子,抽象出一个GraphicsCard接口,接口中定义一个显示图像的dispaly()方法:
public interface GraphicsCard {
public void dispaly();
}
然后我们在定义一个子类实现这个接口:
public class AMDGraphicsCard implements GraphicsCard {
public void dispaly() {
System.out.println("AMD显卡");
}
}
抽象类与接口比较
抽象类和接口之间很大程度上是很相似的,这里列举一下这两者的区别:
1. 接口只能包含抽象方法,抽象类可以包含普通方法。
2. 接口只能定义静态常量属性,抽象类既可以定义普通属性,也可以定义静态常量属性。
3. 接口不包含构造方法,抽象类里可以包含构造方法。