11 接口

109 阅读5分钟
必须要掌握接口的定义格式和接口中抽象方法的定义和使用格式【最重要】
接口作用: 实现对类的功能的扩展,解决java中类的单继承的局限性
接口在设计之初 所以设计之初接口中只能定义抽象方法和常量
1.抽象方法: 		  public abstract 返回值类型 方法名称(形式参数列表...);
2.默认方法【jdk8开始】: public default 返回值类型 方法名称(形式参数列表...) {...}
3.静态方法【jdk8开始】: public static 返回值类型 方法名称(形式参数列表...) {...}
4.常量:	           public staitc final 数据类型 变量名称 = 数据值;
public interface 类名 {
		//常量
		//抽象方法
		//默认方法
		//静态方法	
	}  

接口中抽象方法的定义格式和使用【重点】

定义public abstract 返回值类型 方法名称(形式参数列表...);
接口中抽象方法,有默认修饰符public abstract,不写也有
抽象类中抽象方法必须写public abstract,不能省略
接口中抽象方法的使用
        (1)不能直接创建接口的对象
        (2)定义实现类 实现 接口 关键字 implements
           格式:
                public class 类名 implements 接口A,接口B {
                    //覆盖重写接口中的所有的抽象方法
                }
      (3)实现类中覆盖重写接口中的所有的抽象方法 
        去掉abstract关键字,添加{} 快捷键: ctrl + i 
      (4)创建实现类对象
      (5)使用实现类对象调用方法
 //USB接口
public interface USB {
    //抽象方法
    //开启功能
    public abstract void open();
    //抽象方法: public abstract 是默认修饰符,可以省略
    //关闭功能
    void close();
}
//USB接口实现类U盘
public class UDisk implements USB {
    @Override
    public void open() {
        System.out.println("U盘已经开启....");
    }
    @Override
    public void close() {
        System.out.println("U盘已经关闭....");
    }    
}
不能直接创建接口的对象
 UDisk uDisk = new UDisk();

接口默认方法的定义格式:

public default 返回值类型 方法名称(形式参数列表...){
                //方法体;
            }
        默认方法的使用: 只能使用实现类对象@Override调用默认方法
        注意:
            1.接口中的默认方法,不强制要求实现类进行覆盖重写
            2.但是实现类可以根据需求,选择性的覆盖重写接口中的默认方法
            3.如果实现类覆盖重写接口中的默认方法,必须去掉default关键字
  public interface USB { 
    public default void driver() {
        System.out.println("USB接口提供的默认驱动程序....");
    }
}
public class HMScanner implements USB {
   
    //该实现类发现接口中的默认方法可以满足需求,就不需要再重写
	//该实现类发现接口中的默认方法无法满足需求,进行了覆盖重写
    @Override
    public void driver() {
        System.out.println("使用扫描仪专用驱动");
    }
}

接口中的静态方法的定义和使用【了解】

 public static 返回值类型 方法名称(形式参数列表...) {
            方法体;
       }
 使用格式: 只能使用接口名称调用接口中的静态方法  
  (1)接口中的静态方法,属于接口本身,与实现类无关,在实现类中不存在覆盖重写
        (2)类中的静态方法,属于类本身,与接口无关,与对象无关
        (3)类中的静态方法:
             名直接调用 ---推荐使用
             对象直接调用 ---不推荐使用
    总结: 静态的内容要么用接口名称调用,要么用类名称调用
  public interface USB { 
    public abstract void open(); 
    void close(); 
    public default void driver() {
        System.out.println("USB接口提供的默认驱动程序....");
    } 
    public static void thanks() {
        System.out.println("感谢使用USB接口....");
    }
}
//USB接口实现类扫描仪
public class HMScanner implements USB {
     
    public static void thanks() {
        System.out.println("感谢使用扫描仪....");
    }
} 

接口中成员变量的使用【了解】

 接口中不能定义变量,只能定义常量(值不可以改变),而且常量有默认修饰符public static final   
    接口中的常量的使用: 接口名称.常量名称
    建议: 接口中常量的命名全部使用大写字母,单词之间用_分隔MAX_SPEED_OF_TRANSFER
   public interface USB {
    //版本
    public static final double VERSION = 3.0;//版本
    public static final int MAX_SPEED_OF_TRANSFER = 500;//最大传输速度 
    //静态方法: 展示USB接口的相关信息
    public static void show() {
          System.out.println("USB接口版本: " + USB.VERSION + ", 最大传输速度: " + USB.MAX_SPEED_OF_TRANSFER + "MB/s");
    }  
        //show方法和内部输出的常量,都在USB接口中,所以可以省略接口名 
}
测试类USB.VERSION

接口的多实现【重点】

  一个类能继承一个父类,同时实现多个接口:
  //创建抽象父类AbstractClass,内部定义抽象方法
public abstract class AbstractClass {
    //抽象方法
    public abstract void method();
}
//2.创建接口MyInterA内部定义抽象方法
public interface MyInterA {
    //抽象方法
    void show();
}
//2.创建接口MyInterB内部定义抽象方法
public interface MyInterB {
    //抽象方法
    void fun();
}
多个继承写法--public class 子类名 extends 父类名 implements 接口名A,接口名B {
            覆盖重写抽象父类和接口中的所有的抽象方法
        } 
 注意子类必须重写父类和接口中的所有抽象方法,只要有一个抽象方法没有被重写, 该子类必须定义为抽象类,看MyClass02类
 接口的多继承关系  子接口会拥有父接口中的所有抽象方法
//3.创建子类MyClass 继承 抽象父类AbstractClass 实现接口 MyInterA和MyInterB
public class MyClass extends AbstractClass implements MyInterA, MyInterB {
    //4.子类MyClass 覆盖重写抽象父类和接口中的所有的抽象方法
    @Override
    public void method() {
        System.out.println("MyClass...method...");
    }
    @Override
    public void show() {
        System.out.println("MyClass...show...");
    }
    @Override
    public void fun() {
        System.out.println("MyClass...fun...");
    }
}