接口|青训营笔记

84 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记 继承能不用就尽量不用。 当不确定用继承还是接口的时候,一概使用接口。 继承中,两个类的关系,一般可以从子类开始说,子类 is 父类 能说的通,用继承就比较合适。说不通,全用接口。

接口 接口对应于现实世界中一些实现,标准,规则规范等内容。 比如USB接口,手机充电接口等,门和门铃,门和锁。都是类和接口之间的关系。

电脑和U盘:电脑和U盘绝不应该是继承关系 门和门铃:

语法: 修饰符 interface 接口名{

}

接口实际上是一个受到了限制的类,这句话有2个含义

  1. (受到了限制的类)接口里面可以写的东西没有类那么多,比如不能有构造块,不能有构造器,不能有实例属性等等。。。
  2. 受到了限制的类基本上也可以当作类来看待,所以接口在Java中的地位和类是等同的。

接口中可以放的内容随着Java的版本不同有很大区别:

接口中可以写哪些内容? public abstract interface Abc { //接口默认也是抽象的 public static final int i = 1; //接口中只有常量,没有变量,并且默认修饰符是public static final可以不写 public abstract void f(); //接口中的方法默认修饰符是public和abstract的

public static void g() {} //接口中可以有public static方法,并且这种方法可以有实现
private void h() {}  //接口中可以有private方法,且这种方法必须有实现(方法体)
public default void i() {}  //接口中可以有default方法且必须有实现(这种default不能用在class类里面)

}

接口怎么使用?

  1. 接口不能创建对象,但是可以用于声明变量 public interface I {} I i; I[] iii;

  2. 接口和接口之间通过extends进行继承,同时接口和接口间的继承可以多重继承(一个接口继承多个父接口) public interface I {} public interface J {} public interface K extends I, J {}

  3. 接口和类(包括抽象类)之间通过implements进行实现(通常说某类实现某接口) public class C implements I, J{ //此时如果接口中有抽象方法,这个类必须实现或者是这个类自身变成抽象的 } 此时如果类和类之间也需要继承,又需要实现接口,那么应该先写extends,再写implements public class A { } public class C extends A implements I, J { } 和之前一样:所有的父类,父接口中一旦有抽象方法,这个类必须实现或者是这个类自身变成抽象的

  4. 接口一定是多态的 I i = new C(); J j = new C(); A a = new C();

例子: public abstract interface Abc { //接口2 public static final int i=1; public abstract void f(); public static void g(){} private void h(){}//接口中private方法存在的唯一意义就是给default方法进行调用 public default void i(){ h(); } } public class A implements Abc{ @Override public void f() {

}

} public class Test1 { public static void main(String[] args) { System.out.println(Abc.i); Abc.g();

    Abc i=new A();
    i.f();//类A一局实现了抽象方法,可以通过对象调用
    i.i();//default 方法可以通过对象调用
}

}

default 方法的冲突及其解决 default方法叫做默认方法,默认方法出现的含义是什么? 接口中提供的一个方法的默认实现,这个方法有了默认实现后,就不像抽象方法哪有必须被子类实现. 但是它体现的是一种"低配"的含义.

想"高配"怎么办?在实现了这个接口的类中覆盖这个默认方法就可以了.

default方法中的冲突? public abstract interface I{ public default void d(){ System.out.println("接口I中的默认方法d"); } } public abstract interface J{ public default void d(){ System.out.println("接口J中的默认方法d"); } } public class C implements I,J{ //此处C报错,因为它不知道到底用I里面的d还是J里面的d } 怎样解决冲突? 解决办法 谁的都不用 C自己覆盖 public class C implements I,J{ //此处C报错,因为它不知道到底用I里面的d还是J里面的d

@Override
public void d() {
    System.out.println("C自己覆盖的方法d");
}

}

几个重要的概念: 1.标记性接口 :一个接口里没有任何的方法 public abstract interface I{ } 2.函数式接口:一个接口里有一个抽象方法(有没有static,defult,常量等不重要) @FunctionalInterfce //和@Override 用来检验重写一样,@FunctionalInterface用来检验是不是函数式接口 public abstract interface I{ void f(); } 函数式接口用来存放一个lambda表达式