为什么在Java中接口变量默认是静态的和最终的?


当前回答

因为其他任何东西都是实现的一部分,而接口不能包含任何实现。

其他回答

因为:

静态:因为我们不能有接口的对象,所以我们应该避免使用对象级成员变量,而应该使用类级变量,即静态。

最后:这样变量的值就不会有歧义(Diamond问题-多重继承)。

根据文档,接口是契约而不是实现。

参考:Abhishek Jain在quora上的回答

我觉得所有这些答案都没有抓住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

就是这样。最终公共静态变量

Java不允许在接口中定义抽象变量和/或构造函数。解决方案:简单地在你的接口和你的实现之间挂起一个抽象类,它只像这样扩展抽象类:

 public interface IMyClass {

     void methodA();
     String methodB();
     Integer methodC();

 }

 public abstract class myAbstractClass implements IMyClass {
     protected String varA, varB;

     //Constructor
     myAbstractClass(String varA, String varB) {
         this.varA = varA;
         this.varB = VarB;
     }

     //Implement (some) interface methods here or leave them for the concrete class
     protected void methodA() {
         //Do something
     }

     //Add additional methods here which must be implemented in the concrete class
     protected abstract Long methodD();

     //Write some completely new methods which can be used by all subclasses
     protected Float methodE() {
         return 42.0;
     }

 }

 public class myConcreteClass extends myAbstractClass {

     //Constructor must now be implemented!
     myClass(String varA, String varB) {
         super(varA, varB);
     }

     //All non-private variables from the abstract class are available here
     //All methods not implemented in the abstract class must be implemented here

 }

如果您确定以后不希望将抽象类与其他接口一起实现,也可以使用没有任何接口的抽象类。请注意,你不能创建一个抽象类的实例,你必须先扩展它。

(“protected”关键字意味着只有扩展类才能访问这些方法和变量。)

斯派罗

在Java中,接口不允许你声明任何实例变量。使用在接口中声明的变量作为实例变量将返回编译时错误。

你可以声明一个常量变量,使用不同于实例变量的静态final。

由于接口没有直接的对象,访问它们的唯一方法是使用类/接口,因此这就是为什么如果接口变量存在,它应该是静态的,否则外界将无法访问它。现在因为它是静态的,它只能保存一个值,任何实现它的类都可以改变它,因此它将是一团糟。

因此,如果有一个接口变量,它将是隐式静态的,最终的和明显的公共!!