接口
一、接口的概念
在java语言中,接口不是类,而是符合这个接口的一组需求。
但是可以类比的来说,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
二、接口的规则
1> 接口中的成员变量
接口中的成员变量只能是常量,且权限修饰符是public
即:
public final
如果用其他权限修饰符修饰就会报错,如果没加上述修饰符,Java也会默认是这个,也可以说接口中没有实例字段,只有静态字段。
2> 接口中的方法
2.1 接口没有构造器,不能实例化,但可以用多态。
2.2 权限修饰符
接口中所有的方法都自动是public修饰的
2.3 方法的实现
静态和私有方法
在java8中,允许在接口中增加静态方法。
即,当我们这样声明的时候,接口中的方法可以有方法体:
public interface Test{
public static void go(){...}
}
3>接口的属性与类实现接口
3.1 接口的属性
接口虽然没有构造器,不能实例化,但是却可以用多态。 例如:
public interface Test{
public void go();
}
public class TestNow implements Test{
public TestNow(){}
}
class run(){
public static void main(){
//用多态
Test t = new TestNow();
}
}
如同使用instanceof检查一个对象是否属于一个特定的类一样,也可以使用instanceof检查一个对象是否实现了某个特定的接口。
例如:
if(anObject instanceof Test){......}
与类的继承一样,接口也有其自己的继承体系.。
仍然使用extends来继承 例如:
public interface Test1{...}
public interface Test2{...}
public interface Test extends Test1,Test2{...}
3.2 类实现接口
要将类实现某个接口,必须使用关键字implements。
并且,类必须重写接口中的实例方法
类可以实现多个接口
public interface Test1{
public void go();
}
public interface Test2{
public void run();
}
public class TestNow implements Test1,Test2{
public void go(){...}
public void run(){...}
}
三、接口与抽象类
1> 接口相较于抽象类的必要性
可能有人会有一个疑问:为什么已经有了抽象类可以供继承了,为什么还要引入一个接口的概念?
我们要注意到,使用抽象类表示通用属性存在一个严重的问题:每个类只能继承一个类。假设我们有一个类已经继承了一个类了,它就不能再继承第二个类了。
但每个类可以实现多个接口!
有些语言(例如C++),支持一个类继承多个父类,但是,这种多重继承会让语言变得十分复杂。
2> 解决接口与抽象类的默认方法冲突
如果先在一个接口中将一个方法定义为默认方法,然后又在超类或者另一个接口中定义同样的方法。这就构成了冲突,那对于这种冲突,java有他自己的规则。
超类优先。如果超类提供了一个具体的方法,同名而且有相同的参数类型的默认方法将会被忽略。
接口冲突。如果一个接口提供了一种默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决冲突。