JAVA8新特性——Interface相关
概述
interface 的设计初衷是面向抽象,提高扩展性。这也留有一点遗憾,Interface 修改的时候,实现它的类也必须跟着改。
为了解决接口的修改与现有的实现不兼容的问题。新 interface 的方法可以用default 或 static 修饰,这样就可以有方法体,实现类也不必重写此方法。
default修饰的方法,是普通实例方法,可以用this调用,可以被子类继承、重写。static修饰的方法,使用上和一般类静态方法一样。但它不能被子类继承,只能用Interface调用。
静态成员
在Java8以前,我们要定义一些常量,一般会写一个类,类中都是final static的一些变量,如下:
public class Constants {
public static final int MAX_SERVICE_TIME = 100;
}
public class Hello {
public static void main(String[] args) {
System.out.println(Constants.MAX_SERVICE_TIME);
}
}
在Java8中Interface支持静态成员,成员默认是public final static的,可以在类外直接调用。
public interface MyInterface {
int MAX_SERVICE_TIME = 100;
}
public class Hello {
public static void main(String[] args) {
System.out.println(MyInterface.MAX_SERVICE_TIME);
}
}
default函数
在Java8以前,Interface中的函数是不能实现的,如下:
public interface MyInterface {
int MAX_SERVICE_TIME = 100;
void test();
}
在Java8中,Interface中支持函数有实现,只要在函数前加上default关键字即可,如下:
public interface MyInterface {
int MAX_SERVICE_TIME = 100;
void test();
default void doSomething() {
System.out.println("do something");
}
}
default函数,实现类可以不实现这个方法,如果不想子类去实现的一些方法,可以写成default函数。Java8之前,如果我们想实现这样的功能,也是有办法的,那就是先定义Interface,然后定义Abstract Class实现Interface,然后再定义Class继承Abstract Class,这样Class就不用实现Interface中的全部方法。
在接口中,增加default方法,是为了既有的成千上万的Java类库的类增加新的功能,且不必对这些类进行重新设计。因此它既被称为默认方法,又被称为拓展方法。
比如说,只需要在Collection接口中增加default Stream stream(),相应的Set和List接口以及它们的子类都会包含此方法,不必再去为每个子类重新copy这个方法。
static函数
在Java8中允许Interface定义static方法,这允许API设计者在接口中定义像getInstance一样的静态工具方法,这样就能够使得API简洁而精练,如下:
public interface MyInterface {
default void doSomething() {
System.out.println("do something");
}
}
public class MyClass implements MyInterface {
}
public interface MyClassFactory {
public static MyClass getInstance() { //用法和普通的static方法一样
return new MyClass();
}
}
可以通过调用 MyClassFactory.getInstance() 来获取一个 MyClass 实例,而无需直接调用 new MyClass() 来创建对象。这种方式可以将对象的创建逻辑集中在工厂方法中,使得代码更具可维护性和可扩展性。同时,接口中的默认方法允许在接口演化过程中向接口添加新的方法,而不会影响已有的实现类。
实现接口的类或者子接口不会继承接口中的静态方法。
接口和抽象类的异同?
相同点
- 都是抽象类型
- 都可以有实现方法
- 都可以不需要实现类或继承者实现所有方法
不同点
- 接口多实现,类单继承
- 接口不能具有构造方法,因为接口不能被实例化;抽象类可以有构造方法,可以用于初始化抽象类的状态或传递参数给子类的构造方法
- 接口的方法是
public abstract修饰,变量是public static final修饰。 抽象类可以用其他修饰符
记住接口永远和类不一样。
interface 的方法是更像是一个扩展插件。而 abstract class 的方法是要继承的。

浙公网安备 33010602011771号