接口中可以有非静态变量吗?

Java基础
接口中可以有静态变量吗?

这是我在面试中碰到的一道面试题。如果对八股文特别熟悉的同学可能会想到这是在常见面试题“接口和抽象类的区别”中一个小知识点,即接口中只能包含静态属性,由public static final修饰,并且必须初始化赋值

那么为什么接口中只能包含静态属性,由public static final修饰,并且必须初始化赋值呢?

如果不是public,它的子类访问不到这个变量,接口本身也无法实例化,则这个变量毫无意义。

如果不是static,一个类实现多接口,而多接口具有同名变量,实现类就不知道该访问哪一个。并且使用static可以避免每个类都重复创建这个变量。

如果不是Final并且对其初始化赋值,那么所有实现它的类都可以对其进行修改,接口就失去了提供统一约束的作用。

最后我们来回顾一下“接口”是什么?接口(interface)是一种特殊的抽象类,它是一组没有实现的方法的集合,定义了一组操作,但没有提供实现。接口主要用于定义规范、规则和约束,是一种纯粹的行为描述机制。

总的来说,接口中不能有可变的变量,只能是不可变的,并且只可读不可写,只有这样才可以保证接口的约束。接口是一种更高级别的抽象,是一种规范功能定义的声明,所有可变的都应该在子类中具体来实现。对修改关闭,对扩展开放,接口正是“开闭原则”的体现!