Java核心技术笔记:接口
Java 核心技术:接口
概念
什么是接口?接口不是类,而是对类的一组需求的描述。接口是一种抽象类型,接口中包含了从需求中抽象出来的许多抽象方法,这一点看起来和抽象类很像,但是接口并不是类,接口和抽象类之间有很大的差别。
定义接口
定义接口的关键字是:interface
public interface Person{ String getName(); int getAge(); }
接口中的方法默认为是public属性的,因此在接口中申明方法时可以不提供关键字public。
注意:
1.接口中不能包含实例域,但是接口中可以包含常量,与接口方法一样,接口中的域默认都是public static final的。
2.在java8中,接口中可以包含默认方法和静态方法。
实现接口
实现接口的关键字:implements
通常一个类实现一个接口会有两个步骤:
1.将类声明为实现给定的接口。
2.对接口中的所有方法进行实现。
public Class Student implements Person{ @Override public String getName(){ //todo } @Override public int getAge(){ //todo } }
在java中类只能单继承,一个类只能有一个直接的父类。但是接口可以多实现,一个类可以实现多个接口,接口之间用逗号隔开即可。如果一个类实现了一个接口,则必须实现接口中的除了默认方法外的所有方法,默认方法如果没有在实现类中实现,则默认使用接口中的实现,如果在实现类中有所实现,则使用实现类中的实现。
默认方法和静态方法
默认方法是java8为接口增加的一个新特性,可以为接口中的方法提供一个默认实现,但是必须用关键字default修饰符标记这个方法。接口中被声明为default的方法在实现类中可以不进行实现,这样就会使用接口中的默认实现。
public interface Person { default String getName(){ return "hello"; } }
默认方法的一个重要作用:接口演化。比如有个很久以前的接口,有很多类都实现了这个接口,在后期接口升级中因为功能的需要我们为这个接口新添加了几个方法。如果说新添加的这几个方法不是默认方法,我们就必须改动接口的所有实现类,否则以前的所有的实现类都不能编译。如果我们将新添加的方法标记为default,那么我们不改动以前的实现类也是可行的。
默认方法除了在接口演化中有着重要作用外,在其他方面也是有重要作用。比如,我们的某个类想要在鼠标双击事件中做一些处理,在获取鼠标点击的接口中提供了很多方法,但是我们只想在双击事件中做我们自己的事件处理,其他的我们都不关注。如果没有默认方法,按照以前的方法,我们必须把鼠标点击接口中的所有方法都进行实现,尽管有些方法我们并不关注,但是因为接口特性的关系,我们必须都得为其做一个简单的实现。但是有了默认方法,我们可以在接口中为方法都提供一个默认实现,等到实现类实现这个接口的时候就可以只实现自己关心的方法,不关心的方法可以不用在实现类中实现。
解决默认方法中的冲突
冲突一般有两种情况:
1.父类中的方法和接口中的方法冲突。
2.由于接口是可以多实现的,因此还有可能出现接口与接口中方法出现冲突。
冲突指的是:两个或多个方法的名字,参数列表,返回值完全相同。
在父类方法与接口方法冲突的情况下:这种冲突容易解决,java默认父类方法优先,接口中的所有方法都会被忽略,不管实现类有没有为接口中的方法提供一个实现,都会被忽略。
接口与接口中的方法出现冲突:如果两个接口中冲突的方法都不是默认方法,这种情况不算是冲突,只需要实现一个方法即可。如果有一个或多个默认方法,这种情况下编译器并不会直接使用其中的某个默认方法,而是会报错,这种情况下所有的默认方法对于这个实现类来说都不起作用,我们必须在实现类中实现该方法。
静态方法
接口中的静态方法和类中的静态的方法没有什么区别,静态方法也是java8中为接口增加的一个新特性。
接口与抽象类
接口看起来和抽象类没有什么区别,但是我们要明白的是,接口并不是一个类,接口可以多实现。抽象类是一个类,一个类只能继承一个类。这是他们的最大区别。接口的出现是的java能够提供多重继承的大多数好处,同时还能避免多重继承带来的复杂性和低效性。
接口的特性
1.不能直接构造接口的对象。
2.可以定义接口变量,但是他必须引用实现了接口的类对象。
3.接口可以被扩展。和类的继承一样,接口可以继承其他的接口,也是用关键字extends.接口的继承与类的继承有所不同,一个类只能继承一个类,但是一个接口能继承多个接口。