接口是抽象类的延伸,可以将它看成纯粹的抽象类。接口中的所有方法都是抽象方法。(JDK8之前)Java提供interface 关键字,用于声明接口。
语法格式如下:
interface 接口名 [extends 父接口列表]{
[public ] [static] [final] 常量;
[public] [abstract] 方法;
//此为接口体 接口体内的方法一定是抽象的,可以有常量,但不可有变量。
}
注意点:
接口名必须是合法的Java标识符,一般要求首字母大写。接口之间也存在继承关系,使用extends 关键字指定要定义的接口继承于哪个父接口;接口会默认为常量添加 "public static final "修饰符,为方法添加 "public abstarct" 修饰符,所以,修饰符可以省略不写。
interface的使用示例:
interface Parent{
String name; //等价于public static final String name;
void say(); //等价于 public abstarct void say();
}
补充:
JDK8后在接口的方法中新增了 实例方法 和 静态方法;
实例方法:
从JDK8版本开始,允许使用 default 关键字,在接口中定义称作 default 的实例方法(不可以定义 default 的 static 方法),default 实例方法的访问权限一定是 public (允许省略 public修饰符。),但不可省略 default 关键字。
举个使用栗子:
interface Printable{
public final int MAX=100; //常量
public abstract void add(); //抽象方法
public default int max(int a,int b){ //实例方法
return a>b?a:b;
}
}
静态方法:
不可以用static 和 abstract 同时修饰一个方法。
举个使用栗子:
interface Printable{
public final int MAX=100; //常量
public abstract void add(); //抽象方法
public default int max(int a,int b){ //实例方法
return a>b?a:b;
}
public static void f(){ //静态方法
System.out.println("注意是从Java SE8开始的");
}
}
注意点:
接口不能进行实例化,即不能用new创建接口的实例。如果需要调用接口中的非静态方法。只能通过接口实现类的对象来调用。Java提供 implements 关键字,用于实现接口。一个类可以在继承另一个类的同时实现多个接口。
语法格式如下:
class 类名 [extends 父类名] implements 接口列表{
属性和方法
}
接口列表中如果有多个接口,接口之间用","(逗号)隔开。
举个具体的通过接口实现类的对象来调用接口方法的栗子:
public interface Talk { //接口一
public void talk();
}
----------------------------------------------public interface Work { //接口二
public void work();
}
----------------------------------------------public class Teacher implements Talk,Work { //创建一个类来实现接口
public String name; //定义名字属性
public Teacher(String name){ //对名字属性进行初始化
this.name =name;
}
public void work(){ //重写word()方法
System.out.println(name+":老师开始上课了!");
}
public void talk(){ //重写talk()方法
System.out.println(name+":同学们好!");
}
}---------------------------------------------
public class Student implements Talk,Work{
public String name;
public Student(String name){
this.name=name;
}
public void work(){
System.out.println(name+":同学开始上课~");
}
public void talk(){
System.out.println(name+":老师好~");
}
}------------------------------------------------
public class TestInterface {
public static void main(String[] args) {
Teacher t1 =new Teacher("Amy老师");
Student s1 =new Student("张三");
Student s2 =new Student("李四");//通过相应的对象调用相应的方法,实现控制台输出的结果
t1.talk();
s1.talk();
s2.talk();
t1.work();
s1.work();
s2.work();
}
}
运行结果:
Amy老师:同学们好!
张三:老师好~
李四:老师好~
Amy老师:老师开始上课了!
张三:同学开始上课~
李四:同学开始上课~
注意点:
一个类实现了某个接口,那么这个类就自然拥有了接口中的常量,default方法(去掉了default关键字),该类也可以重写接口中的default方法(注意,重写时也需要去掉default关键字)。但不自然拥有接口里的static方法。
如果一个非abstract类实现了某个接口,那么这个类必须重写该接口的所有abstract方法,即去掉abstract修饰给出方法体。
如果一个abstract类实现了某个接口,该类可以选择重写接口的abstract方法或直接拥有接口的abstract方法。
接口中的方法的访问权限都是public的。重写时不可省略public(否则就降低了访问权限,这是不允许的)。
补充this关键字的相关知识:
public String name; //定义名字属性
public Teacher(String name){ //对名字属性进行初始化
this.name =name;
}在上面的代码里,构造方法的参数名为name,它是该构造方法的局部变量。但是还定义了一个成员变量,名称也是name,此时在构造方法中使用的name,访问的是局部变量,但是如果使用this.name ,则访问成员变量。
来个例题练练手叭~(有点点麻烦)
需求描述
计算机上都有USB接口,鼠标、键盘和摄像头等设备都可以连接USB接口使用。当计算机的时,这些设备会随之启动:当计算机关团时,这些设备也会随之关闭。鼠标、键盘和摄像头等USB》备都启动后,计算机才开机成功;当这些VSB设备都关闭后,计算机才关机成功。编写一个USB接口程序,模拟计算机的开机和关机过程。
思路分析
(1)从需求描述可知,本实战训练涉及的对象有USB接口、鼠标、键盘、摄像头及计算机。编写程序时,需要为这些对象编写相应的代码。
(2)首先,USB设备只有插入接口中才能够使用,这就需要先定义一个USB接口。USB的启动和关闭随计算机的开机、关机进行,这就需要在接口中定义设备启动和停止的方法。
(3)编写完接口后,需要编写接口的实现类 鼠标、键盘和摄像头,在实现类中需要实现设备的启动和关闭方法。
(4)USB设备是在计算机中使用的,需要编写一个计算机类计算机中有USB插槽才能有USB接口,每插入一个新的设备,计算机就会安装此设备的驱动程序,安装完成后设备就可以使用了。因此,计算机类中需要有一个USB插槽和安装USB设备的方法。同时,计算机类需要定义开机和关机的方法。
(5)最后编写测试类,实例化计算机对象,为其添加USB设备。
具体代码如下:
public interface USB {
void Open();
void close();
}
----------------------------------------------public class Mouse implements USB{
public void Open(){
System.out.println("鼠标欧克了~");
}
public void close(){
System.out.println("鼠标关闭了~");
}
}
--------------------------------------------------public class Camera implements USB {
public void Open(){
System.out.println("摄像头欧克了~");
}
public void close(){
System.out.println("摄像头关闭了~");
}
}--------------------------------------------------------
public class Keyboard implements USB{
public void Open(){
System.out.println("键盘欧克了~");
}
public void close(){
System.out.println("键盘关闭了~");
}
}
-----------------------------------------------------------public class Computer {
private USB[] usbArr =new USB[4];
public void add(USB usb){
for(int i=0;i<usbArr.length;i++){//查看所有插槽,如果有空,就将USB设备连接在这个插槽里。
if(usbArr[i]==null){
usbArr[i]=usb;
break;
}
}
}
public void powerOn(){
for(int i=0;i<usbArr.length;i++){ //查看插槽,有设备则开启
if(usbArr[i]!=null){
usbArr[i].Open();
}
}
System.out.println("计算机成功开机!");
}
public void powerOff(){
for(int i=0;i<usbArr.length;i++){ //有设备则关闭
if(usbArr[i]!=null) {
usbArr[i].close();
}
}
System.out.println("计算机成功关机~");
}
}
-------------------------------------------------------------public class TestUSB {
public static void main(String[] args) {
Computer c = new Computer();
c.add(new Mouse());
c.add(new Keyboard());
c.add(new Camera());
c.powerOn();
System.out.println("*****计算机正在运行*******");
c.powerOff();
}
}
运行结果:
鼠标欧克了~
摄像头欧克了~
键盘欧克了~
计算机成功开机!
*****计算机正在运行*******
鼠标关闭了~
摄像头关闭了~
键盘关闭了~
计算机成功关机~