Java Interfaces 与抽象类

一个java接口指定了一组方法,任何实现该接口的类必须有。接口本身就是一种类型,它允许你用接口类型的方法参数的定义方法,然后将代码应用于实现接口的所有类。查看接口的一种方法是抽象类。然而,正如你将看到的,一个接口允许你做的不止一个抽象类能做的。接口是java接近实现多重继承的方法。java中不能有多个基类,但接口允许你实现类似多个基类的能力。

本章的第二个主要主题是内部类。内部类是简单的在另一个类中定义的类。因为内部类是类的本地包含它们,它们可以帮助使一个类自足允许您作出帮助班级内部班级。

 

抽象类总结规定

  • 1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
  • 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  • 3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
  • 4. 构造方法,类方法(用static修饰的方法)不能声明为抽象方法。
  • 5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

 

(五)interface总结

1.接口以interface开始,并包含一组默认为是public的抽象方法,接口可以包含变量,默认为static final的,且必须给其初值,所以实

现类中不能重新定义,也不能改变其值;实现接口必须实现其中的所有方法,接口中不能有实现方法,所有的成员方法都是abstract的。
2.如果一个类没有实现任何接口方法,则它是抽象类,并且必须以关键字abstract声明该类;实现一个接口如同与编译器达成一个协议,

“我将声明该接口制定的所有方法”。

 

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

2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据

成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是”is-a”关系,

interface表示的是”like-a”关系。
4.接口一般用于在抽象类中没有可供继承的默认实现时(即没有实例变量和默认方法实现)代替该类。

5.abstract class是另一种契约形式,是设计对实现的要求;而接口是服务器对客户端的要求。

6.abstract class是一个基类,不能被实例化;接口是个声明,每个对应接口的类都要实现方法。
7. 一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法

即可,这是抽象类的一个优点

8. 如果一个接口中定义的方法名改变了,那么所有实现此接口的子类显然将无法通过编译,因为它们所实现的方法名已经不存在了,这是

接口的一个缺点;而抽象类中如果有个非抽象方法改了,就不存在这个问题,只是为子类添加了一个新的方法。
9. 看前面两点,似乎抽象类要比接口有着更多的优点,但它却有着一个难以弥补的缺点:就是一个子类只能有一个父类。A extends B 。

这样A就拥有了B的所有方法和功能,但当A还想拥有C的功能的时候。就不能通过 A extends C 来实现,而需要走一些弯路。目前系统架构

的趋势就是由针对抽象(借口,抽象类)而不是具体编程,并且将功能尽可能的细分。这就需要通过实现多个接口的方式来实现,显然,抽

象类无法提供这样的功能。从系统重构的角度来说,一个具体类抽象出接口是十分方便的。只需要写一个接口,里面定义具体类的所有方法,

然后在为这个具体类implement这个接口就可以了。而抽象类就要复杂的多,比如说 B extends A , C extends B 如果想要为c抽象出一个抽象

类D的话,就需要找到它的最顶层A来从头做起,因为无法做到C extends D

 

留下评论