A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© DH柯 中级黑马   /  2015-1-10 09:24  /  1300 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文




在Java中看到接口,第一个想到的可能就是C++中的多重继承和Java中的另外一个关键字abstract。从另外一个角度实现多重继承是接口的功能之一,接口的存在可以使Java 中的对象可以向上转型为多个基类型,并且和抽象类一样可以防止他人创建该类的对象,因为接口不允许创建对象。
定义接口的关键字:interface。实现接口的关键字:implements。
    接口:是一些方法特征的集合。它定义的是一组功能(方法)规则。
    作用:在不同事物(类)中抽象出共同功能点(方法),形成一组公开的功能规则(接口)
    来制约某些事物(类)的功能实现。换句话说:接口就是对类的功能(方法)抽象。
    特点:
    1. 不能够被实例化
    2. 接口中的成员自动设为public
    3. 接口中不能够出现方法体的实现
    4. 接口中的属性全为静态常量
    5. 实现某个接口的类,必须实现其中所有的方法
    6. 类可以实现多个接口
    7. 接口可以继承接口
interface 关键字用来声明一个接口,它可以产生一个完全抽象的类,并且不提供任何具体实现。interface 的特性整理如下:
1. 接口中的方法可以有参数列表和返回类型,但不能有任何方法体。
2. 接口中可以包含字段,但是会被隐式的声明为static 和final 。
3. 接口中的字段只是被存储在该接口的静态存储区域内,而不属于该接口。
4. 接口中的方法可以被声明为public 或不声明,但结果都会按照public 类型处理。
5. 当实现一个接口时,需要将被定义的方法声明为public 类型的,否则为默认访问类型,Java 编译器不允许这种情况。
6. 如果没有实现接口中所有方法,那么创建的仍然是一个接口。
7. 扩展一个接口来生成新的接口应使用关键字extends ,实现一个接口使用implements 。
8. 接口中的方法是抽象方法(abstract),不能是静态方法(static).接口的所有方法都是抽象的,而抽象方法是没有static,有static的方法是不能override的,所以这样定义接口才有意义。

具体第八点的解释:
在Thinking in Java中有这样的描述:
The interface keyword produces a completely abstract class, one that provides no implementation at all. It allows the creator to determine method names, argument lists, and return types, but no method bodies. An interface provides only a form, but no implementation.(接口是完全抽象的一个类,不提供任何实现)

接口中的字段默认就是并且必须是public static final的,不是你所说的实例字段. 字段只能是属于类变量,不可以是实例变量.

同样在Thinking in Java中有:
When you say something is static, it means that particular field or method is not tied to any particular object instance of that class.(接口中静态的属性或者方法均与具体的实例无关)
如果你在接口中将方法声明为静态的(与具体的实例无关),但接口中的方法又要求必须被实现类去实现(可能会有多个实现类),这岂不是自相矛盾!

interface 在某些地方和abstract 有相似的地方,但是采用哪种方式来声明类主要参照以下两点:

1.如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类。

2.如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类。

以上就是接口的基本特性和应用的领域,但是接口绝不仅仅如此,在Java 语法结构中,接口可以被嵌套,既可以被某个类嵌套,也可以被接口嵌套。这在实际开发中可能应用的不多,但也是它的特性之一。需要注意的是,在实现某个接口时,并不需要实现嵌套在其内部的任何接口,而且,private 接口不能在定义它的类之外被实现。

在java语言中,接口有两种意思:

一、是指概念型接口,即指系统对外提供的所有服务.类的所有能被外部使用者访问的方法构成类的接口

二、是指接口类型,它用于明确的描述系统对外提供的所有服务,能够更加清晰地把系统的实现细节与接口分离.

接口类型和抽象类型表面上有些相似.接口类型和抽象类型都不能被实例化.所以我们可以用接口来定义一个类的表现形式,但接口不能包含任何实现.

用关键字interface,可以从类的实现中抽象一个接口,也就是说,用interface是在指定一个类必须要做什么,但不是规定它如何去做.

一旦接口被定义,任何类都可以实现该接口(一个接口可以由任意类实现),而且一个类可以实现多个接口.

//定义接口

例: public interface Photographable{

                     public void takePhoto();//接口方法

                 }

接口类的访问符只有两种:public访问符,或者默认访问符.当没有访问修饰符时,则是默认访问范围,即在包内可以使用该接口.当使用public访问符时,则表明该接口类可以被任何代码使用.

public void takePhoto();是接口中定义的方法,接口中定义的所有方法没有方法体,并以分号”;”作为结束,其本质就是抽象方法

接口定义后一个或多个类可以实现该接口.要实现一个接口,在类中必须包含implements子句,然后实现接口中定义的方法.

//类实现接口

例: public class Camera implements PhotoGraphable{

                     public void takePhoto(){};//实现接口方法

                 }

如果一个类实现多个接口(一个类可以实现多个接口),这些接口名之间需用逗号分开.

接口没有构造方法,不能被实例化.但允许定义接口类型的引用变量,该变量引用这个接口的实现类的实例.

可以在接口声明中声明变量,它们都是隐式的final变量和static变量,这意味着它们不能被实现类修改,而且必须用常量值进行初始化.

例: public interface Gforce{

          public static final double = 9.8; //定义程序使用的常量接口

   }

接口中的方法默认都是public、abstrcat类型的.

例: public interface A{

          int CONT = 1; //合法;CONT默认为public、static、final类型

           void method(); //合法;默认为public、abstrcat类型

          public abstract void method2(); //合法;显示声明为public、abstrcat类型

   }

接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法.

一个接口不能实现另一个接口,但它可以继承多个其它接口(接口可以继承).当一个类实现一个继承了另一个接口的接口时,它必须实现接口继承链中定义的所有接口.

例: interface A{

       void methodA();

     }

    interface B extends A{

       void methodB();

     }

    public class C implements B{

        public void methodA(){} //实现接口A

        public void methodB(){} //实现接口B

     }

一个类只能继承一个直接的父类,但能实现多个接口.

例: public class Sub extends Base implements A,B,C{……}

与子类继承抽象父类相似,当类实现了某个接口的时候,它必须实现接口中的所有抽象方法,否则这个类必须被定义为抽象类.


2 个回复

倒序浏览
谢谢楼主分享
回复 使用道具 举报
这么详细。。。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马