通常使用java 的接口时都是不带修饰符的
public interface Test {
int a = 0;
void test();
}
其实这个里面有好多修饰符都是默认省略掉了。
正确的类型应该是:
public interface Test {
public static final int a = 0;
public void test();
}
public static final int a = 0;
public void test();
}
省略的都是默认必须要带的修饰。
接口中除了这几个常见的方法和属性外还有一些其他用法。
1、静态方法
静态方法必须要有方法体,并且静态方法是不能被实现类实现的,只能通过接口调用这个方法,例如:Test.test2();
public interface Test {
public static final int a = 0;
public void test();
public static void test2(){ //正确的
}
public static void test3();//错误的
}
2、java1.8 default修饰方法
default加入就是为了解决接口中不能有默认方法的问题,在实现类中可以重写这个default方法也可以不重写。
default修饰的方法跟接口中的静态方法区别是default方法可以被实现类重写,这样可以得到扩展并且不修改原来接口中功能,而静态方法就有点太苛刻了,还不如把静态方法写在实现类中,这样每个实现类都可以自己写自己的功能实现。
public interface Test {
public static final int a = 0;
public void test();
public static void test2(){
System.out.println("test2");
}
default void test3(){
}
default void test4();//错误,default修饰方法必须要有实现体
}
3、错误情况
在接口中方法都是不能用private和protected修饰的,这两种修饰就违背了面向对象的原则。
private好理解,接口是需要被实现才有意义的,不能被实现也就没有意义了。
protected需要理解面向对象的概念,protected是不在一个包内不能被访问,所以在类和接口不在同一个包内时就会有问题。
假设public接口I有一个protected方法M,那么位于其他包的public类C就可以实现这个接口(方法M依然是protected)。那么C的同包类D调用方法M只能这样访问:
C c = new C();
c.M();
无法这样访问:
I c = new C();
c.M();
这样就失去了使用接口的重要意义:提供统一的接口,面向接口编程思想也无法体现。
4、为什么接口中的属性必须是public static final 修饰的
public跟方法的原因一样了
static:我们假设有两个接口A和B,而类C实现了接口A和B。假设,此时,A和B中都有一个变量N,如果N不是static类型的,那么在C中该如何区分N到底是A的还是B的呢?而,如果是static类型的,我们可以通过A.N和B.N来区别调用A或者B中的成员变量N。
final:接口是一种通用的协议存在的,多个类实现同一个接口可以方便针对这个接口的调用类对接,所以final就是为了禁止在接口中不同的实现类修改属性造成混乱。如果变量不是final,那么每个实现接口的类就可以更改这个变量的值,也就违反了OCP(开闭原则)原则。
对于java接口的功能还是需要在使用中慢慢理解,掌握其中微妙的变化带来的不同功能。