抽象类与接口
来源:互联网 发布:java string 内部排序 编辑:程序博客网 时间:2024/06/05 07:24
1.抽象类与接口
1.1抽象类和抽象方法:
Abstract关键字是抽象修饰符,只能用户修饰类和方法。该关键字用来表明所定义的类或方法是为实现的。
一个抽象类的定义,是通过使用关键字abstract,放置在关键字class之前来定义的,如下所示:
abstract class 类名
{
·····; //类体
}
抽象方法的定义,如下代码片段所示:
abstract class 类名
{
abstract [public]返回类型方法名(参数类表);
}
归纳总结后,使用抽象类和抽象方法要注意一下4点:
(1)abstract抽象类不能创建对象,必须通过子类继承后,由子类创建对象;
(2)abstract抽象方法只允许方法声明,不允许实现;
(3)abstract抽象类中,可以没有抽象方法,也可以有一个或多个抽象方法;
(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单继承的不足。
- 抽象类与接口
- 接口与抽象类
- 抽象类与接口
- 抽象类与接口
- 抽象类与接口
- 抽象类与接口
- 接口与抽象类
- 抽象类与接口
- 接口与抽象类
- 抽象类与接口
- 抽象类与接口
- 抽象类与接口
- 接口与抽象类
- 抽象类与接口
- 抽象类与接口
- 抽象类与接口
- 接口与抽象类
- 接口与抽象类
- This and That (or This, But Not That!)
- filter对页面内容敏感词进行替换处理
- php学习误区:不要盲目的去读程序
- J2me的异常处理和多线程
- Jquery经典代码
- 抽象类与接口
- 内部类和匿名类
- 面试问题之 按单词反转字符串
- eclipse的graphical layout窗口显示问题
- WIN7如何更改计算机名称
- newlisp debugger
- cmake语法及简单的cmake例子
- 传话游戏
- 第四次作业