Java里abstract class和interface的区别

来源:互联网 发布:人工智能产业园 编辑:程序博客网 时间:2024/04/30 19:22

最近写了挺多Java基础方面的东西,有些可能是挺简单的或者网上已经写烂了,但是对自己来说,这些知识可能只是知道或者模模糊糊懂,用的时候看一下某一点。还是没有对这些基础性的细节理解到位,所以最近开始有时间看书加上网上一些别人的讲述,再根据自己写的实例代码,就能印象深刻了,把自己归纳的写下来以后拾起也更方便。从基础开始,慢慢理解消化。


—————————————————————————————————————————————————————————

包含了抽象方法的一个类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成
abstract(抽象)。


“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。


下面是抽象方法声明时采用的语法:abstract void f();


1、抽象类中可以有方法定义,即可以有普通方法;也可以有普通的成员变量。


2、抽象类中也可以有static方法和成员,但是static方法不能为abstract的。


3、有抽象方法的类叫做抽象类,但是抽象类不一定要有抽象方法。


4、抽象类implements了接口,并不需要实现接口中的方法。


5、抽象类不能直接被实例化,即不能写成 TestAbstract ta = new TestAbstract();


6、抽象类中的abstract方法不能修饰为private的,但是非abstract方法可以。


7、抽象类中的变量默认是 friendly 型,即子类默认可以直接用。


—————————————————————————————————————————————————————————


接口:


1、接口中也可以有抽象方法并且实现接口的类也必须提供方法定义;除非实现接口的是抽象类。注明一点,其实接口里的普通方法也默认是抽象的。


2、接口中不能有static方法,但是可以有static成员变量。注意一点,接口中的static变量必须在声明时初始化,而且默认是final类型的。


3、接口中不能定义普通成员变量,也不能定义普通方法的方法体。


4、接口中的方法默认都是public abstract的,并且无法定义成private或者protected。


—————————————————————————————————————————————————————————


好了,这两个的特点我觉得没必要一个一个记,因为写代码时一些错误编译器会提醒的。


Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。


从语法上,abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。


一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。

不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。


本文部分转载于百度百科,自己做了另外一些补充:http://baike.baidu.com/view/993516.htm


原创粉丝点击