[Java学习]面向对象-抽象类;接口

抽象类

用途

借助抽象类可以实现代码的重用。

特点

  • 抽象类无法实例化。但抽象类有构造方法,在子类创建对象时用。
  • 抽象类中可以定义抽象方法,不能有函数体。也只有抽象类中可以定义抽象方法。

为什么抽象类不能实例化却可以有构造方法

  • super用法
      super是指向父类的引用,如果构造方法没有显示地调用父类的构造方法,那么编译器会自动为它加上一个默认的super()方法调用。如果父类由没有默认的无参构造方法,编译器就会报错,super()语句必须是构造方法的第一个子句。
      定义子类的一个对象时,会先调用子类的构造函数,然后在调用父类的构造函数,如果父类函数足够多的话,会一直调用到最终的父类构造函数,函数调用时会使用栈空间,所以按照入栈的顺序,最先进入的是子类的构造函数,然后才是邻近的父类构造函数,最后再栈顶的是最终的父类构造函数,构造函数执行是则按照从栈顶到栈底的顺序依次执行.
    所以父类构造方法可以写一些所有子类共有的方法,使得在子类初始化时不用每个都写同样的方法

接口

用途

  • 接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。
  • 使项目分层,所有层都面向接口开发。(类实现接口、类调用接口)
  • 使代码间的耦合度降低。

特点

接口也是一种引用类型,可以等同看作类。
不同的,

  • 接口没有构造方法。
  • 接口中只能出现常量和抽象方法。接口中常量的public static final 可省略 ,抽象方法的public abstract 可省略。
  • 接口和接口之间可以多继承(extends)。一个类可以实现(implements)多个接口。
  • 一个非抽象的类实现接口,必须将接口中的所有方法实现(即覆盖)。

为什么接口中方法和常量默认是public的,为什么接口中没有变量只有常量

  1. 接口是一种约束和规范,是一种更加更高级的抽象类,抽象类的方法必须是公开的,因为要给别的类去实现。此外由于子类的访问级别不能低于父类,所以子类在实现接口重写方法时的修饰符必须是public。
  2. 接口中没有变量的原因;既然是约束和规范,怎么能够定义一个大家都可以改的东呢。

接口与抽象类对比

  • 语法的区别:
    • 关于一些有的没的
      1. 抽象类可以有构造方法,接口中不能有构造方法。
      2. 抽象类中可以有普通成员变量,接口中没有普通成员变量
      3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
      4. 抽象类中可以包含静态方法,接口中不能包含静态方法
    • 关于访问域
      5. 抽象类中的抽象方法的访问类型可以是public,protected,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
      6. 抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
    • 关于继承
      7. 一个类可以实现多个接口,但只能继承一个抽象类。
  • 用途上的区别
    • 借助抽象类可以实现代码的重用,接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。

参考链接

https://blog.csdn.net/qq_41933748/article/details/82670072
https://www.cnblogs.com/yyy6/p/8976584.html

原文地址:https://www.cnblogs.com/coding-gaga/p/10463045.html