Java 基础 ----- 接口

关键字:interface    implements

1、接口:提供一种约定,使其实现接口的类(或结构)在形式上保持一致。

接口可以看做是一种特殊的抽象类,这个抽象类的中的所有方法都是抽象方法,但是与抽象类的语法不通,设计理念也不同。

属于引用类型变量

语法:

public interface 接口名{
        //接口成员

注意:

a、接口不能实例化

b、和抽象类不同,接口使用interface 修饰,访问修饰符只能事public,且可选

c、接口成员可以是全局常量和公共的抽象方法。

实现接口 implements:

public 类名 implements 接口名{
      实现方法
      普通方法
}

注意:
a、使用接口借助子类,使用implements关键字实现

b、实现接口类必须实现接口中定义的所有的抽象方法

c、接口的实现类允许包含普通方法

 

2、创建接口

 例子:

//接口
package com.obge.ex;

public interface UsbInterface {
     void service();
     void service2();
}


//实现 1个接口
package com.obge.ex;
public class ShuUsb implements UsbInterface {

    @Override
    public void service() {
        // TODO Auto-generated method stub
        System.out.println("鼠标连接");
    }
    @Override
    public void service2() {
        // TODO Auto-generated method stub
        
    }

}

//实现两个接口
package com.obge.ex;
public class UsbIsk implements UsbInterface,UsbInterface2{

    @Override
    public void service() {
        // TODO Auto-generated method stub
        System.out.println("传输数据");
    }

    @Override
    public void service2() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void test1() {
        // TODO Auto-generated method stub
        
    }

}

调用:

 

 

类只能继承一个父类,但可以实现多个接口,通过实现多个接口达到多继承的效果。

接口表示一种约定,也表示一种能力,体现了约定和实现相分离的原则,通过面向接口编程,可以降低代码之间的耦合性,提高代码的可扩展性和可维护性。

 

3、更复杂的接口

接口本身也可以继承接口。一个普通对类只能继承一个父类,但能同时实现多个接口,也可以同时继承抽象类和实现接口

语法:

访问修饰符 interface 接口名 extends 父接口1,父接口2,····{
       常量定义
       方法定义

}

实现多个接口语法格式

访问修饰符 class 类名 extends 父类名 implements 接口1,接口2,·····{

      类的成员
}

注意:
A、接口和类、抽象类是一个层次上的概念,命名规则相同,属于引用类型变量

B、修饰符如果是public 在整个项目中都可见,若省略只在当前包中可见

C、接口中可以定义常量不能定义变量,接口中的属性都默认使用public static final 修饰,即接口中的属性全都是全局静态常量。接口中的常量在定义时必须指定初始值。

public static final double PI = 3.14double  PI = 3.14;
效果相同

D、接口中所有的方法都是抽象方法,接口中的方法默认为public

E、和抽象类一样,接口不能实例化,不能有构造方法

F、接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但不能继承类

G、类只能继承一个父类,但可以通过implements 实现多个接口,一个类必须实现接口的全部方法,否则必须定义为抽象类。若一个类在继承父类的同时又实现了多个接口,extends必须位于implements之前。

 

综合:

//定义鸟叫接口
public interface ShoutAbility{
      //鸟叫的抽象方法
      public void shout(); 
}

//定义类 描述鸟叫的不同方式
public class AoShout implements ShoutAbility{
      public void shout(){
         syso("嗷嗷叫,,,,,");
     }  
}

public class ZhaShout implements ShoutAbility{
      public void shout(){
         syso("渣渣叫,,,,,");
     }  
}


//在鸟的抽象类中将接口作为属性,通过属性调用接口的方法
public abstract class Bird{
    //鸟叫的方式
    ShoutAbility shoutAbility;
    //鸟的有参构造,初始化鸟叫
    public Bird( ShoutAbility shoutAbility){
        this.shoutAbility = shoutAbility;
    }

    //
    public void shout(){
       //调用接口方法
       shoutAbility.shout();
    }
    //
    public void fly(){
        syso("弹飞***");
    }

     //攻击
     public abstract void attack();
     
}


//炸弹鸟
public BombBrid extends Bird{
     //子类有参构造
    public BombBrid( ShoutAbility shoutAbility){
         super(shoutAbility);
    }
    
   //重写攻击方法
   public void attack(){
      syso("炸弹攻击");
   }

}


//分裂鸟
public SplitBrid extends Bird{
     //子类有参构造
    public SplitBrid ( ShoutAbility shoutAbility){
         super(shoutAbility);
    }
    
   //重写攻击方法
   public void attack(){
      syso("分裂攻击");
   }

}



//测试
main{

      //嗷嗷叫
      ShoutAbility ao_shout = new AoShout();
      //喳喳叫
      ShoutAbility  zha_shout = new ZhaShout();
     
      //炸弹鸟渣渣叫
      Brid bomb = new BombBrid(zha_shout);
      //分裂鸟嗷嗷叫
      Brid split = new SplitBrid(ao_shout);
      bomb.shout();
      split.shout();
     


}

 

 

 

面向对象设计原则:

1、摘取代码中变化的行为,形成接口

2、多用组合,少用继承

3、针对接口编程,不依赖于具体实现

       如果对一个类型有依赖,尽量依赖接口,少依赖子类,因为子类一旦发生变化,代码变动的可能性大,而接口稳定的多。在具体的代码实现中,体现在方法参数,返回值,属性类型尽量使用接口。

4、需求改变,应添加一个新的接口或类,不要修改原来的代码。

 

posted on 2020-02-25 19:47  obge  阅读(213)  评论(0编辑  收藏  举报