组合接口时的名字冲突:
看下面这段代码:
interface I1 { int f(); } interface I2 { void f(); } interface I3 { int f(int a); } class C { public void f() { System.out.println(1); } } class C1 extends C implements I2 { } class C2 extends C implements I3 { @Override public int f(int a) { return 1; } } //这里报错了,是因为覆盖,实现跟重载被混在了一起 //C3继承了C,这个时候就有了一个void f()的方法 //C3实现了I1,就不得不实现它的int f() //这个时候,C3就会出现两个同名函数,这显然是错误的 //class C3 extends C implements I1 { // //}
接口中的域:
因为放入接口中的任何域都是自动static和final的,所以接口就成了一种很便捷的用来创建常量的工具。
public class Interface { // 成员变量省略了 public static final // 接口不能初始化,如果要访问接口中的属性,只能通过类名直接调用,所以必须public+static // 接口中的字段会被所有接口的实现类共享,所以不能被某一个子类所改变,以避免对其他子类造成影响 // 所以必须final String ONE = "1"; String TWO = "2"; }
嵌套接口:
class Test { private interface B { void f(); } class BImpl implements B { @Override public void f() { System.out.println(1); } } public B getB() { return new BImpl(); } } public class Interface { public static void main(String[] args) { Test t = new Test(); t.getB(); } }
我们看这种情况,提出一个问题,t.getB();的返回值我们要怎么接收呢?返回的是一个类中的私有的接口类型的对象。我们直接t.B肯定是不行的。这个时候,我们只能将返回值交给有权使用它的对象,所以我们要多定义一个属性或者方法
class Test { private interface B { void f(); } class BImpl implements B { @Override public void f() { System.out.println(1); } } public B bRef; public B getB() { return new BImpl(); } } public class Interface { public static void main(String[] args) { Test t = new Test(); t.bRef = t.getB(); } }