一、抽象类与接口的区别
abstract class | interface | |
实例化 | 不能实例化 | 不能实例化 |
类 | 抽象类是一种继承关系,一个类只能使用一次继承关系 | 一个类可以实现多个interface |
数据成员 | 抽象类可以有自己的数据成员 | 静态的,不能被修改的,即必须是static final修饰的成员,但是,一般不在这里定义 |
方法 | 可以存在私有的,非abstract的方法,且必须实现 | 不能有私有的方法,默认的是public abstract类型 |
变量 | 可以存在私有的,变量有默认的类型,其值可以在子类中重新定义,也可以重新赋值 | 不可以存在私有的,默认是public static final 类型,且必须给其初值,实现类中不能重新定义,不能改变其值 |
设计理念 | 表示的是“is--a.....”的关系 | 表示的是“like--a....的关系 |
实现 | 需要继承,要用extends关键字 | 需要实现,要用implements关键字 |
二、相同点
1.两者都是抽象类,都不能被实例化。
2.interface实现类以及abstract class的子类都必须啊要实现已经声明的抽象方法。
三、不同点
1.interface需要实现,要用implements,而abstract class需要继承,要用extends。
2.一个类可以实现多个interface,但只能继承一个abstract class。
3.interface强调特定功能的实现,而abstract class强调所属关系。
4.尽管interface实现类以及abstract class的子类都必须要实现相应的抽象方法,但是两者的实现形式有所不同。
interface中的每一个方法都是抽象方法,都只是声明的(declaration,没有方法体),实现类必须要实现。
abstract class的子类可以有选择的实现相应的抽象方法。
四、代码实现
public class AandItest extends AA implements BB,CC {
//一个类可以单继承,多实现(抽象类单继承,接口多实现)
public static void main(String[] args) {
AandItest t=new AandItest();
t.show();
}
@Override
public void move() {
}
@Override
public void test() {
}
@Override//如果子类是非抽象类,则抽象类父类的抽象方法必须重写
void say() {
}
}
abstract class AA{
int a;
public void show() {//非抽象方法在子类中可以选择性的实现
}
abstract void say();
}
interface BB{
// int B=5;
//不可以存在私有的,默认是public static final 类型,
//且必须给其初值,实现类中不能重新定义,不能改变其值
public static final int B = 4;
void test();//不能有私有的方法,默认的是public abstract类型
}
interface CC{
void move();//不能有私有的方法,默认的是public abstract类型
}