为什么在Java中接口变量默认是静态的和最终的?
当前回答
static -因为接口不能有任何实例。最后,因为我们不需要改变它。
其他回答
我觉得所有这些答案都没有抓住OP问题的重点。 OP没有要求确认他们的声明,他们想知道为什么他们的声明是标准的。
回答这个问题需要一些信息。 首先,让我们谈谈遗传。 假设有一个名为a的类,其实例变量名为x。
创建类a时,它继承Object类的所有属性。在您不知情的情况下,当您实例化A时,您也实例化了一个Object对象,而A指向它作为它的父对象。
现在假设你创建了一个类B,它继承了a。
当你创建一个类B时,你也创建了一个类a和一个对象。 B可以访问变量x,这意味着B。x和B。A。x是一样的Java只是隐藏了获取A的魔力。
我们不讨论接口…… 接口不是继承。如果B要实现Comparable接口,B不会创建Comparable实例并将其称为父实例。相反,B承诺拥有Comparable拥有的东西。
我们在这里不谈一点理论……接口是一组你可以用来与某物交互的函数。它不是事物本身。例如,你通过与朋友交谈、分享食物、跳舞、靠近他们来与他们交流。但是你不能继承它们——你没有它们的副本。
接口类似。只有一个接口,所有对象都与它相关联。由于接口作为一个类只存在一次(与它自身的实例相反),因此实现该接口的每个对象都不可能拥有自己的接口副本。这意味着每个变量只有一个实例。这意味着变量由所有使用该接口的类共享(也称为静态)。
至于我们为什么要公开它们… 私人是没用的。函数是抽象的,内部不能有任何代码来使用私有变量。它永远不会被使用。如果变量被标记为受保护,那么只有类的继承者才能使用这些变量。我不认为你可以从接口继承。公开是唯一可行的选择。
剩下的唯一设计决策就是“最终”。您可能打算在一个类的多个实例之间更改共享变量。(例如:也许你有5个玩家在玩大富翁,你想要一个棋盘存在,这样你就可以让所有的玩家都满足界面和一个单一的共享棋盘——可能你想要根据玩家的功能来改变棋盘……)[我不推荐这种设计]
但是对于多线程应用程序,如果你不把变量设置为静态的,你以后会有困难,但我不会阻止你。去做吧,看看为什么会疼<3
就是这样。最终公共静态变量
Just tried in Eclipse, the variable in interface is default to be final, so you can't change it. Compared with parent class, the variables are definitely changeable. Why? From my point, variable in class is an attribute which will be inherited by children, and children can change it according to their actual need. On the contrary, interface only define behavior, not attribute. The only reason to put in variables in interface is to use them as consts which related to that interface. Though, this is not a good practice according to following excerpt:
在Java早期,在接口中放置常量是一种流行的技术,但现在许多人认为这是一种令人讨厌的接口使用,因为接口应该处理对象提供的服务,而不是它的数据。同样,类使用的常量通常是实现细节,但将它们放在接口中会将它们提升到类的公共API。”
我也试过要么放静电要么不放根本没有区别。代码如下:
public interface Addable {
static int count = 6;
public int add(int i);
}
public class Impl implements Addable {
@Override
public int add(int i) {
return i+count;
}
}
public class Test {
public static void main(String... args) {
Impl impl = new Impl();
System.out.println(impl.add(4));
}
}
设想一个web应用程序,其中定义了接口并由其他类实现它。因为你不能创建一个接口的实例来访问变量,所以你需要一个静态关键字。由于它是静态的,任何值的变化都会反映到其他实现它的实例。所以为了防止这种情况,我们将其定义为最终结果。
接口可以由任何类实现,如果该值被其中一个实现类改变了,那么就会对其他实现类产生误导。接口基本上是指将两个相互关联但又不同的实体组合在一起。因此,在接口内部声明的变量将隐式是final的,也是静态的,因为接口不能被实例化。
Public:用于所有类的可访问性,就像接口中呈现的方法一样
static:作为接口不能有对象,即interfaceName。variableName可以用来引用它,也可以直接在实现它的类中引用variableName。
最后:使它们成为常量。如果两个类实现了相同的接口,并且您赋予它们更改值的权利,那么在var的当前值中就会发生冲突,这就是为什么只允许一次初始化。
而且所有这些修饰符对于接口来说都是隐式的,你真的不需要指定它们中的任何一个。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap