您的位置:首页 > 其它

抽象类和接口以及二者的区别

2017-07-11 11:19 302 查看

1.抽象类

简单的说,抽象类就是一个特殊的父类。特殊是因为,它包含abstract方法,同时,包含抽象方法的类在声明时也要加上abstract修饰。记住,抽象类是为了继承而存在的。它有几个特点:

(1)抽象方法必须为public或者protected,不能是private

(2) 抽象类不能用来创建对象(无法实例化),因为它包含抽象方法,一般抽象方法是没有具体实现的,后面会说为什么这样做。

(3) 抽象类的子类必须实现父类声明的抽象方法,如果没实现,则字子类也必须声明为abstract类。

到这里,可能大家会觉得为什么要有抽象类啊,貌似一般的类就够了啊!其实不然,很多时候确实有些父类中的方法确实没有必要写,因为各个子类中的这个方法肯定会有不同,所以没有必要再父类里写。

之前看到一个经典的例子:

假如我们要实现一个俄罗斯方块游戏,要考虑的其中一点就是,俄罗斯方块有六种,每一种方块都可以变换形态,我们会想到定义一个父类—方块类,里面写个方法transfer()然后六种具体的方块继承方块类,去重写transfer方法。这里面的问题是,六种具体方块的形态变换方法是不一样的,比如“田”子方块,它变来变去还是他,所以父类中我们无需写具体的实现,这是个空方法啊!所以我们将其声明为抽象方法,这样所有的具体方块类都得重写它,我们下次想增加更多的方块,只要继承它然后重写transfer方法就行。

这样说,是不是对抽象类有了点感悟呢?23333

2.接口

接口其实不用多说了,它更多的是一种行为的抽象。实现不同的接口相当于给java提供的变相的“多继承”。说明一点:接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。

3.抽象类和接口区别

从语法方面:

(1) 抽象类中成员变量可以任意类型,接口中只能是public static final的(接口中一般不写成员变量)

(2) 抽象类中可以有静态代码和静态方法,接口则不行

(3) 抽象类的继承是单一的,但一个类可以实现多个接口

(4) 抽象类可以提供方法的实现细节,接口只能是提供方法的声明

设计方面:

(1) 抽象类是对事物的抽象,对类抽象,而接口是对行为抽象。抽象类对整个实体进行描述,包括属性、方法,接口是对局部(行为)进行描述。比如:猫和狗是不同的动物,但是都有一个特点,会奔跑,我们可以把“奔跑”这种行为设计为接口。

(2) 对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  继承 对象