文章目录
- 一、Java接口
- 二、Java实现接口
- 三、Java接口回调
- 四、Java接口与多态
- 五、Java接口参数
- 六、Java接口与抽象类的比较
- 七、Java接口的UML图
- 总结
一、Java接口
接口是Java语言中一种重要的数据类型,通常使用关键字interface来定义一个接口。
接口的定义和类的定义十分相似,分为接口声明和接口体,例如:
interface Printable {
final int MAX=100;
void add();
float sum(float x,float y);
}
1. 接口声明:
接口包含有接口声明和接口体,和类不同的是,接口使用关键字interface来声明自己是一个接口,格式如下:
interface 接口的名字
2.接口体:
接口体中包含常量的声明和抽象方法两部分。接口体中只有抽象方法,没有普通方法,而且接口体中所有的常量的访问权限一定都是public,而且是static常量,所有的抽象方法的访问权限一定都是public。
例如:
interface Printable {
public final static int MAX = 100; //等价写法:int MAX = 100;
public abstract void add(); //等价写法:void add();
public abstract float sum(float x,float y);
//等价写法:float sum(float x,float y);
}
注意:修饰符public、final、static允许省略。
二、Java实现接口
在Java语言中,接口由类来实现,以便使用接口中的方法。一个类需要在类声明中使用关键字implements声明该类实现一个或多个接口。如果实现多个按口,用逗号隔开接口名。
例如:
class A implements Printable,Addable //A类实现Printable和Addable接口
class Dog extends Animal implements Eatable,Sleepable
//Animal的Dog子类实现Eatable和Sleepable接口
如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。
注意:由于接口中的方法一定是public abstract方法,所以类在重写接口方法时不仅要去掉abstract修饰符,还要给出方法体,而且方法的访问权限一定要明显地用public来修饰。
如果实现接口的非抽象类实现了该接口中的方法,就相当于给出了方法的具体行为功能。用户也可以自定义接口,一个Java源文件可以由类和接口组成。
如果一个类声明实现一个接口,但没有重写接口中的所有方法,那么这个类必须是抽象类,也就是说,抽象类既可以重写接口中的方法,也可以直接拥有接口中的方法。
细节说明:
程序可以用接口名访问接口中的常量,但是如果一个类实现了接口,那么该类可以直接在类体中使用该接口中的常量。
定义接口时,如果关键字interface前面加上public关键字,就称作public接口,public接口可以被任何一个类实现;如果不加上public关键字,就称作友好接口,友好接口可以被与该接口在同一包中的类实现。
如果父类实现了某个接口,那么子类也就自然而然地实现了该接口,也就是说,子类不必再使用关键字implements声明实现这个接口。
接口也是可以被继承的,即可以通过关键字extends声明一个接口是另一个接口的子接口。由于接口中的方法和常量都是共有的,所以子接口将继承父接口中的全部方法和常量。
注意:Java提供的接口都在相应的包中,通过import语句不仅可以引入包中的类,也可以引入包中的接口。
例如:
import java.io.*;
//此时不仅引入了java.io包中的类,还引入了该包中的接口
三、Java接口回调
接口和类一样,也是Java语言中一种重要的数据类型,用接口声明的变量称作接口变量
首先,接口属于引用型变量,接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用。
例如:假设Com是一个接口,那么就可以用Com声明一个变量。
Com com;
因为com变量中还没有存放实现该接口的对象的引用,所以称此时的com是一个空接口。
假设ImpleCom类是实现Com接口的类,用ImpleCom创建名字为object的对象,那么object对象不仅可以调用ImpleCom类中原有的方法,而且也可以调用ImpleCom类实现的接口方法。
ImpleCom object = new ImpleCom();
“接口回调”
在Java语言中,接口回调是指可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法,实际上,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法。
注意:接口无法调用类中的其他非接口方法。
四、Java接口与多态
由于不同的类在实现同一个接口时可能具有不同的实现方式,所以接口变量在回调接口方法时就可能具有多种形态。
接口多态定义的格式:
接口 变量名 = new 接口实现类();
例如:A类和B类都实现了ComputerAverage接口,但实现的方式不同。
interface ComputerAverage {
public double average(double a,double b);
}
class A implements ComputerAverage {
public double average(double a,double b) {
double aver = 0;
aver = (a+b)/2;
return aver;
}
}
class B implements ComputerAverage {
public double average(double a,double b) {
double aver = 0;
aver = Math.sqrt(a*b);
return aver;
}
}
public class Main {
public static void main(String args[]) {
ComputerAverage computer;
double a = 10,b = 40;
computer = new A();
double result = computer.average(a,b);
System.out.printf("%5.2f和%5.2f的算术平均值:%5.2f\n",a,b,result);
computer = new B();
result = computer.average(a,b);
System.out.printf("%5.2f和%5.2f的几何平均值:%5.2f",a,b,result);
}
}
五、Java接口参数
如果一个方法的参数是接口类型,我们就可以将任何实现该接口的类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法。
interface SpeakHello {
void speakHello();
}
class Chinese implements SpeakHello {
public void speakHello() {
System.out.println("中国人习惯问候语:你好,吃饭了吗? ");
}
}
class English implements SpeakHello {
public void speakHello() {
System.out.println("英国人习惯问候语:你好,天气不错!");
}
}
class KindHello {
public void lookHello(SpeakHello hello) { //接口类型参数
hello.speakHello(); //接口回调
}
}
public class Main {
public static void main(String args[]) {
KindHello kindHello = new KindHello();
kindHello.lookHello(new Chinese());
kindHello.lookHello(new English());
}
}
六、Java接口与抽象类的比较
1. Java接口与抽象类的比较
(1) abstract(抽象)类和接口都可以有abstract(抽象)方法。
(2) 接口中只可以有常量,不能有变量,而abstract类中既可以有常量也可以有变量。
(3) abstract类中也可以有非abstract方法,接口不可以。
在设计程序时应当根据具体的分析来确定是使用抽象类还是接口。abstract类除了提供重要的需要子类重写的abstract方法以外,还提供了子类可以继承的变量和非abstract方法。
如果某个问题需要使用继承才能更好地解决,比如:子类除了需要重写父类的abstract方法以外,还需要从父类继承一些变量或继承一些重要的非abstract方法,就可以考虑用abstract类。如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。
注意:JDK1.8接口支持静态方法和默认方法。
七、Java接口的UML图
表示接口的UML图和表示类的UML图类似,使用一个长方形描述一个接口的主要构成,将长方形垂直地分为三层。
顶部第1层是名字层,接口的名字必须是斜体字形,而且需要用<>修饰名字,并且该修饰和名字分列在两行。
第2层是常量层,列出接口中的常量及类型,格式是“常量名字:类型”。
第3层是方法层,也称操作层,列出接口中的方法及返回类型,格式是“方法名字(参数列表):类型”。
接口Computable的UML图如下:
如果一个类实现了一个接口,那么类和接口的关系是实现关系,称类实现接口。UML通过使用虚线连接类和它所实现的接口,虚线起始端是类,虚线的终点端是它实现的接口,但终点端使用一个空心的三角形表示虚线的结束。
China和Japan类实现Computable接口的UML图如下:
对于接口的实现参照面向对象的学习可以更好的理解。
学习来自“https://www.dotcpp.com”
总结
晨光熹微,鸟语花香,微风和畅。