提到抽象类我们需要先了解抽象方法的概念。
以图形类(Geometry类)为例,图形可以有多种类型像是矩形、三角形、圆形等等,所以从此看,图形这一概念便不是“具体”的,而是一个”抽象“的概念。而假如程序员想要使用getArea方法计算图形面积时,由于不确定图形具体是什么形状,求面积的计算方法也不一样,这便需要图形类的子类重写其getArea方法,而此方法在基类中(Java下)则需要加以abstract修饰符表明其需要在子类中重写。
//具体格式为此,getArea方法即为抽象方法 public abstract double getArea();
而包含抽象方法的基类则称为抽象类(必须加abstract声明)
public abstract class Geometry{
....
}
ps:
1、抽象类可以有0个普通方法,也可以有0个抽象方法(作为新派生类的基类)
2、无论怎样抽象类都不可以创建对象实例化
3、若抽象类的子类不是抽象类,那么子类必须重写所有父类中的抽象方法
至于抽象类的优势,下举一例
public abstract class GeometryObject{
double length;//设定图形属性(或半径或边长)
public abstract setLength(double length);
public abstract double getArea();
}
public class Circle extends GeometryObject{
public abstract void setLength(double length){
this.length = length;
}
public abstract void getArea(){
return Math.PI * length * length;
}
}
public class Square extends GeometryObject{
public abstract void setLength(double length){
this.length = length;
}
public abstract double getArea(){
return length * length;
}
}
public class Demo{
public static void main(String[] args){
Circle circle = new Circle();
Square square = new Square();
circle.setLength(2);
square.setLength(2);
circle.getArea();
square.getArea();
}
}
如此可以看出使用抽象类可以避免在重写某一功能时需重复再写大量代码,有效提高效率。
二、接口首先需要明确的是:接口与类相似,其中仅含有常量和抽象方法
对于接口我们可以理解为在现实生活中的一种产品准入市场的技术标准。标准提供了产品需要满足的各种要求**(这些要求便可理解为接口中的属性)**,但标准自身肯定是不能当作产品的,而产品合格便是符合此种标准,当然一个产品完全可以同时符合多种标准,可以进入多个市场。
如此接口便很容易理解了,它具有以下特点:
1、为其他类提供行为说明
2、不能被实例化
3、一个类可以实现一个或多个接口
4、接口中的方法都是public且为抽象方法(都须在别处重写)
接口的通用格式:
public interface 接口名称{
(方法头......);
}
由此可以看出接口与所有方法都是抽象方法的抽象类很相似(但其也有不同点将在下面阐述)。
需要注意的是:接口中的属性都是public,final,static的!!
public interface check{
int f1 = 3;
int f2 = 4;
//变量f1、f2均为public final static int 变量
//意味着在接口中定义的变量都可以被实现该接口的类所访问!
//final意味着变量必须赋值
}
接口的实现
类要想实现某一接口则需要在类头上使用implements关键字
public class Geometry implements Countable{
......
}
举一具体例子:
//定义了Geometry接口
public interface Geometry {
public abstract double getArea();
public abstract double getPerimeter();
}
// 定义了一个Circle并重写了Geometry接口的所有抽象方法
class Circle implements Geometry {
private double radius;
Circle(double r){
radius = r;
}
@Override
public double getArea() {
return Math.PI * radius;
}
@Override
public double getPerimeter() {
return 2 * Math.PI;
}
}
// 定义了一个Rectangle类并重写了Geometry接口的所有抽象方法
class Rectangle implements Geometry {
private double width, height;
Rectangle(double w,double h){
width = w;
height = h;
}
@Override
public double getArea() {
return width * height;
}
@Override
public double getPerimeter() {
return 2 * (width + height);
}
}
在Java中允许同一个类实现多个接口,这就意味着此类必须实现接口中的所有方法
public class Geometry implements Interface1,Interface2,Interface3......{
......
}
接口的继承
与类的继承相似,接口也可以继承接口但也只能继承接口
public interface Interface1 extends Iterface2{
......
}
三、二者异同
| 抽象类 | 接口 | |
|---|---|---|
| 关键字 | abstract class | interface |
| 含有方法 | 抽象方法(可以没有)和普通方法(可以没有) | 只有public 的抽象方法 |
| 继承(实现) | 被类继承 | 被类或接口继承 |
| 多重继承 | 不支持 | 可以继承父接口 |
| 内部字段 | 没有具体限制 | 变量必须为public final static型的 |



