• 接口


                                                   接口

    一、接口的定义与使用

    抽象类与普通类相比最大的特点就是约定了子类的实现要求,但是抽象类存在单继承的局限。如果既要约定子类的实现要求且要避免单继承局限就要使用接口。(接口优先

    1、接口的基本概念

       接口就是抽象方法和全局常量的集合,在Java中接口欧使用interface关键字定义。(一般为区分接口,建议在接口前面加大写字母I

       子类若想使用接口,要使用implements关键字来实现接口。且一个子类可以实现多个接口(即可以使用接口来实现多继承),对于接口的子类(非抽象类)必须覆写接口中的所有抽象方法。可以利用子类的向上转型通过实例化子类来得到接口的实例化对象。

    //接口

    interface IMessage{

        //可省略

    public static final String MSG = "我是一个学生";

    //抽象方法

    public abstract void fun();

    }

    interface INews{

    public abstract String getNews();

    }

    class MessageImpl implements IMessage,INews{

    //覆写IMessage的抽象方法

    public void fun(){

    System.out.println(IMessage.MSG);

    }

    //覆写INews的抽象方法

    public String getNews(){

    return IMessage.MSG;

    }

    }

    public class Test6{

    public static void main(String[] args) {

    IMessage message = new MessageImpl();//向上转型,为父类接口实例化对象

    message.fun();//被子类覆写的方法

    INews news = (INews)message;//向下转型

    System.out.println(news.getNews());

    }

    }

     

    2、接口的使用限制

    a.接口中只允许使用public权限,不论是属性耗时方法,其权限都是public.

    错误代码

    //接口中抽象方法的权限是public(即使不写也是)

    interface IMessage{

    abstract void fun();//接口中方法不写权限默认为pubic

    }

    class MessageImpl implements IMessage{

    //普通类中方法不写权限默认为default

    //所以有比其接口更严格的控制权限,不能实现覆写

    void fun(){

    System.out.println("hehe");

    }

    }

    public class Test6{

    public static void main(String[] args) {

    IMessage message = new MessageImpl();

    message.fun();

    }

    }


    b.当一个子类既需要实现接口又需要继承抽象类时,应先使用extends继承一个抽象类,再使用implements实现多个接口。

    interface IMessage{

    //接口中抽象方法的public abstract可省略,且默认为public

    void fun();

    }

    abstract class News{

    //抽象类中的抽象方法的abstract不可以省略,否则为普通方法

    public abstract void getNews();

    }

    class MessageImpl extends News implements IMessage{

    public void fun(){

    System.out.println("haha");

    }

    public void getNews(){

    System.out.println("hehe");

    }

    }

    public class Test6{

    public static void main(String[] args) {

    IMessage message = new MessageImpl();//向上转型实例化接口对象

    message.fun();//调用被覆盖方法

    News news = (News)message;//向下转型实例化抽象类

    news.getNews();//调用被覆写的方法

    }

    }

     

    c.一个抽象类可以使用implements实现多个接口,但是接口不可继承抽象类。

    interface IMessage{

    void fun();

    }

    //抽象类实现接口

    abstract class News implements IMessage{

    //News为抽象类,可以不实现接口中的抽象方法

    public abstract void getNews();

    }

    //MessageImpl类继承抽象类News

    class MessageImpl extends News{

    public void fun(){

    System.out.println("我是实现接口的方法");

    }

    public void getNews(){

    System.out.println("我是覆写抽象类中的抽象方法");

    }

    }

    public class Test6{

    public static void main(String[] args) {

    IMessage message = new MessageImpl();//向上转型实例化接口对象

    message.fun();//调用被覆盖方法

    News news = (News)message;//向下转型实例化抽象类

    news.getNews();//调用被覆写的方法

    }

    }

     

    d.一个接口可以使用extends继承多个父接口

    interface IA{

    void fun1();

    }

    interface IB{

    void fun2();

    }

    interface IC extends IA,IB{

    void fun3();

    }

    class Message implements IC{

    public void fun1(){

    System.out.println("我是接口IA的实现");

    }

    public void fun2(){

    System.out.println("我是接口IB的实现");

    }

    public void fun3(){

    System.out.println("我是接口IC的实现");

    }

    }

    public class Test6{

    public static void main(String[] args) {

     IA a = new Message();

     a.fun1();

     IB b = new Message();

     b.fun2();

     IC c = new Message();

     c.fun1();

    }

    }

     

    3、接口的应用

       定义标准、表示能力、在分布式开发中暴露远程服务方法

     定义标准:

        

    //定义一个USB标准

    interface USB{

    public void setup();//安装USB驱动

    public void work();//进行工作

    }

    //定义电脑类

    class Computer{

    //只能插usb设备

    public void plugin(USB usb){

    usb.setup();//安装

    usb.work();//工作

    }

    }

    //定义USB子类

    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 Test6{

    public static void main(String[] args) {

    Computer computer = new Computer();

    computer.plugin(new UDisk());

    computer.plugin(new printDisk());

    }

    }

  • 相关阅读:
    Java核心技术点之动态代理
    一起写一个Android图片加载框架
    Java核心技术点之注解
    Android中的Intent Filter匹配规则介绍
    阿里客户端工程师试题简析——Android应用的闪退(crash)分析
    Android开发之高效加载Bitmap
    Java NIO:浅析I/O模型
    深入探索Android中的Handler
    git常用命令
    SM2
  • 原文地址:https://www.cnblogs.com/edda/p/12602142.html
Copyright © 2020-2023  润新知