1、接口
一个Java接口是一些方法特征的集合,但没有方法的实现。
如果某个类中的所有方法都是抽象方法,那么可以考虑将该类定义为接口。
2、接口的定义
定义接口使用关键字interface
,一般语法:
[访问权限] interface 接口名 {
成员列表
}
public interface IMyInterface {
……
}
3、接口的实现
与抽象类相似,接口同样不可以实例化,只能用于实现。
如果某类要实现接口,则使用implements
关键字,一般语法:
[访问权限] class 类名 implements 接口名 {
成员列表
}
public class MyClass implements IMyInterface {
……
}
例1:
// IMyInterface.java
package aaa;
//定义接口
public interface IMyInterface
{
/*接口中的所有方法都默认为抽象方法,无需加abstract关键字*/
public int add(int x, int y);
public int sub(int x, int y);
}
// MyClass.java
package bbb;
import aaa.IMyInterface;
//MyClass类实现于IMyInterface接口
public class MyClass implements IMyInterface {
//实现接口中的抽象方法
public int add(int x, int y) {
return (x + y);
}
public int sub(int x, int y) {
return (x - y);
}
}
/*InterfaceDemo.java源文件*/
//导入必要的接口和类
import aaa.IMyInterface;
import bbb.MyClass;
//用于容纳main方法
public class InterfaceDemo
{
public static void main(String[] args) {
//使用接口的引用指向实现类的实例
IMyInterface obj = new MyClass();
System.out.println("两数的和是:" + obj.add(20, 30));
System.out.println("两数的差是:" + obj.sub(30, 20));
}
}
例2:
// java接口,相当于主板上的PCI插槽的规范
public interface PCI {
public void start();
public void stop();
}
// Java接口中定义的方法在不同的地方被实现,可以具有完全不同的行为
class SoundCard implements PCI {
public void start() {
System.out.println("Du du");
}
public void stop() {
System.out.println("Sound stop!");
}
}
class NetworkCard implements PCI {
public void start() {
System.out.println("Send...");
}
public void stop() {
System.out.println("Network stop!");
}
}
// 运行时,根据实际创建的对象类型,调用相应的方法实现
public class Assembler {
public static void main(String[] args) {
PCI nc = new NetworkCard(); // 可以使用接口的引用指向其实现类的对象,从而达到动态多态的效果
PCI sc = new SoundCard();
nc.start();
sc.start();
}
}
4、注意事项
(1)接口中不能定义非抽象方法,也就是说接口中不能包含有函数实体;
(2)接口中的所有方法都默认为抽象方法,无需在每个方法前加abstract
关键字;
(3)接口的实现类应该提供对接口中所有抽象方法的具体实现,否则将成为抽象类;
(4)与抽象类和它的继承类相似,也可以使用接口的引用指向其实现类的对象,从而达到动态多态的效果;
(5)接口中的所有变量都默认为常量;
加入final 关键字代表常量,加入static 关键字代表类变量。
尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。
例:
public class CSStudent {
public static final int FEMALE = 1; //代表女性
public static final int MALE = 2; //代表男性
private int sex; //性别
public void setSex(int sex) {
if(sex==FEMALE)
System.out.println("这是一名女学生");
else if(sex == MALE)
System.out.println("这是一名男学生");
this.sex = sex;
}
}
在Java 接口中声明的变量在编译时会自动加上static final的修饰符,即声明为常量,因而Java接口通常是存放常量的最佳地点。
public interface SchoolType {
(static final) String CUIT = “a";
(static final) String CULA = “b";
}
(6)Java只支持单继承,而不像C++一样可以多重继承。接口正是为了弥补这一点。
某一个类只能继承一个父类,但可以实现多个接口。
public class 实现类名 implements 接口1, 接口2, ..., 接口n {
成员列表
}
(7)Java中还允许一个接口继承于另一个接口,即由父接口派生出子接口。
public interface 子接口名 extends 父接口名 {
成员列表
}
这样的话,就可以使用父接口的引用指向子接口的实现类的对象。
5、面向接口编程
开发系统时,主体构架使用接口,接口构成系统的骨架,这样就可以通过更换接口的实现类来更换系统的实现
6、类和类之间的关系
类与类之间的关系一般来说有两种:“有”关系和“是”关系;
所谓“是”关系就是指类的继承关系。如:从动物类派生出哺乳动物类,那么可以说哺乳动物是动物。
而“有”关系是指在一个类中包含了另一个类的对象,即一个类中有另一个类(的对象),可以理解为类的嵌套。