接口的定义与使用

接口的定义与使用

​ 抽象类与普通类相比最大的特点是约定了子类的实现要求,即抽象类的产生原因是:普通类无法限制子类覆写哪些方法。但抽象类的局限性在于,很多事物不满足is-a原则,且抽象类只能实现单继承,若想多继承必须使用多层继承。而接口就可以实现多继承。接口是更纯粹的抽象类–融合。

接口优先原则:9在一个操作既可以使用抽象类和接口的时候,优先考虑使用接口。

1.接口的基本概念

1.1 接口定义:

​ 接口是抽象方法全局常量的集合(JDK8以前),接口是更加纯粹的抽象方法。在java中接口使用interface关键字定义;

定义一个简单接口(为了区分接口,在定义时在接口名前加 I );

interface IMessage{
    //全局常量  在声明时赋值
    public static final String MSG="I am a bitter";
    public abstract void print();
}

1.2 子类实现接口:

接口无法直接实例化,通过子类向上转型完成

子类实现接口使用implements关键字,子类可以同时实现多个接口(接口多继承),但同时要覆写所有方法。同时子类实例化对象可以赋值给其中任意一个接口

子类必须覆写所有抽象方法。子类命名一般使用impl结尾(表示这是一个实现了接口的子类),两个接口以上选择主要接口 。

**父接口的相互转换:**多个接口若有共同子类,可以通过子类进行相互转换(new在哪,)

interface  IMessage{//定义一个接口
    public static final String MSG ="hello java";//全局常量
    public abstract void print();//抽象方法
}
interface  INews{//接口
    public abstract String getNews();//抽象方法
}
class MessageImpl implements IMessage,INews{//子类实现多个接口
    public void print(){//子类覆写接口中的抽象方法
        System.out.println(IMessage.MSG);
    }
    public String getNews(){//子类覆写接口中的抽象方法
        return IMessage.MSG;
    }
}
public class Test1{
    public static void main(String[] args) {
        IMessage message =  new MessageImpl();//向上转型
        //只能使用接口中的方法
        message.print();//调用被覆写后的方法
        INews news = (INews) message;//父接口之间的相互转化
        System.out.println(news.getNews());
    }
}

1.3 接口使用原则

1)接口中只允许 public权限(无论属性方法,其权限都是public)

​ 在接口中 public static final abstract 均可以省略不屑,抽象类中一个也不能省略

interface IMessage{//定义一个接口
    static final String MSG = "hello  java";//全局常量
    abstract void print();//不写权限默认为public
}
class MessageImpl implements IMessage{
    void print(){//没写权限为default
       System.out.println("接口的抽象方法!");
    }    
} 
public class Test29{
    public static void main(String[] args){
        IMessage m = new MessageImpl();
        m.print();
    }
}

99%的接口只提供抽象方法,很少在接口中提供全局常量;

阿里编码规约:接口中的方法和属性不加任何修饰符,public 也不加,保持代码的简洁性

interface IMassage {
    String MSG = "hello java";
    void print;
}
2) 当子类既需要实现接口又需要继承抽象类时,先使用extends 继承一个抽象类,而后使用 implements 实现多个接口(因为继承是单继承,实现是多实现)

当父类与父接口也有共同子类时,父类与父接口也可以通过子类相互转换

interface IMessage{//定义一个接口
    static final String MSG = "hello  java";//全局常量
    abstract void print();
}
abstract class News{
    public abstract void getMsg();
}
class MessageImpl extends News implements IMessage{//先继承抽象类再实现接口
    public void print(){
       System.out.println("接口的抽象方法!");
    }
    public void getMsg(){
        System.out.println("抽象类的抽象方法!");
    }
    
} 
public class Test29{
    public static void main(String[] args){
        IMessage m = new MessageImpl();
        m.print();
        //父接口与父类的相互转换
        News news = (News) m;
        news.getMsg();
        
    }
}

