“简单不先于复杂,而是在复杂之后.” —— Alan Perlis
接口
首先,理解多继承,什么是多继承----多继承就是可以继承多个父类,但是Java不能实现多继承,所以 这里就要用到接口了.
接口是一种规范,是一种规则,它只给出了方法的样子,规定你要实现哪些方法,而不给出方法的实现,让接口的实现类去实现这些方法,但是对于不同的实现类来说,对方法的实现可以完全不同。
• 接口的实现类如果实现了某一个接口,那么必须实现接口中定义的所有的待实现的方法。如果你不想要实现方法,那么实现类必须定义为抽象类,不想实现的方法必须定义为抽象方法。
•接口中定义的属性和方法的默认访问级别都是public,所以方法肯定不被private所修饰,所有的方法前都默认包含了abstract ,表明它是一个抽象方法,但是可以省略,而且默认是省略的
• 接口可以看成是一个抽干了的抽象类,它里面所有的方法都是抽象的,都是不能给出任何实现部分的
• 因为接口可以看成是一种特殊的“抽象类”,而且因为抽象类可以继承别的类,所以接口也可以继承接口,也只可以继承接口。但是接口不可以实现接口。
• 一个类可以实现多个接口使用关键字implements ,一个接口可以继承多个接口使用关键字extends,一个类可以同时继承一个别的类,而且实现一个或多个接口,但是关键字extends要在前。
注意事项:
1.接口可以看成是特殊抽象类,提供方法原型,没有具体表现,即方法具体实施
2.子类必须提供父类中抽象方法的实现方式。
3.接口中只能包含抽象方法和常量,不能有,变量,初始化块和构造函数
接口的声明
【修饰符】interface 接口名【extends】父类接口名 {
常量;
方法:抽象
}
注意事项:与Java的类文件一样,接口文件的文件名必须与接口名相同
使用接口:
接口不能单独实例化,要想实例化接口,必须接口的实现类来完成。接口的实现类,必须全部实现接口中所有方法。
【修饰符】 class <类名> 【extends 父类名】【implements 接口列表】{
}
不严密理解为这样: 接口是一个类,里面有常量和方法,然后再一个类中调用,重写接口中的方法,但是这个调用不是与以往调用一样,是有区别的,要用implements这个关键字来操作。调用完后实例化
抽象类和方法
如果一个方法中存在不可预知的方法实现,那么这个方法所在的类就应该声明为抽象类
• 如果在两个类当中有同名的方法,按照正常道理来说,应该提取到父类里,但是这个两个方法又有明显的方法实现上的不同,那么在父类里的方法,就应该定义成为抽象,抽象方法,只给出了方法的样子,而不给出方法的具体实现,具体实现由继承这个类的具体的子类去实现
• 抽象方法,必须在抽象类里,抽象类里不一定有抽象方法
• 没有抽象方法的抽象类的存在也是有意义的。这决定了这个类是不能被直接实例化的,他的作用基本上是作为一个“框框”存在的。-------------种猪
• 重写的前提是--- 父类里知道该方法如何去实现,子类不打算走原路,所以覆盖父类里的实现,
• 父类不给出实现,也不知道该如何实现,由具体的子类自己决定如何实现,但是给出一个定义,要求子类必须实现。
接口和抽象类的区别
接口是用来被实现的(implements),而抽象类是用类被继承的 (extends)
• 接口可以继承别的多个接口,组成一个新的接口
• 抽象类可以继承一个别的类,或实现一个或多个接口
• 接口是一个100%的抽象类,里面的方法没有任何一个有任何的实现
• 抽象类可以包含非抽象的方法,也就是说可以给出某一些方法的实现。
• 接口一般处于代码的最底层,作出一些规定,而接口之上一层抽象类层,对接口进行第一次的实现,把不可能一次完成的方法,交由自己的子类来实现。
• 抽象类可以有构造方法,而接口不可以有构造方法。 接口中定义的变量只能为公有的,静态的,终态的,而且会默认增加。
Java 接口和Java 抽象类对比
1 )Java 接口和 Java 抽象类最大的一个区别,就在于 Java 抽象类可以提供某些方法的部分实现,而 Java 接口不可以,这大概就是 Java 抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而 Java 接口做不到这一点,如果向一个 Java 接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java 接口的缺点。
2 )一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于 Java 语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java 接口的优势就出来了,任何一个实现了一个 Java 接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个 Java 接口,从而这个类就有了多种类型。
3 )从第 2 点不难看出,Java 接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。
4 )结合 1、2 点中抽象类和Java 接口的各自优势,具经典的设计模式就出来了:声明类型的工作仍然由Java 接口承担,但是同时给出一个Java 抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个 Java 接口,也可以选择继承这个抽象类,也就是说在层次结构中,Java 接口在最上面,然后紧跟着抽象类,哈,这下两个的最大优点都能发挥到极至了。这个模式就是“缺省适配模式”。
在Java 语言 API 中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。 Java 接口和Java抽象类的存在就是为了用于具体类的实现和继承的,如果你准备写一个具体类去继承另一个具体类的话,那你的设计就有很大问题了。Java 抽象类就是为了继承而存在的,它的抽象方法就是为了强制子类必须去实现的。