zoukankan      html  css  js  c++  java
  • Java基础——接口

    一:接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。

     封装与接口中,private关键字封装了对象的内部成员。经过封装,产品隐藏了内部细节,只提供给用户接口(interface)。

    接口是非常有用的概念,可以辅助我们的抽象思考。在现实生活中,当我们想起某个用具的时候,往往想到的是该用具的功能性接口。比如杯子,我们想到加水和喝水的可能性,高于想到杯子的材质和价格。也就是说,一定程度上,用具的接口等同于用具本身。内部细节则在思考过程中被摒弃。

     

     

     在public和private的封装机制,我们实际上同时定义了类和接口,类和接口混合在一起。Java还提供了interface这一语法。这一语法将接口从类的具体定义中剥离出来,构成一个独立的主体。

     


    二:

    interface 

    语法:


    1. interface 接口名{ }

    以杯子为例,定义一个杯子的接口:

    interface Cup {
        void addWater(int w);
        void drinkWater(int w);
    }

    Cup这个interface中定义了两个方法的原型(stereotype): addWater()和drinkWater()。一个方法的原型规定了方法名,参数列表和返回类型。原型可以告诉外部如何使用这些方法。

    在interface中,

    • 不需要定义方法的主体
    • 不需要说明方法的可见性

     


    三:接口使用 

      使用 implements 关键字实现接口 

             语法 

    1.  class 类名 implements 接口名{ }

    注意:

    1. 一个类的public方法构成了接口。所以,所有出现在interface中的方法都默认为public。
    2.  接口不能实例化,使用接口时需要子类实现接口

    3.  接口的实现  一个实现接口的类,必须实现接口内所有的方法,否则该类就必须声明为抽象类

     

    我们可以在一个类的定义中实施接口,比如下面的MusicCup (可以播放音乐的杯子):

    复制代码
    class MusicCup implements Cup 
    {
        public void addWater(int w) 
        {
            this.water = this.water + w;
        }
    
        public void drinkWater(int w)
        {
            this.water = this.water - w;
        }
    
        private int water = 0;
    }
    复制代码

    我们用implements关键字来实施interface。一旦在类中实施了某个interface,必须在该类中定义interface的所有方法(addWater()和drinkWater())。类中的方法需要与interface中的方法原型相符。否则,Java将报错。

    在类中可以定义interface没有提及的其他public方法。也就是说,interface规定一个必须要实施的最小接口。比如下面的waterContent()方法就没有在Cup接口中规定原型:

    复制代码
    class MusicCup implements Cup 
    {
        public void addWater(int w) 
        {
            this.water = this.water + w;
        }
    
        public void drinkWater(int w)
        {
            this.water = this.water - w;
        }
    
        public int waterContent()
        {
            return this.water;
        }
    
        private int water = 0;
    }
    复制代码

    四:分离接口的意义

    我们使用了interface,但这个interface并没有减少我们定义类时的工作量。我们依然要像之前一样,具体的编写类。我们甚至于要更加小心,不能违反了interface的规定。既然如此,我们为什么要使用interface呢?

    事实上,interface就像是行业标准。一个工厂(类)可以采纳行业标准 (implement interface),也可以不采纳行业标准。但是,一个采纳了行业标准的产品将有下面的好处:

    • 更高质量: 没有加水功能的杯子不符合标准。
    • 更容易推广: 正如电脑上的USB接口一样,下游产品可以更容易衔接。

    如果我们已经有一个Java程序,用于处理符合Cup接口的对象,比如领小朋友喝水。那么,只要我们确定,我们给小朋友的杯子(对象)实施了Cup接口,就可以确保小朋友可以执行喝水这个动作了。至于这个杯子(对象)是如何具体定义喝水这个动作的,我们就可以留给相应的类自行决定 (比如用吸管喝水,或者开一个小口喝水)。

    在计算机科学中,接口是很重要的概念。比如任何提供UNIX接口的操作系统都可以称作UNIX系统。Linux,Mac OS,Solaris都是UNIX系统,它们提供相似的接口。但是,各个系统的具体实施(源代码)互不相同。Linux是开源的,你可以查看它的每一行代码,但你还是不知道如何去编写一个Solaris系统。


     

    五:实施多个接口

    一个类可以实施不止一个的interface。比如我们有下面一个interface:

    interface MusicPlayer {
        void play();
    }

    我们再来考虑MusicCup类。MusicCup可以看做播放器和杯子的混合体。

    所以MusicCup应该具备两套接口,即同时实施MusicPlayer接口和Cup接口:

    复制代码
    class MusicCup implements MusicPlayer, Cup
    {
        public void addWater(int w) 
        {
            this.water = this.water + w;
        }
    
        public void drinkWater(int w)
        {
            this.water = this.water - w;
        }
    
        public void play()
        {
            System.out.println("la...la...la");
        } 
        private int water = 0;
    }
    复制代码

      


    六.抽象类和接口的区别

      1)抽象类可以提供成员方法的实现细节,而接口中的方法只能是抽象方法,默认修饰 符 public abstract

      2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是常量,默认的修饰符 public static final

      3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

      4)一个类只能继承一个抽象类,而接口主要目的是扩展功能,没有具体存在接口的多实现了,一个类却可以实现多个接口。

    注意:

     任何类都可以直接访问到接口中的常量


    七:总结

          1、 抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。

          2、 在抽象类中可以拥有自己的成员变量和非抽象类方法,但是接口中只能存在静态的不可变的成员数据(不过一般都不在接口中定义成员数据),而且它的所有方法都是抽象的。

          3、抽象类和接口所反映的设计理念是不同的,抽象类所代表的是“is-a”的关系,而接口所代表的是“like-a”的关系。

    抽象类和接口是java语言中两种不同的抽象概念,他们的存在对多态提供了非常好的支持,虽然他们之间存在很大的相似性。但是对于他们的选择往往反应了您对问题域的理解。只有对问题域的本质有良好的理解,才能做出正确、合理的设计。

  • 相关阅读:
    wonderful life
    .net 4.5 webform 提取ModelState错误信息
    asp.net core Theme 中间件
    asp.net mvc 动态编译生成Controller
    asp.net mvc中换肤机制类库 ThemedViewEngines
    vs code 添加jquery的智能提示
    vs2017 iisexpress 绑定自定义域名
    asp.net Mvc 动态创建Controller
    查询Windows api
    预先创建占用一定磁盘空间的文件(使用C#)
  • 原文地址:https://www.cnblogs.com/huan-guo/p/8384362.html
Copyright © 2011-2022 走看看