zoukankan      html  css  js  c++  java
  • Java_接口

     接口与抽象类相比,接口使用率更高,所有设计都围绕着接口设计

    接口是特殊的类,但里面的组成与类不同,主要有抽象方法全局常量组成。

    接口使用interface定义

    定义一个接口:

    interface A{
    
      public static final String MSG = "Hello";
    
      public abstract void print();
    
    }

    接口定义完成后,需要遵循:

    接口一定要定义子类,子类利用implements实现接口,一个子类可以同时实现多个接口,一个抽象类只能被一个子类继承

    接口的子类(如果不是抽象类),必须覆写接口中全部抽象方法

    接口对象利用子类对象的向上转型进行实例化操作

    范例:使用接口

    interface A{
    
      public static final String MSG = "Hello";
    
      public abstract void print();
    
    }
    
    interface B{
    
      public abstract void fun();
    
    }
    
    class X implements A,B{  //X类同时实现了A和B两个父类接口
    
      public void print(){}
    
      public void fun(){}
    
    }
    
    public class TestDemo{
    
      public static void main(String args[]){
    
        X x = new X();  //实例化子类对象
        A a = x;   //子类为父接口实例化
        B b = x;
        a.print();
        b.fun();
      }
    
    }
    interface A{
    
      public static final String MSG = "Hello";
    
      public abstract void print();
    
    }
    
    interface B{
    
      public abstract void fun();
    
    }
    
    class X implements A,B{  //X类同时实现了A和B两个父类接口
    
      public void print(){}
    
      public void fun(){}
    
    }
    
    public class TestDemo{
    
      public static void main(String args[]){
    
        A a = new X(); //子类为父接口实例化
        B b = (B)a ; B和A没有关系了,但可以转换是因为X是子类
        b.fun();   
       } 
    }

    注意:

    接口里面定义的时候就明确的开发要求:抽象方法、全局常量。接下来两个操作完全相同:

    interface A{
    
      public static final String MSG = "Hello";
    
      public abstract void print();
    
    }
    interface A{
    
      String MSG = ""Hello";
    
      public void print();
    
    }

    一般都写public,但不去写abstract

    一个普通类如果要实现接口又要继承抽象类,要先extends继承抽象类,再implements实现接口

    class 子类 extends 抽象类 implements 接口1,接口2,接口3{}

    一个抽象类可以直接实现接口:

     接口不能继承抽象类,但一个接口可以使用extends继承多个父接口。

    interface A{
    
      public void printA();
    
    }
    
    interface B{
    
      public void printB();
    
    }
    
    interface C extends A,B{  //C是A与B的子接口
    
       public void printC();
    }
    
    class X implements C{
    
      public void printA(){}
    
      public void printA(){}
    
      public void printA(){}
    
    }

     虽然接口只能有抽象方法和全局常量,但其他结构不受限制,也就是说可以定义内部类,内部抽象类,内部接口。

    如果一个内部接口使用了static定义,那么这个内部接口就属于外部接口

    接口特点:

    避免了单继承的局限,一个子类可实现多个接口

    接口中的权限统一为public,方法是抽象方法

    所有的内部类结构都不受到定义语法的限制,一个内部接口使用了static定义,那么这个内部接口就属于外部接口

    开发中接口三个使用原则:

      制定操作的标准

      表示一种能力

      将服务器端的远程方法视图提供给客户端

    用接口定义个标准

    interface USB{
    
      public void start();
    
      public void stop();
    
    }
    
    class Computer{
    
      public void plugin(USB usb){ // 不管有多少个设备,plugin只要接受的是USB实例,那么操作就是固定的
    
        usb.start();
    
        usb.stop();
    
      }
    
    }
    
    class Flash implements USB{
    
      public void start(){
    
        System.out.println("U盘开始工作");
    
      }
    
      public void stop(){
    
        System.out.println("U盘停止工作");
    
      }
    
    }
    
    class Keyboard implements USB{
    
      public void start(){
    
        System.out.println("键盘开始工作");
    
      }
    
      public void stop(){
    
        System.out.println("键盘停止工作");
    
      }
    
    }
    
    public class TestDemo{
    
      public static void main(String args[]){
    
        Computer c = new Computer();
        c.plugin(new Flash());  //传递u盘对象
        c.plugin(new Keyboard()); //传递键盘对象
      }
    
    }

     所以接口有千万个子类,也是可以在一个接口上使用的。所以接口是定义标准的。 

    工厂设计模式

     interface Fruit{
    
      public void eat();
    
    }
    
    class Apple implements Fruit {
    
      public void eat(){
    
        System.out.println("吃苹果");
    
      }
    
    }
    
    class Cherry implements Fruit{
    
      public void eat(){
    
        System.out.println("吃樱桃");
    
      }
    
    }
    
    class Factory {
    
      public static Fruit getInstance(String className){ //直接取得接口实例
    
        if("apple" equals(className)){
    
          return new Apple();
    
        } else if("cherry" equals(className)){
    
          return new Cherry();  
    
        } else {
    
          return null;
    
        }
    
      }
    
    }
    
    public class TestDemo{
    
      public static void main(string args[]){
    
        Fruit f = Factory.getInstance(args[0]);  //为了方便模拟调用
    
        if(f != null) {
    
          f.eat();
    
        }
    
      }
    
    }

    代理设计模式

     在接口上的一种应用,一个接口有一个核心的操作主题,但是在整个操作中只依靠核心操作主题是无法完成所需要功能的,那么需要一个代理的主题。代理主题完成所有的与核心有关的概念。

     interface Subject{ //核心操作主题
    
       public void get();
    }
    
    class RealSubject implements Subject{
    
      public void get(){
    
        System.out.println("取回了被强行霸占的钱");
      }
    
    }
    
    class ProxySubject implements Subject{
    
      private Subject subject;  //代理的真实主题
    
      public ProxySubject(Subject subject){
    
        this.subject = subject;
      }
    
      public void prepare(){
    
        System.out.println("【追讨前的准备】");
      }
    
      public void get(){
    
        this.prepare();
        this.subject.get(); //真实主题讨债
        this.destroy();
      }
    
      public void destroy{
    
        System.out.println("【追讨后的收尾】");
      }
    
    }
    
    public class TestDemo{
    
      public static void main(String args[]){
    
        Subject sub = new ProxySubject(new RealSubject());
        sub.get();
      }
    
    }

    抽象类与接口区别(面试题)

    No. 区别 抽象类 接口
    1 定义关键字 abstract interface
    2 组成   属性、常量、抽象方法、构造方法、普通方法 抽象方法、全局常量
    3 权限 可使用各种权限 只能public
    4 子类实现 利用extends可继承一个抽象类 利用implements可实现 多个接口
    5 关系 抽象类可以实现多个接口 接口不能继承抽象类,接口却可以利用extends实现接口的多继承
    6 对象实例化    依靠子类对象的向上转型    依靠子类对象的向上转型
    7 设计模式  模板设计模式 工厂设计模式、代理设计模式
    8 操作局限 单继承局限 无单继承局限

     抽象类与接口都可以显示子类必须要覆写的方法要求,但由于抽象类有单继承局限,开发中如果发现抽象类与接口 都可以同时使用的时候,有限考虑接口,抽象类实际应用中,往往是作为接口与普通类之间的过度类使用

  • 相关阅读:
    网络时钟同步SOCKET代码
    NTP时间同步之同步时钟要领
    3分钟 Markdown 快速入门(超详细)(Day_33)
    如何在idea中将项目生成API文档(超详细)(Day_32)
    多条件分页 (Day_31)
    常见判断错误 (Day_30)
    HTML 标签隐藏占用空间与不占用空间(Day_29)
    EasyUI_使用datagrid分页 (Day_28)
    (xxx) is not defined at HTMLInputElement.onblur(Day_27)
    EasyUI系列—点击按钮加载tabs_day26
  • 原文地址:https://www.cnblogs.com/lonske/p/8710932.html
Copyright © 2011-2022 走看看