阅读说明
如有任何疑问或者错误,可以博文私信作者,或添加微信 YY20203_24 备注 文章错误
抛出问题
常见的面试问法
面试常见问题,抽象类的接口的区别
回想:
1、一个是类(提供由子类实现的抽象方法),一个是接口(提供由其他类实现的抽象方法),本质不同,但可以理解接口为特殊的抽象类
2、都可含有待实现的方法(非必须),但是抽象类可以含非抽象方法(普通方法、属性),接口中的方法都是待实现的,但不需要抽象abstract修饰,即含有抽象方法的类一定是抽象类,抽象类不一定含有抽象方法
3、关键字不同,使用abstract修饰的类即为抽象类,使用interface修饰的为接口
4、……
一时能想到的点,肯定不全面或者get不到面试官想要你说出的点,下面我们再来学习一遍
基础介绍
相关概念
抽象类:
包含一个或多个抽象方法的类本身必须被声明为抽象的
接口:
接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义
基本使用
抽象类的基本使用
public abstract class TestAbstract {
public String getTestString() {
return testString;
}
public void setTestString(String testString) {
this.testString = testString;
}
private String testString;
abstract void testFun();
}
public class Test extends TestAbstract {
@Override
void testFun() {
}
}
接口的基本使用
public interface TestInterface {
void testFun();
}
public class Test1 implements TestInterface {
@Override
public void testFun() {
}
}
各自特点
抽象类的特点
理解下这句话(书中《Java核心技术 卷1 基础知识 原书第9版-》引入抽象类之前的)
如果自下而上在类的继承层次结构中上移,位于上层的类更具有通用性,甚至可能更加抽象,祖先类更加通用,人们只将它作为派生其他类的基类,而不作为想使用的特定的实例类
1、可以不含抽象方法,可以含有具体的数据和方法,子类需继承对应的抽象方法,
2、不能创建实例,但是可以引用子类(非抽象)的对象(实例)
3、单继承
接口的特点
1、不含抽象方法,所有方法都需要子类需实现
2、不能创建实例,但是可以引用实现了接口的类对象(实例)
3、多实现
深入学习
抽象类与接口的比较
抽象类 | 接口 | |
---|---|---|
关键字及使用 | abstract、extend | interface、implements |
变量及方法 | 跟普通类一样 、可以有各种变量及方法、抽象方法可有可无 | 变量和方法默认为public修饰、也可为空 |
构造器 | 有 | 无 |
实例对象 | 不可创建 | 不可创建 |
引用方式 | 可引用继承抽象类的非抽象类实例 | 可引用实现了接口的类实例 |
举例说明
项目开发中Activity基类(抽象类)
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
……
// 初始化加载成功界面
initView(childStateView);
// 初始化加载数据
initData();
}
// 添加标题 父类提供
public String getTextTitle() {
return "";
}
/**
* 通知子类加载成功布局
*
* @return
*/
protected abstract int getContentLayout();
/**
* 通知子类初始化布局
*/
protected abstract void initView(View flcontainer);
/**
* 通知子类初始化数据
*
* @return
*/
protected abstract void initData();
}
这样开发的好处:
定义规范,强制子类符合标准;如果有调用抽象方法,也会制定执行顺序的规则(毕竟实际开发过程中是不同成员合作进行开发的,使代码更整洁、更好维护、更好理解)
类似的:适配器基类 BaseAdapter Fragement基类 BaseFragement 网络回调基类 BaseRespose 等
项目开发中网络请求(接口)
public interface OnSuccessCallback<Res extends BaseRespose> {
void onResultSuccess(BaseRequest request, Res response);
}
// 分割线 ------------页面使用
public class XxxActivity extends BaseActivity implements OnSuccessCallback<XxxResponse> {
}
这样开发的好处:
需要的时候单独实现,加到抽象类中则所有的代码都会实现(变得冗余),也不能写成单独的抽象类,java只能单继承
类似的:定位、支付等
总结
- 抽象层次不同
- 抽象类是对类抽象,而接口是对行为的抽象
- 抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部行为进行抽象
- 跨域不同
- 抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同的类
- 抽象类所体现的是一种继承关系,考虑的是子类与父类本质 ,xxx是不是Axxx同一类的关系
- 而接口并不要求实现的类与接口是同一本质,它们之间只存在xxx有没有这个能力Ixxx的关系
- 设计层次不同
- 抽象类是自下而上的设计,在子类中重复出现的工作,抽象到抽象类中
- 接口是自上而下,定义行为和规范
拓展
面向接口编程
使用抽象类还是接口,归根接地还是尽可能地职责分离,把业务抽象,也就是“面向接口编程”
即需要模块之间依赖时,最好都只依赖对方给的抽象接口,而不是具体实现,按照开发来说就是参数尽量是抽象类或者接口,扩展性强
此处涉及到 依赖倒置原则 ,后面详细梳理
框架中如何选择
能明确知道变量及需要实现方法的,且是一个标准的,(比如Activity、Fragment基类),才优先考虑抽象类,否则一律优先考虑接口,接口的扩展性更好
总结
内容不多,主要是整理出一个思路,方便大家面试和回忆此处的知识点
思绪图
题外话
关注我的工作外生活
公众号搜索 杨方刚的生活录
摸鱼小程序搜索 魔芋办公室