java 抽象类 接口

来源:互联网 发布:java 导出word 加水印 编辑:程序博客网 时间:2024/06/12 19:16

抽象类与接口

接口


Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

 

接口本身不是类,它四一种比抽象类更加抽象的“类”,

接口中可以含有变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public staticfinal变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是publicabstract方法(用其他关键字,比如private、protected、static、final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

 

接口的特点:

1Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)

2Java接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化

3Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法

4、接口中没有构造方法,不能被实例化

5、一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口

6Java接口必须通过类来实现它的抽象方法

7、当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类

8、不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例

9、一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.

 

接口的用处:

简化代码

拓展程序,应对需求变化



抽象类

抽象类:使用了关键词abstract声明的类叫作“抽象类”。如果这个类包含了一个或多个抽象方法,类就必须指定成abstract。抽象方法属于一个不完整的方法,只有声明,没有方法主体。

 

        在面向对象的概念中,我们知道所有的对象都是通过类来描述的,但是反过来却不是这样,如果一个类没有包含足够的信息来描述一个具体的对象,这样的类就是抽象类。抽象类旺旺用来表征我们在对问题的分析,设计得出的抽象概念,是对一系列看上去不同,但是本质上缺相同的具体概念的抽象。(举例:一个画图类,GeometricObjectCircleRectangle的父类,G有两个方法getArea()getPerimeter()方法,但是这些方法不能在G类中实现,因为他们的实现取决于对象的具体类型。这样的方法称为抽象方法。)

 

在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-ClosedPrinciple),抽象类是其中的关键所在

 

如果从一个抽象类继承,而且想要生成新的对象,就要为基础类中的所有抽象方法提供方法定义。如果不这样做,的话,衍生类也会是抽象的,而且编译器会强迫我们用bastract来标志那个累的抽象本质。

 

抽象类不能创建对象。

 

即使不包括任何abstract方法,亦可将一个类声明成“抽象类”。如果一个类没必要拥有任何抽象方法,而且我们想禁止那个类的所有实例,这种能力就会显得非常有用。

 

可以看出,抽象类就是为了继承而存在,如果定义了一个抽象类,却不去继承它,就等于无故创建了这个抽象类,也就是无意义的抽象类。

对于一个父类,如果某个方法实现出来没有任何意义或者不能够被实现,那么就可以将这个放啊声明为abstract,此时这个类也就成为了abstract类了。

 

抽象类与普通类:

相同点:

抽象方法与普通类一样也可以拥有成员变量和普通的成员方法。

异同点:

抽象方法必须被指定为public或者protected,不能被指定为privatedprivate不能被子类继承,也就不能被实现)

抽象类不能创建对象。

普通类继承抽象类,则必须实现父类的所有抽象方法,否则,同样是抽象类。

 

abstract不能与staticprivate final native同用来修饰一个方法;abstract不能和final同用来修饰类。

抽象类的构造方法定义为protected,因为他只被子类使用。


抽象类和接口

 

        

抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。

 

接口更多的是在系统框架设计方法发挥作用,主要定义模块之间的通信,而抽象类在代码实现方面发挥作用,可以实现代码的重用

 

特别是对于公用的实现代码,抽象类有它的优点。抽象类能够保证实现的层次关系,避免代码重复。然而,即使在使用抽象类的场合,也不要忽视通过接口定义行为模型的原则。从实践的角度来看,如果依赖于抽象类来定义行为,往往导致过于复杂的继承关系,而通过接口定义行为能 够更有效地分离行为与实现,为代码的维护和修改带来方便。

 

 

参数

抽象类

接口

默认的方法实现

它可以有默认的方法实现

接口完全是抽象的。它根本不存在方法的实现

实现

子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。

子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现

构造器

抽象类可以有构造器

接口不能有构造器

与正常Java类的区别

除了你不能实例化抽象类之外,它和普通Java类没有任何区别

接口是完全不同的类型

访问修饰符

抽象方法可以有publicprotecteddefault这些修饰符

接口方法默认修饰符是public。你不可以使用其它修饰符。

main方法

抽象方法可以有main方法并且我们可以运行它

接口没有main方法,因此我们不能运行它。

多继承

抽象方法可以继承一个类和实现多个接口

接口只可以继承一个或多个其它接口

速度

它比接口速度要快

接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。

添加新方法

如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。

如果你往接口中添加方法,那么你必须改变实现该接口的类。

 

 

一:语法层次

抽象类方式中,抽象类可以拥有任意范围的成员数据,同时也可以拥有自己的非抽象方法,但是接口方式中,它仅能够有静态、不能修改的成员数据(但是我们一般是不会在接口中使用成员数据),同时它所有的方法都必须是抽象的。在某种程度上来说,接口是抽象类的特殊化。

 

 对子类而言,它只能继承一个抽象类(这是java为了数据安全而考虑的),但是却可以实现多个接口。

 

接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

 

二:设计层次

 

抽象层次不同。

抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。接口是对动作的抽象,抽象类是对根源的抽象。

 

 

 跨域不同。

抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同的类。

我们知道抽象类是从子类中发现公共部分,然后泛化成抽象类,子类继承该父类即可,但是接口不同。实现它的子类可以不存在任何关系,共同之处。

抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已。

 

 设计层次不同。

对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。

 

总结几句话来说:

1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

2、抽象类要被子类继承,接口要被类实现。

3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现

4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

6、抽象方法只能申明,不能实现。abstractvoid abc();不能写成abstract void abc(){}

7、抽象类里可以没有抽象方法

8、如果一个类里有抽象方法,那么这个类只能是抽象类

9、抽象方法要被实现,所以不能是静态的,也不能是私有的。

10、接口可继承接口,并可多继承接口,但类只能单根继承。

 

什么时候使用抽象类和接口

  • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
  • 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
  • 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

 


0 0