java基础篇 之 接口
组合接口时的名字冲突:
看下面这段代码:
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();
}
}