接口中声明的变量会发生什么?如果实现的类具有相同的变量?

时间:2014-02-18 14:17:07

标签: java core

代码如下。

public interface DesignPatternInterface 
{
  int CUSTOMERAGE = 45;

}

public class ImplementInterface extends AbstaractDemo implements DesignPatternInterface 
{
   private static final int  CUSTOMERAGE =20;
}

我的问题是接口变量是静态最终的,内存将被分配

4 个答案:

答案 0 :(得分:3)

考虑以下代码:

interface DesignPatternInterface {
  int CUSTOMERAGE = 45;
}

public class ImplementInterface implements DesignPatternInterface {
   static final int CUSTOMERAGE = 20;

   public static void main(String[] args) {
     System.out.println(CUSTOMERAGE);
     System.out.println(DesignPatternInterface.CUSTOMERAGE);
   }
}

会打印

20
45

我认为这应该是对你怀疑的一个很好的实际解释。

另请注意,堆上没有为原始静态最终变量分配内存;值驻留在描述的内存结构中,而不是类的实例。根据特定JVM的详细信息,类描述结构要么位于为JVM内部保留的特殊堆区域中,要么根本不存在于堆中。

答案 1 :(得分:1)

  

我的问题是界面变量是静态最终

是。来自section 9.3 of the JLS

  

接口主体中的每个字段声明都是隐式的public,static和final。允许为这些字段冗余地指定任何或所有这些修饰符。

下一步:

  

将分配内存

不确定你的意思。这只是一个静态的最终领域。

DesignPatternInterface.CUSTOMERAGEImplementInterface.CUSTOMERAGE之间没有任何关系。它们完全是独立的变量。

答案 2 :(得分:1)

接口中的字段始终默认为public static。这意味着它们属于类,而非实例。

当您访问静态字段时,您必须明确指定要访问的类,因此无法覆盖甚至隐藏静态字段。

因此,这两个值占用内存空间,并且两者始终可用。

答案 3 :(得分:0)

Interface和可扩展类之间存在差异。接口只是一个实现它们的类将拥有(并实现)这些方法的契约。如果你想要一个字段值,你应该把它放在一个类中。

public class SomeClass {
    protected int someValue = 45;
}

//...
public class OtherClass extends SomeClass {

    public OtherClass() {
        this.someValue = 40;
        //super.someValue == 45
        //this.someValue == 40
    }

}