【Java】interface

接口由抽象类演化而来。

抽象类中,可以包含一个或多个抽象方法。甚至没有抽象方法时也可以将这个类声明成抽象类以防止其实例化。

但在接口中,所有方法都必须是抽象的,不能包含方法体。可以说,接口比抽象类更抽象。用interface关键字声明。

和类一样,接口之间可以继承,而且接口还可以多继承。


1. 接口不能被实例化。不允许使用new关键字来构建接口的实例,接口都没有构造方法。


2. 试图在接口中定义实例变量,非抽象的实例方法和静态方法,都是非法的。

1) 接口中的方法默认是public abstract的。

试想,如果接口中的方法可以声明成static的,

那么可以通过类名.method()来调用,但接口中的方法并没有实体,那么就矛盾了,如何调用呢?


2) 接口中声明的成员变量默认是public static final的,被看做静态常量,必须显式地初始化。

那么为什么接口中的成员变量必须是public static final的呢?

接口作为一种高度抽象的模板,接口也必须要实现才有意义,从这个层面说必须是public的。

接口中的属性也是模板的成员。也就是说,接口的所有实现类都应当共有这个属性,那么它必须是public static的。 

其次,接口中如果可以定义非final的变量,而方法又都是abstract的,那么就矛盾了:有了成员变量,但方法无法操作这些

成员变量。虽然某个实现类可以通过类名.变量来直接修改这些静态成员变量的值,但这样一来所有实现类对应的变量值都被

修改了,这和抽象类有什么区别呢?所以接口中不能出现变量,如果有变量,就和接口提出的统一的抽象的思想是矛盾的。

所以接口中的属性必然是常量,可读不可写,这样才能为实现接口的对象提供统一的属性。

接口是一种更高层面的抽象,是一种规范,功能定义的声明,所有可变的东西都应该归属到实现类中,这样接口才能起到标准化,规范化的作用。


3. 一个接口不实现另一个接口,但可以继承多个其他接口,接口的多继承特点弥补了类的单继承。

public interface SataHdd extends A, B{

    public static final int CONNECT_LINE=4;
    public void writeData(String data);
    public String readData();
}

interface A {
	public void a();
}
interface B {
	public void B();
}

4. 一个类只能继承一个父类,但可以实现多个接口

实现接口的格式如下:
修饰符 class 类名 extends 父类 implements 多个接口 {
    实现方法
}
如果一个类不能实现该接口的所有抽象方法,那么这个类必须被定义为抽象方法。

5. 为什么使用接口


大型项目开发中,可能需要从继承链的中间插入一个类,让它的子类具备某些功能而不影响它们的父类。例如 A -> B -> C -> D -> E,A 是祖先类,如果需要为C、D、E类添加某些通用的功能,最简单的方法是让C类再继承另外一个类。但是问题来了,Java 是一种单继承的语言,不能再让C继承另外一个父类了,只到移动到继承链的最顶端,让A再继承一个父类。这样一来,对C、D、E类的修改,影响到了整个继承链,不具备可插入性的设计。

接口是可插入性的保证。在一个继承链中的任何一个类都可以实现一个接口,这个接口会影响到此类的所有子类,但不会影响到此类的任何父类。此类将不得不实现这个接口所规定的方法,而子类可以从此类自动继承这些方法,这时候,这些子类具有了可插入性。

我们关心的不是哪一个具体的类,而是这个类是否实现了我们需要的接口。

接口提供了关联以及方法调用上的可插入性,软件系统的规模越大,生命周期越长,接口使得软件系统的灵活性和可扩展性,可插入性方面得到保证。

接口在面向对象的 Java 程序设计中占有举足轻重的地位。事实上在设计阶段最重要的任务之一就是设计出各部分的接口,然后通过接口的组合,形成程序的基本框架结构。


6. 接口作为类型使用

接口作为引用类型来使用,任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类中所实现的接口中的方法,Java 运行时系统会动态地确定应该使用哪个类中的方法,实际上是调用相应的实现类的方法。

public class Demo{
    public void test1(A a) {
        a.doSth();
    }
    public static void main(String[] args) {
        Demo d = new Demo();
        A a = new B();
        d.test1(a);
    }
}
interface A {
    public int doSth();
}
class B implements A {
    public int doSth() {
        System.out.println("now in B");
        return 123;
    }
}



猜你喜欢

转载自blog.csdn.net/michellechouu/article/details/48751033
今日推荐