3)抽象类可以使用 implements实现若干个接口,但是接口无法继承抽象类
interface IMessage{
    void print();
}
abstract class News implements IMessage{//抽象类实现接口
    //News 为抽象类,可以覆写 IMessage 中的抽象方法
    //抽象类中的方法前面abstract 不能省略,否则就是普通方法
    public abstract void getNews();//抽象类中的抽象方法
}
class MessageImpl extends News{//子类实现接口
    //覆写接口中所有的抽象方法
    public void print(){
        System.out.println("子类覆写接口中的抽象方法!");
    }
    public void getNews(){
        System.out.println("子类覆写抽象类中的抽象方法!");
    }

}
public class Test32{
    public static void main(String[] args){
        MessageImpl messageImpl = new MessageImpl();
        messageImpl.print();
        messageImpl.getNews();
    }
}
//接口不能继承重选ing类
interface IMessage{
    void print();
}
abstract class News implements IMessage{//抽象类实现接口
    //News 为抽象类,可以覆写 IMessage 中的抽象方法
    //抽象类中的方法前面abstract 不能省略,否则就是普通方法
    public abstract void getNews();//抽象类中的抽象方法
}
class MessageImpl extends News{//子类实现接口
    //覆写接口中所有的抽象方法
    public void print(){
        System.out.println("子类覆写接口中的抽象方法!");
    }
    public void getNews(){
        System.out.println("子类覆写抽象类中的抽象方法!");
    }
}
interface QQmessage extends News{//此处报错 
    void print2();
}

此处的implements IMessage 只是为了强调 MessageImpl 是 IMessge 的实现类

class MessageImpl extends News implements IMessage{//
      public void print(){
        System.out.println("子类覆写接口中的抽象方法!");
    }
    public void getNews(){
        System.out.println("子类覆写抽象类中的抽象方法!");
    }
}
4)接口之间可以使用extends继承多个父接口
interface A{//接口A
    void PlayA();
}
interface B{//接口B
    void PlayB();
}
interface C extends A,B{//接口C继承接口A,B  接口可以实现多继承
    void PlayC();
}
class CImpl implements C{//子类实现接口
    public void PlayA(){//覆写接口抽象方法
        System.out.println("接口A的抽象方法");
    }
    public void PlayB(){//覆写接口抽象方法
        System.out.println("接口B的抽象方法");
    }
    public void PlayC(){//覆写接口抽象方法
        System.out.println("接口C的抽象方法");
    }
}
public class Test30{
    public static void main(String[] args){
        C c = new  CImpl();
        c.PlayA();
        c.PlayB();
        c.PlayC();
    }
}
5)接口可以定义一系列的内部结构,包括 :内部普通类,内部接口,

2.接口的应用

2.1 定义标准
interface USB{
    void setup();
    void work();
}
class Compture{//定义一个电脑类使用usb
    public void plugin(USB usb){
        usb.setup();
        usb.work();
    }
}
class UDisk implements USB{//子类实现接口
    public void setup(){
        System.out.println("U盘安装驱动");
    }
    public void work(){
        System.out.println("U盘正常工作");
    }
}
class PrintDisk implements USB{
    public void setup(){
        System.out.println("键盘按装驱动");
    }
    public void work(){
        System.out.println("键盘正常工作");
    }
}
public class Teat31{
   public static void main(String[] args){
      Compture compture = new Compture();
      compture.plugin(new UDisk());
      compture.plugin(new PrintDisk());
   }
}

2.2 表示能力

2.3抽象类与接口的区别

区别抽象类(abstract)接口(interface)
组成结构普通方法,抽象方法全局常量 抽象方法
权限所有权限只有public
子类使用使用extends继承(单继承)使用implement实现(多实现)
关系一个子类可以实现多个接口接口不能继承抽象类;接口可以使用extends继承多个父接口
子类限制一个子类只能继承一个抽象类一个子类可以实现多个接口
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值