为什么在Java中接口变量默认是静态的和最终的?
当前回答
接口:系统需求服务。
在接口中,变量默认由public,static,final访问修饰符赋值。 因为:
public:有时候接口可能被放在其他包中。所以它需要从项目中的任何地方访问变量。
static:这样不完整的类不能创建对象。所以在项目中,我们需要访问没有对象的变量,这样我们就可以在interface_filename.variable_name的帮助下访问
final:假设一个接口由许多类实现,并且所有类都试图访问和更新接口变量。这样会导致数据变化不一致,影响到其他类。所以它需要用final声明访问修饰符。
其他回答
由于接口没有直接的对象,访问它们的唯一方法是使用类/接口,因此这就是为什么如果接口变量存在,它应该是静态的,否则外界将无法访问它。现在因为它是静态的,它只能保存一个值,任何实现它的类都可以改变它,因此它将是一团糟。
因此,如果有一个接口变量,它将是隐式静态的,最终的和明显的公共!!
static -因为接口不能有任何实例。最后,因为我们不需要改变它。
设想一个web应用程序,其中定义了接口并由其他类实现它。因为你不能创建一个接口的实例来访问变量,所以你需要一个静态关键字。由于它是静态的,任何值的变化都会反映到其他实现它的实例。所以为了防止这种情况,我们将其定义为最终结果。
我觉得所有这些答案都没有抓住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
就是这样。最终公共静态变量
public interface A{
int x=65;
}
public interface B{
int x=66;
}
public class D implements A,B {
public static void main(String[] a){
System.out.println(x); // which x?
}
}
这是解决方案。
System.out.println(A.x); // done
我认为这就是为什么界面变量是静态的原因之一。
不要在接口中声明变量。
推荐文章
- 在流中使用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