【问题标题】:What will happen to variable Declared in Interface ? if the implemented class has the same variable?接口中声明的变量会发生什么?如果实现的类具有相同的变量?
【发布时间】:2014-02-18 14:17:06
【问题描述】:

代码如下。

public interface DesignPatternInterface 
{
  int CUSTOMERAGE = 45;

}

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

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

【问题讨论】:

  • 你能澄清一下这个问题吗?
  • 你尝试的时候发生了什么?
  • 你刚刚问了一个答案。

标签: java core


【解决方案1】:

考虑这段代码:

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 您还应该补充一点,静态成员永远不会被继承,它们被隐藏并属于类/接口。
  • 我已编辑;实际上,成员 继承的,并且可以使用简单的名称进行访问。当然,它不会覆盖原来的,它仍然存在于超类型中;只有名称解析规则发生变化。
【解决方案2】:

我的问题是接口变量是静态最终的

是的。来自section 9.3 of the JLS

接口主体中的每个字段声明都是隐式的公共、静态和最终的。允许为此类字段冗余地指定任何或所有这些修饰符。

下一步:

会分配内存

不确定你的意思。它只是一个静态的 final 字段。

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

【讨论】:

  • and memory will be assigned - 恕我直言,由于变量是最终变量,编译器可以决定内联该值,因此不会分配(堆)内存
  • @Andreas:该领域在某种程度上仍然必须存在,因为它可以用于反射。
  • 好点 :) 所以至少需要为它分配 一些 内存
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    public class SomeClass {
        protected int someValue = 45;
    }
    
    //...
    public class OtherClass extends SomeClass {
    
        public OtherClass() {
            this.someValue = 40;
            //super.someValue == 45
            //this.someValue == 40
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 2018-05-01
      • 2014-05-13
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 2015-11-30
      • 2016-03-17
      相关资源
      最近更新 更多