类和接口之间的异同是java基础中应该要学习并且理解的重要部分,以抽象类和一般接口为代表,对应自己理解水平,对此进行一些总结:

1、单继承与多继承

java中的类只能单继承(extends),即一个类只能有一个父类。但是接口可以多继承(implements),一个类可以继承多个接口。这一点在我看来,应该是两者的分工所致:类是对象的抽象,主要的是关于物种的基本属性,例如人的性别身高体重,虽然也会有一些行为方法,例如走路跑步,但是还是以基本属性的操作为主。而接口面对的主要是行为,将一类行为方法进行抽象提炼,变成一个具有抽象意义上的统一方法,具体是如何实现的就要看不同物种自己的实现了。

但是这样的话,为什么要多继承类?这个就要考虑到设计模式中的接口隔离原则,让每个接口里面的方法尽量少,建立单一接口,细化接口,这样对于继承实现此接口的类来说,依赖性大大降低,有效解耦。例如跑步和走路,可以抽象为一个带有move()方法的抽象接口,而吃饭和喝水,可以抽象为另一个带有eat()方法的抽象接口。可以说,有多种行为方法,就可以以此抽象出一定数量的抽象接口,同时,这些行为方法都是子类需要的,因此实现多个接口也是必要的。当然我并不是说这样设计最好,而是说可以通过这种方法有效解耦,具体的设计还需参考具体的情况。对于接口的多继承,理解如此。

2、构造器问题

前面讲到,抽象类更多的是对属性进行提炼抽象,接口是对行为方法进行抽象提炼。对于一般的类来说,构造方法是对属性的一种初始化,无参构造也是一种初始化方式。因而,抽象类可以有构造方法,但是鉴于抽象类不能被实例化,其方法只能让子类继承调用,如果构造方法也是抽象的,那就必须子类实现才能调用。而对于接口来说,其内主要是行为方法,即使有变量,在抽象类中也是默认为static final修饰的静态常量,作为方法中的参数之一被使用。因此,接口中并没有构造器,或者在某个层面来说,不需要构造器。

3、类和接口的其他问题

抽象类中对于一些方法,可以有默认的实现方式,子类也可以重写,实现自己的方法。但是注意,父类的静态方法子类是不能重写的,但是可以通过子类的实例化对象调用,也可以直接通过抽象类和子类的类名来调用。而接口内均为抽象方法,一般来说是必须子类实现才行,但在JDK1.8之后允许有默认的实现方法。