java中的接口

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 概念与语法规则
  • 使用
  • 特性
  • 实现多个接口
  • 接口间的继承
  • 抽象类和接口的区别


一.概念与语法规则

Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

语法规则:

接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。

提示 :
1. 创建接口时 , 接口的命名一般以大写字母 I 开头 .
2. 接口的命名一般使用 " 形容词 " 词性的单词 .
3. 阿里编码规范中约定 , 接口中的方法和属性不要加任何修饰符号 , 保持代码的简洁性 .
                                                                                                                                                           

二.接口的使用

注意: 子类和父类之间是 extends 继承关系,类与接口之间是 implements 实现关系。
请实现笔记本电脑使用 USB 鼠标、 USB 键盘的例子
1. USB 接口:包含打开设备、关闭设备功能
2. 笔记本类:包含开机功能、关机功能、使用 USB 设备功能
3. 鼠标类:实现 USB 接口,并具备点击功能
4. 键盘类:实现 USB 接口,并具备输入功能
package dean1;
 interface USB{//接口
     void openDevice();//对此进行重写
     void closeDevice();
        }
class Mouse implements USB{//鼠标类

    @Override
    public void openDevice() {
        System.out.println("打开鼠标");
    }

    @Override
    public void closeDevice() {
        System.out.println("关闭鼠标");
    }
    public void click(){
        System.out.println("鼠标点击");
    }
}
class KeyBoard implements USB{//键盘类
    @Override
    public void openDevice() {
        System.out.println("打开键盘");
    }

    @Override
    public void closeDevice() {
        System.out.println("关闭键盘");
    }
     public void inPut(){
         System.out.println("键盘输入");
     }
}
class Computer{// 笔记本类:使用USB设备
    public void powerOn(){
        System.out.println("打开笔记本电脑");
    }
    public void powerOff(){
        System.out.println("关闭笔记本电脑");
    }
    public void useDevice(USB usb){
        usb.openDevice();
        if(usb instanceof Mouse){
            Mouse mouse=(Mouse) usb;//向下转型
            mouse.click();
        }
        else if(usb instanceof KeyBoard){
            KeyBoard key=(KeyBoard) usb;
            key.inPut();
        }
        usb.closeDevice();
    }
}
public class Teat{//测试类
    public static void main(String[] args) {
        Computer c=new Computer();
        c.powerOn();
        c.useDevice(new Mouse());
        c.useDevice(new KeyBoard());
        c.powerOff();
    }
}

                                                                                                                                                           

四.特性

1. 接口类型是一种引用类型,但是不能直接 new 接口的对象 (无法实例化接口)
2.
2. 接口中 每一个方法 都是 public 抽象方法 , 即接口中的方法会被隐式的指定为 public abstract (只能是 public abstract, 其他修饰符都会报错
3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
4. 重写接口中方法时,不能使用默认的访问权限
5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
   public interface USB {
   double brand = 3.0 ; // 默认被: final public static 修饰
   void openDevice ();
   void closeDevice ();
   }
   public class TestUSB {
    public static void main ( String [] args ) {
   System . out . println ( USB . brand ); // 可以直接通过接口名访问,说明是静态的
   // 编译报错: Error:(12, 12) java: 无法为最终变量 brand 分配值
   USB . brand = 2.0 ; // 说明 brand 具有 final 属性
   }
   }
6. 接口中不能有静态代码块和构造方法
7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是 .class
8. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
9. jdk8 中:接口中还可以包含 default 方法。

五.实现多个接口

      Java 中不支持多继承 ,但是 一个类可以实现多个接
package dean1;
class Animal{
    public String name;
    public Animal(String name){
        this.name=name;
    }
}
interface IRunning{
    void run();
}
interface ISwimming{
    void swimming();
}
class Cat extends Animal implements IRunning{

    @Override
    public void run() {
        System.out.println(this.name+"正在跑");
    }
    public Cat(String name){
        super(name);
    }
}
class Dog extends Animal implements IRunning,ISwimming{

   public Dog(String name){
       super(name);
   }

    @Override
    public void run() {
        System.out.println(this.name+"正在跑");
    }

    @Override
    public void swimming() {
        System.out.println(this.name+"正在游泳");
    }
}
public  class Teat{
    public static void show(IRunning r){
        r.run();
    }
    public static void f1(ISwimming s){
        s.swimming();
    }
    public static void main(String[] args) {
        Cat cat=new Cat("小猫");
        show(cat);
        Dog dog=new Dog("小狗");
        f1(dog);
        show(dog);
    }
}
上面的代码展示了 Java 面向对象编程中最常见的用法 : 一个类继承一个父类 , 同时实现多种接口 .

六.接口间的继承

接口间的继承相当于把多个接口合并在一起 .
    interface IRunning {
   void run ();
   }
   interface ISwimming {
    void swim ();
   }
      // 两栖的动物 , 既能跑 , 也能游
    interface IAmphibious extends IRunning , ISwimming {
    }
   class Frog implements IAmphibious {
    ...
   }

                                                                                                       七.抽象类和接口的区别

核心区别 : 抽象类 中可以包含普通方法和普通字段 , 这样的普通方法和字段可以被子类直接使用 ( 不必重写 ), 接口 中 不能包含普通方法, 子类必须重写所有的抽象方法 .
如之前写的 Animal 例子 . 此处的 Animal 中包含一个 name 这样的属性 , 这个属性在任何子类中都是存在的 . 因此此 处的 Animal 只能作为一个抽象类 , 而不应该成为一个接口 .
再次提醒 :
抽象类存在的意义是为了让编译器更好的校验 , Animal 这样的类我们并不会直接使用 , 而是使用它的子类 .
万一不小心创建了 Animal 的实例 , 编译器会及时提醒我们 .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值