先上代码,后面对照代码分析
interface MyInterface{
//此处省略了 final 和 修饰符信息 完整的为public final int i=0;
//它是一个静态共有的常量
int i=0;
//此处省略了abstract修饰符 完整的为abstract void onItem();
//说明接口中的方法必须是抽象方法
void onItem();
}
/**
* 抽象类中的方法可以是抽象方法,也可以是非抽象方法
*/
abstract class AbstractClass{
//普通的类中变量 可以进行赋值改变
int j = 0;
boolean isLoading = false;
//普通类中的方法 可以提前做一些初始化操作 比如isLoading = true;
//那么实现它的子类将会共同拥有这个字段属性
void onItem2(){
isLoading = true;
}
//抽象方法
abstract void onItem3();
}
class MyClass implements MyInterface{
//必须实现抽象方法
@Override
public void onItem() {
}
}
class MyClass2 extends AbstractClass{
//必须实现抽象方法
@Override
void onItem3() {
j++;
}
}
/**
* 抽象子类可以不实现接口的抽象方法
*/
abstract class MyClass3 implements MyInterface{
/* @Override
public void onItem() {
}*/
}
/**
* 抽象子类可以不实现抽象父类的抽象方法
*/
abstract class MyClass4 extends AbstractClass{
/* @Override
void onItem3() {
}*/
}
区别:
- 抽象类的修饰符是abstract ,接口的修饰符是interface 。另外对于实现的子类来说,有extends 和 implements 之分
- 接口中的变量是public final 类型的共有常量,不能修改。抽象类中的变量可以进行修改赋值操作;。比如i,j
- 接口中的方法必须是抽象方法,而抽象类中的方法可以不是抽象方法,我们可以在非抽象方法中进行一些初始化操作,那么子类将会持有该属性,比如例子中的isLoading 字段
- 对于非抽象子类来说,必须实现或继承 接口或抽象类中的所有抽象方法 比如MyClass和MyClass2
- 对于抽象子类来说,可以不用实现或继承这些方法。比如MyClass3和MyClass4
相同点:
- 接口中的方法一定是抽象方法,抽象类的方法可以抽象方法,并且抽象方法一定是没有方法体的
- 抽象类和接口都不能被定义为私有的或final的,否则不能被继承或实现。
现实中的应用:
比如我们的BaseActivity与BaseFragment一般都是声明为抽象类,因为我们可以进行一些初始化操作,然后在基类中定义一个抽象方法,供子类调用。当所有的初始化操作都完成以后,子类就可以重写该方法进行其他操作了,比如网络请求等等。
对于接口的话一般用于数据回调,比如网络请求,异步加载等。适配器中adpter的事件点击等。