抽象类(abstract class)和接口(interface)的区别?

       抽象类(abstract class)含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

       抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。对类型进行隐藏,我们可以构造出一个固定的一组行为的抽象描述,一个行为可以有任意个可能的具体实现方式。这个抽象的描述就是抽象类。

        那这个抽象类的作用是什么呢?
        1、用于隐藏
         对类型进行隐藏,我们可以构造出一个固定的一组行为的抽象描述,一个行为可以有任意个可能的具体实现方式。这个抽象的描述就是抽象类。

        2、用于拓展对象的行为功能
         这一组任意个可能的具体实现表现为所有可能的子类,模块可以操作一个抽象类,由于模块依赖于一个固定的抽象类,那么他是不允许修改的。同时通过这个抽象类进行派生,拓展此模块的行为功能。

       接口(interface)泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

       那么接口的作用是什么呢?
        1、Java单继承的原因所以需要曲线救国 作为继承关系的一个补充。
        2、把程序模块进行固化的契约,降低偶合。把若干功能拆分出来,按照契约来进行实现和依赖。(依赖倒置原则)
        3、定义接口有利于代码的规范。(接口分离原则)

       联系面向的三大特征,五大原则,去理解这些,其实会更加深层次的领悟。

下面比较一下两者的语法区别:

      1.抽象类可以有构造方法,接口中不能有构造方法。

      2.抽象类中可以有普通成员变量,接口中没有普通成员变量

      3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

      4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

      5. 抽象类中可以包含静态方法,接口中不能包含静态方法

      6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

相同:

  1. 都不能创建对象
  2. 都可以定义抽象方法,并且一定要在子类中重写

不同:

  1. 关键字不同 abstract  interface
  2. 抽象方法中既可以有抽象的方法也可以有普通的方法
  3. 接口中中所有的方法都是抽象方法
  4. 抽象类的方法可以任意权限,接口中方法只能是public
  5. 抽象类只能单继承,接口可以多实现

JDK8以后接口是可以定义实现方法,必须需要default修饰符修饰

package com.company.java.oop.cls;

interface IB {
    default void doMethod1() {
        System.out.println("IB");
    }

    default void doMethod2() {
        System.out.println("domethod2");
    }
}

class B implements IB {}


public class TestInterface {
    public static void main(String[] args) {
        IB a2 = new B();

    }
}

 

 

 

 

参考:
https://blog.csdn.net/aptentity/article/details/68942916

https://www.jianshu.com/p/c4f023d02f0c

https://www.cnblogs.com/mengbin0546/p/12004708.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值