接口、抽象类、继承、实现的定义及它们之间的关系

  • Post author:
  • Post category:其他


一、接口、抽象类、继承、实现定义

接口
  • 接口是一种比抽象类更加抽象的“类”。这里给“类”加引号是我找不到更好的词来表示,但是我们要明确一点就是,接口本身就不是类,从我们不能实例化一个接口就可以看出。如new Runnable();肯定是错误的,我们只能new它的实现类。
抽象类
  • 在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。
  • 抽象类通常代表一个抽象概念,他提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的。所以,在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点均应当是抽象类。
  • 这里写图片描述
继承
  • 就是扩展已有类的功能,在继承中分为子类和父类,父类有时候也称为超类(super class),子类有时候称为派生类。

    继承的基本语法为:class子类 extends 父类 {}

    继承的限制:1)在Java中不允许多重继承,一个子类只能继承一个父类,不能继承多个父类;2)java中允许多层继承;3)在继承中子类不能访问父类中的私有成员,只能继承公共操作。但是私有成员可以通过公共方法得到访问。

实现
  • 类实现接口,本质上与类继承类相似,区别在于“类最多只能继承一个类,即单继承,而一个类却可以同时实现多个接口”,多个接口用逗号隔开即可。实现类需要覆盖所有接口中的所有抽象方法,否则该类也必须声明为抽象类。

二、接口是否可继承接口?

  • 接口是可以继承接口的。比如在项目中需要N个接口,他们都要实现一些常用的功能,这样你就可以只写一个接口,然后让你的其他接口都这个接口。通常IBaseDao就是这样的。定义一个泛型接口,然后让其他接口去继承它并定义各自的泛型类,这样就方便很多。

三、抽象类是否可实现(implements)接口?

  • 抽象类可以实现接口

四、抽象类是否可继承实体类(concrete class)?

  • 抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。答案很明确,可以继承。其实从Object就是个实体类,java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的。
class A{}
abstract class B extends A{}
  • 结果完全正常,编译通过。似乎和“实体类必须有明确的构造函数”完全没有关系。

    这个问题涉及到两个个基础知识:

    1.

    所有的class都必须有一个构造方法,如果你没有在代码里声明构造方法,系统会自动给你生成一个公有无参的构造方法。而只要你自己声明了一个构造方法,无论有参无参,私有公有,系统就不再帮你生成默认无参构造器了。

    2.

    所有的子类构造器都要求在第一行代码中调用父类构造器,如果不写,系统默认去调用父类的无参构造器。

    所以,如果把系统默认配给的方法也算进去,class A{}的代码实际上是
class A{
public A(){}
}

B继承 A 的时候,则是

abstract class B extends A{
public B(){
super();
}
}



版权声明:本文为snail_xinl原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。