Java学习笔记——abstract class和interface的区别

时间:2021-12-28 13:57:55

          我的学习笔记,每天进步一点点!有需要的可以看看,不喜勿喷,欢迎指正~


  在面向对象中,对象是用类来描述的,但是并不是所有的类都是描述对象的。有的类是在一些类中抽象出来的概念,并不是具体的,也不能实例化出来。abstract class和interface是Java中对抽象概念进行定义的两种机制他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别。我们在使用的时候应该如何选取呢?通过一些对比了解下吧!

        定义

     抽象类:抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。在java中,通常在编程语句中用 abstract 修饰的类是抽象类,含有抽象方法的类称为抽象类,不能生成对象。抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。

            特点: 1.不能被实例化;     

      2.抽象类中可以不包括抽象方法(没什么意义了);    

      3.可以有普通成员变量、普通方法(包括构造方法);

      4.只要类中含有一个抽象方法(方法被abstract修饰),无论其他的方法是否是抽象的,该类都是抽象类;

      5.不能有抽象构造方法和抽象静态方法(抽象类中所有的抽象方法都是由子类实现,这两个方法子类不能继承,所以子类不能实现);

   一个测试小例子:
Java学习笔记——abstract class和interface的区别
    接口:接口和抽象类类似,只是接口中的所有方法都是抽象的,并不是从那些类抽象而来,而是自己设计出来,其他类实现继承他实现自己的功能。
   特点:1.方法全部是抽象的,默认是public abstract类型(写不写都行);
      2.接口中的所有成员变量默认为public static final类型(一般没什么用);

   一个测试小例子:
      Java学习笔记——abstract class和interface的区别
     

上面的介绍大概明白了抽象类和接口的一些区别了,下面从它们的设计理念来介绍。


设计理念

   1.抽象层次不同:抽象类是对类的抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

           2.跨领域不同:抽象类是“is-a”的设计,从子类中发现公共的,泛化成的一个类,子类完全包含父类的所有属性及行为,例如cat、dog都是动物,都有动物的一些属性,所以可以抽象为一个Animal类;接口洗“like-a”的设计,只要有共同的行为(只要能实现接口中的抽象方法的),不管它到底是什么,都可以,例如一个接口中是fly()方法,只要能实现它方法的都可以,飞机、鸟都可以。  

  3.设计层次不同:对于抽象类而言,它是自下而上来设计的,我们要先知道子类,然后从子类中提取他们相同的属性方法才能抽象出父类;而接口则不同,它是自上而下设计出来的,根本就不需要知道子类的存在,只需要定义一个方法即可。


小结

1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface;

2.抽象类中可以不包括抽象方法可以有普通成员变量、普通方法,接口方法全部是抽象的,默认是public abstract类型接口中的所有成员变量默认为public static final类型


遇到这样的问题,想想它们的区别,勤于总结,理解更透彻!