> > 6.6.2接口的定义
2014-12-10 22:53
148 查看
> > 6.6.2接口的定义
和类定义不同,定义接口不再使用class关键字,而是使用interface关键字。接口定义的基本语法如下:
[修饰符]interface接口名 extends父接口1,父接口2......
{
零个到多个常量定义
零个到多个抽象方法定义...
}
上面语法的详细说明如下:
》修饰符可以是public或者省略,如果省略了public访问控制符,则默认采用包权限访问控制符,即只有在相同包结构下才可以访问该接口。
》接口名应与类名采用相同的命名规则,即如果仅从语法角度来看,接口名只要是合法的标识符即可;如果要遵守Java可读性规范,则接口名应由多个有意义的单词连缀而言,每个单词首字母大写,单词与单词之间无需任何分隔符。
》一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类
由于接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义。接口里可以包含属性(只能是常量)、方法(只能是抽象实例方法)、内部类(包括内部接口)和枚举类定义。
对比接口和类的定义方式,不难发现接口的成员比类里的成员少了2种,而且接口里的属性只能是常量,接口里的方法只能是抽象方法。
前面已经说过了,接口里定义的是多个类共同的公共行为规范,因此接口里所有成员,包括常量、方法、内部类和枚举类都是public访问权限。定义接口成员时,可以省略访问控制修饰符,如果指定访问控制修饰符,只能使用public访问控制修饰符。
对于接口里定义的常量属性而言,它们是接口相关的,而且它们只能是常量,因此系统会自动为这些属性增加static和final两个修饰符。也就是说,在接口中定义属性时,不管是否使用public static final修饰符,接口里的属性总将使用这三个修饰符来修饰。而且,接口里没有构造器和初始化块,因此接口里定义的属性只能在定义时指定默认值。
接口里定义属性采用如下两行代码的结果完全一样:
//系统自动为接口里定义的属性增加public static final 修饰符
int MAXee SIZE = 50;
public static final int MAX_SIZE = 50;
对于接口里定义的方法而言,它们只能抽象方法,因此系统自动会为其增加abstract修饰符;由于接口里的方法全部是抽象方法,因此接口里不允许定义静态方法,即不可使用static修饰接口里定义方法。不管定义接口里方法时是否使用public abstract修饰符,接口里的方法总是使用public
abstract来修饰。
$注意
接口里定义的内部类和枚举类,它们默认都采用public static两个修饰符,不管定义时是否指定这两个修饰符,系统自动使用public static对它们进行修饰.
下面定义一个接口:
程序清单:codes/06/6-6/Output.java
public interface Output {
//接口里定义的属性只能是常量
int MAX_CACHE_LINE = 50;
//接口里定义的只能是public的抽象实例方法
void out();
void getDate(String msg);
}
上面定义了一个Output接口,这个接口里包含了一个常量属性:MAX CACHEes LINE。除此之外,这个接口还定义了2个方法:表示取得输出数据的 getData()和表示输出的outO方法.这就定义了Output的接口的规范:只要某个类它能取得输出数据,并可以将数据输出,那它就是一个输出设备,至于这个设备的实现细节,这里暂时不关心。
接口里的属性默认是使用public static final修饰的,因此即使另一个类处于不同包下,也可以通过接口来访问接口里的常量属性。例如下面程序:
程序清单:codes/06/6-6/TestOutputProperty.java
package yeeku;
public class TestOutputProperty {
public static void main(String[] args){
//访问另一个包中的Output接口的MAX_CACHE_LINE属性
System.out.println(lee.Output.MAX_CACHE_LINE);
//下面语句将引起"为final变量赋值"的编译异常:
lee.OutPut.MAX_CACHE_LINE = 20;
}
}
从上面main方法中可以看出,TestOutputProperty与Output处于不同包下,但可以访问Output的MAX CACHE LINE属性,这表明该属性是public访问权限的,而且可通过接口来访问该属性,表明这个属性是一个静态属性;当为这个属性赋值时引发的”为final变量赋值”的编译异常,表明这个属性使用了final修饰。
和类定义不同,定义接口不再使用class关键字,而是使用interface关键字。接口定义的基本语法如下:
[修饰符]interface接口名 extends父接口1,父接口2......
{
零个到多个常量定义
零个到多个抽象方法定义...
}
上面语法的详细说明如下:
》修饰符可以是public或者省略,如果省略了public访问控制符,则默认采用包权限访问控制符,即只有在相同包结构下才可以访问该接口。
》接口名应与类名采用相同的命名规则,即如果仅从语法角度来看,接口名只要是合法的标识符即可;如果要遵守Java可读性规范,则接口名应由多个有意义的单词连缀而言,每个单词首字母大写,单词与单词之间无需任何分隔符。
》一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类
由于接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义。接口里可以包含属性(只能是常量)、方法(只能是抽象实例方法)、内部类(包括内部接口)和枚举类定义。
对比接口和类的定义方式,不难发现接口的成员比类里的成员少了2种,而且接口里的属性只能是常量,接口里的方法只能是抽象方法。
前面已经说过了,接口里定义的是多个类共同的公共行为规范,因此接口里所有成员,包括常量、方法、内部类和枚举类都是public访问权限。定义接口成员时,可以省略访问控制修饰符,如果指定访问控制修饰符,只能使用public访问控制修饰符。
对于接口里定义的常量属性而言,它们是接口相关的,而且它们只能是常量,因此系统会自动为这些属性增加static和final两个修饰符。也就是说,在接口中定义属性时,不管是否使用public static final修饰符,接口里的属性总将使用这三个修饰符来修饰。而且,接口里没有构造器和初始化块,因此接口里定义的属性只能在定义时指定默认值。
接口里定义属性采用如下两行代码的结果完全一样:
//系统自动为接口里定义的属性增加public static final 修饰符
int MAXee SIZE = 50;
public static final int MAX_SIZE = 50;
对于接口里定义的方法而言,它们只能抽象方法,因此系统自动会为其增加abstract修饰符;由于接口里的方法全部是抽象方法,因此接口里不允许定义静态方法,即不可使用static修饰接口里定义方法。不管定义接口里方法时是否使用public abstract修饰符,接口里的方法总是使用public
abstract来修饰。
$注意
接口里定义的内部类和枚举类,它们默认都采用public static两个修饰符,不管定义时是否指定这两个修饰符,系统自动使用public static对它们进行修饰.
下面定义一个接口:
程序清单:codes/06/6-6/Output.java
public interface Output {
//接口里定义的属性只能是常量
int MAX_CACHE_LINE = 50;
//接口里定义的只能是public的抽象实例方法
void out();
void getDate(String msg);
}
上面定义了一个Output接口,这个接口里包含了一个常量属性:MAX CACHEes LINE。除此之外,这个接口还定义了2个方法:表示取得输出数据的 getData()和表示输出的outO方法.这就定义了Output的接口的规范:只要某个类它能取得输出数据,并可以将数据输出,那它就是一个输出设备,至于这个设备的实现细节,这里暂时不关心。
接口里的属性默认是使用public static final修饰的,因此即使另一个类处于不同包下,也可以通过接口来访问接口里的常量属性。例如下面程序:
程序清单:codes/06/6-6/TestOutputProperty.java
package yeeku;
public class TestOutputProperty {
public static void main(String[] args){
//访问另一个包中的Output接口的MAX_CACHE_LINE属性
System.out.println(lee.Output.MAX_CACHE_LINE);
//下面语句将引起"为final变量赋值"的编译异常:
lee.OutPut.MAX_CACHE_LINE = 20;
}
}
从上面main方法中可以看出,TestOutputProperty与Output处于不同包下,但可以访问Output的MAX CACHE LINE属性,这表明该属性是public访问权限的,而且可通过接口来访问该属性,表明这个属性是一个静态属性;当为这个属性赋值时引发的”为final变量赋值”的编译异常,表明这个属性使用了final修饰。
相关文章推荐
- 《C++第九周实验报告1-1》--------接第8周任务1,定义Complex类中的<<和>>运算符的重载,实现输入和输出
- <9>编写硬件抽象层模块接口
- 第九周项目二 Time类中的运算符重载(续)(2)定义Time类的>>和<<
- <input type="file">定义样式并获取上传文件路径及指定文件类型
- <climits>头文件定义的符号常量
- 第九周实验任务二--定义Complex类中的<<和>>运算符的重载,实现输入和输出,使程序读起来更自然
- 在jsp的<s:iterator>标签中获取action中的定义的成员变量
- <!DOCTYPE>标签的定义与用法
- <climits>头文件定义的符号常量
- 第九周 项目三:定义分数类中的<<和>>运算符重载
- 项目二-Time类定义Time类中的<<和>>运算符重载
- 第九周 项目一:定义复数类的<<和>>运算符的重载
- Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结: 先看下面的代码: <shape>
- >>fun=inline('exp(-x.*x)','x'); %用内联函数定义被积函数fname >>Isim=quad(fun,0,1) %辛普生法
- 《C++第九周实验报告2-1》---接第8周任务2,定义Time类中的<<和>>运算符重载,实现时间的输入输出
- 使用<appSettings>元素定义配置参数
- FLT_EPSILON定义在<float.h>
- FLT_EPSILON定义在<float.h>
- <meta>不同定义带表不同含义
- 第九周【项目1】在第8周项1的基础上(1)再定义一目运算符 -,-c相当于0-c(2)定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然