抽象类与接口

来源:互联网 发布:java string 内部排序 编辑:程序博客网 时间:2024/06/05 07:24

1.抽象类与接口

1.1抽象类和抽象方法:

   Abstract关键字是抽象修饰符,只能用户修饰类和方法。该关键字用来表明所定义的类或方法是为实现的。

   一个抽象类的定义,是通过使用关键字abstract,放置在关键字class之前来定义的,如下所示:

   abstract  class 类名

{

·····;  //类体

}

   抽象方法的定义,如下代码片段所示:

   abstract  class 类名

{

 abstract [public]返回类型方法名(参数类表);

}

归纳总结后,使用抽象类和抽象方法要注意一下4点:

1abstract抽象类不能创建对象,必须通过子类继承后,由子类创建对象;

2abstract抽象方法只允许方法声明,不允许实现;

3abstract抽象类中,可以没有抽象方法,也可以有一个或多个抽象方法;

4)若一个类中含有abstract抽象方法,那么这个类必须被声明为抽象类。

抽象方法和抽象类的规则如下:

(1)抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。

(2)抽象类不能实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。即使抽象类里不包含抽象方法,这个抽象类也不能创建实例。

(3) 抽象类可以包含field、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类、枚举类6中成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。

(4)含有抽象方法的类(包括直接定义了一个抽象方法;继承了一个抽象父类,但没有完全实现父类包含的抽象方法,以及实现了一个接口,但没有完全实现接口包含的抽象方法3种情况)只能被定义成抽象类。

    abstract不能用于修饰Field,不能用于修饰局部变量,即没有抽象变量、没有抽象Field等说法;abstract也不能用于修饰构造器,没有抽象构造器,抽象类里定义的构造器只能是普通构造器。

    当使用abstract修饰类时,表明这个类只能被继承;当使用abstract修饰方法时,表明这个方法必须由子类提供实现(即重写)。而final修饰的类不能被继承,final修饰的方法不能被重写。因此final和abstract永远不能同时使用。而且static和abstract不能同时修饰使用某个方法,即没有所谓的类抽象方法。

1.2接口

java语言中,一个类只能继承自一个父类;但是一个类可以实现多个接口,因此使用接口主要是为了实现类的多重继承功能。

接口的声明需要使用interface关键字来实现。接口声明的语法格式,如下代码片段所示。

[public] interface 接口名 [extends]父类接口]

{

  //接口体

//常量声明

[public] [static]  [final] 常量类型   常量名常量值;

 

//抽象方法声明

[public] [abstract] 返回类型方法名(参数类表)   [throw异常列表]

}

从接口的声明可以看出,在定义接口类的时候需要注意以下几点:

1)与定义类相似,定义的接口类也具有继承性。定义一个接口的时候,可以通过extends关键字来让定义的接口继承自一个已经存在的父类接口。

2)接口体由两部分组成,一部分是对接口属性的声明,另一部分是对接口中方法的声明。接口中的属性都是用final修饰的常量;而接口中的方法都是用abstract修饰的抽象方法,在接口类中,只能给出这些抽象方法的方法名、返回值、和参数列表,而不能定义方法体;

    对于接口中定义的常量Field,它们是接口相关的,而且它们只能是常量,因此在接口中定义field时,不管是否使用public static final修饰符,系统会自动为这些Filed增加这三个修饰符来修饰。而且,接口里没有构造器和初始化块;对于接口中定义的方法而言,不管定义接口里方法时是否使用public abstract修饰符,接口里的方法总是使用public abstract来修饰。

    接口里定义的内部类、接口、枚举类默认都采用publicstatic两个修饰符,不管定义时是否指定这两个修饰符,系统都会自动使用public static对他们进行修饰。

(3)根据编程的习惯,抽象类的名称一般都以大写字母"I"开头。

1.3共同点和区别

共同点:

(1) 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。

(2)接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。

区别:

(1)接口里只能包含抽象方法,不包含已经提供实现的方法;抽象类则完全可以包含普通方法。

(2)接口里不能定义静态方法;抽象类里可以定义静态方法。

(3)接口里只能定义静态常量Field,不能定义普通Field;抽象类里既可以定义静态常量Field,也可以定义普通Field。

(4)接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。

(5)接口里不能包含初始化块;但抽象类则完全可以包含初始化块。

(6)一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。


原创粉丝点击