抽象类和接口

阅读说明

如有任何疑问或者错误,可以博文私信作者,或添加微信 YY20203_24 备注 文章错误

抛出问题

常见的面试问法
面试常见问题,抽象类的接口的区别

回想:
1、一个是类(提供由子类实现的抽象方法),一个是接口(提供由其他类实现的抽象方法),本质不同,但可以理解接口为特殊的抽象类
2、都可含有待实现的方法(非必须),但是抽象类可以含非抽象方法(普通方法、属性),接口中的方法都是待实现的,但不需要抽象abstract修饰,即含有抽象方法的类一定是抽象类,抽象类不一定含有抽象方法
3、关键字不同,使用abstract修饰的类即为抽象类,使用interface修饰的为接口
4、……
一时能想到的点,肯定不全面或者get不到面试官想要你说出的点,下面我们再来学习一遍
1691648763981.jpg

基础介绍

相关概念

抽象类:
包含一个或多个抽象方法的类本身必须被声明为抽象的
接口:
接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义

基本使用

抽象类的基本使用

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、extendinterface、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基类),才优先考虑抽象类,否则一律优先考虑接口,接口的扩展性更好

总结

内容不多,主要是整理出一个思路,方便大家面试和回忆此处的知识点

思绪图

题外话

关注我的工作外生活
公众号搜索 杨方刚的生活录
摸鱼小程序搜索 魔芋办公室

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值