javainterface定义_Java接⼝(Interface)的定义和实现
抽象类是从多个类中抽象出来的模板,如果将这种抽象进⾏的更彻底,则可以提炼出⼀种更加特殊的“抽象类”——接⼝(Interface)。接⼝是 Java 中最重要的概念之⼀,它可以被理解为⼀种特殊的类,不同的是接⼝的成员没有执⾏体,是由全局常量和公共的抽象⽅法所组成。
定义接⼝
Java 接⼝的定义⽅式与类基本相同,不过接⼝定义使⽤的关键字是 interface,接⼝定义的语法格式如下:
[public] interface interface_name [extends interface1_name[, interface2_name,…]] {
// 接⼝体,其中可以包含定义常量和声明⽅法
[public] [static] [final] type constant_name = value; // 定义常量
[public] [abstract] returnType method_name(parameter_list); // 声明⽅法
}
对以上语法的说明如下:
public 表⽰接⼝的修饰符,当没有修饰符时,则使⽤默认的修饰符,此时该接⼝的访问权限仅局限于所属的包;
interface_name 表⽰接⼝的名称。接⼝名应与类名采⽤相同的命名规则,即如果仅从语法⾓度来看,接⼝名只要是合法的标识符即可。如果要遵守 Java 可读性规范,则接⼝名应由多个有意义的单词连缀⽽成,每个单词⾸字母⼤写,单词与单词之间⽆需任何分隔符。
extends 表⽰接⼝的继承关系;
interface1_name 表⽰要继承的接⼝名称;
constant_name 表⽰变量名称,⼀般是 static 和 final 型的;
returnType 表⽰⽅法的返回值类型;
parameter_list 表⽰参数列表,在接⼝中的⽅法是没有⽅法体的。
注意:⼀个接⼝可以有多个直接⽗接⼝,但接⼝只能继承接⼝,不能继承类。
接⼝对于其声明、变量和⽅法都做了许多限制,这些限制作为接⼝的特征归纳如下:
具有 public 访问控制符的接⼝,允许任何类使⽤;没有指定 public 的接⼝,其访问将局限于所属的包。
⽅法的声明不需要其他修饰符,在接⼝中声明的⽅法,将隐式地声明为公有的(public)和抽象的(abstract)。
在 Java 接⼝中声明的变量其实都是常量,接⼝中的变量声明,将隐式地声明为 public、static 和 final,即常量,所以接⼝中定义的变量必须初始化。
接⼝没有构造⽅法,不能被实例化。例如:
public interface A {
publicA(){…} // 编译出错,接⼝不允许定义构造⽅法
}
⼀个接⼝不能够实现另⼀个接⼝,但它可以继承多个其他接⼝。⼦接⼝可以对⽗接⼝的⽅法和常量进⾏重写。例如:
public interface StudentInterface extends PeopleInterface {
// 接⼝ StudentInterface 继承 PeopleInterface
int age = 25; // 常量age重写⽗接⼝中的age常量
void getInfo(); // ⽅法getInfo()重写⽗接⼝中的getInfo()⽅法
}
例如,定义⼀个接⼝ MyInterface,并在该接⼝中声明常量和⽅法,如下:
public interface MyInterface { // 接⼝myInterface
String name; // 不合法,变量name必须初始化
int age = 20; // 合法,等同于 public static final int age = 20;
void getInfo(); // ⽅法声明,等同于 public abstract void getInfo();
}
实现接⼝
接⼝的主要⽤途就是被实现类实现,⼀个类可以实现⼀个或多个接⼝,继承使⽤ extends 关键字,实现则使⽤ implements 关键字。因为⼀个类可以实现多个接⼝,这也是 Java 为单继承灵活性不⾜所作的补充。类实现接⼝的语法格式如下:
class [extends superclass_name] [implements interface1_name[, interface2_name…]] {
// 主体
}
对以上语法的说明如下:
public:类的修饰符;
superclass_name:需要继承的⽗类名称;
interface1_name:要实现的接⼝名称。
实现接⼝需要注意以下⼏点:
实现接⼝与继承⽗类相似,⼀样可以获得所实现接⼝⾥定义的常量和⽅法。如果⼀个类需要实现多个接⼝,则多个接⼝之间以逗号分隔。
⼀个类可以继承⼀个⽗类,并同时实现多个接⼝,implements 部分必须放在 extends 部分之后。
⼀个类实现了⼀个或多个接⼝之后,这个类必须完全实现这些接⼝⾥所定义的全部抽象⽅法(也就是重写这些抽象⽅法);否则,该类将保留从⽗接⼝那⾥继承到的抽象⽅法,该类也必须定义成抽象类。
例 1
在程序的开发中,需要完成两个数的求和运算和⽐较运算功能的类⾮常多。那么可以定义⼀个接⼝来将类似的功能组织在⼀起。下⾯创建⼀个⽰例,具体介绍接⼝的实现⽅式。java接口有没有构造方法
1)创建⼀个名称为 IMath 的接⼝,代码如下:
public interface IMath {
public int sum(); // 完成两个数的相加
public int maxNum(int a,int b); // 获取较⼤的数
}
2)定义⼀个 MathClass 类并实现 IMath 接⼝,MathClass 类实现代码如下:
public class MathClass implements IMath {
private int num1; // 第 1 个操作数
private int num2; // 第 2 个操作数
public MathClass(int num1,int num2) {
// 构造⽅法
this.num1 = num1;
this.num2 = num2;
}
// 实现接⼝中的求和⽅法
public int sum() {
return num1 + num2;
}
// 实现接⼝中的获取较⼤数的⽅法
public int maxNum(int a,int b) {
if(a >= b) {
return a;
} else {
return b;
}
}
}
在实现类中,所有的⽅法都使⽤了 public 访问修饰符声明。⽆论何时实现⼀个由接⼝定义的⽅法,它都必须实现为 public,因为接⼝中的所有成员都显式声明为 public。
3)最后创建测试类 NumTest,实例化接⼝的实现类 MathClass,调⽤该类中的⽅法并输出结果。该类内容如下:
public class NumTest {
public static void main(String[] args) {
// 创建实现类的对象
MathClass calc = new MathClass(100, 300);
System.out.println("100 和 300 相加结果是:" + calc.sum());
System.out.println("100 ⽐较 300,哪个⼤:" + calc.maxNum(100, 300));
}
}
程序运⾏结果如下所⽰。
100 和 300 相加结果是:400
100 ⽐较 300,哪个⼤:300
在该程序中,⾸先定义了⼀个 IMath 的接⼝,在该接⼝中只声明了两个未实现的⽅法,这两个⽅法需要在接⼝的实现类中实现。在实现类MathClass 中定义了两个私有的属性,并赋予两个属性初始值,同时创建了该类的构造⽅法。因为该类实现了 MathClass 接⼝,因此必须实现接⼝中的⽅法。在最后的测试类中,需要创建实现类对象,然后通过实现类对象调⽤实现类中的⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论