接口的相关知识

接口是抽象类的延伸,可以将它看成纯粹的抽象类。接口中的所有方法都是抽象方法。(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();
    }
}
 

 

运行结果: 

鼠标欧克了~ 

摄像头欧克了~

键盘欧克了~

计算机成功开机!

*****计算机正在运行*******

鼠标关闭了~

摄像头关闭了~

键盘关闭了~

计算机成功关机~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值