2014-02-18 39 views
1

代码如下。将在变量声明中发生什么?如果实现的类具有相同的变量?

public interface DesignPatternInterface 
{ 
    int CUSTOMERAGE = 45; 

} 

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

我的问题是接口变量是静态的最后记忆将被分配

+4

你有没有问题 – lakshman

+0

你能澄清一下这个问题吗? – jgitter

+0

当你尝试时发生了什么? –

回答

1

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

是。 From section 9.3 of the JLS

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

下一页:

和内存将被分配

不知道你的意思是什么。这只是一个静态的最终字段。

有​​和ImplementInterface.CUSTOMERAGE之间没有任何关系。它们完全是单独的变量。

+0

'和内存将被分配 - - 恕我直言,因为变量是最终的,编译器可以决定内联值,所以没有(堆)内存将分配 –

+0

@安德里亚斯:该领域仍然存在一定程度,在它可用于反思。 –

+0

好点:)所以至少*一些*内存需要分配给它 –

0

接口和可扩展类之间有区别。接口仅仅是一个实现它们的类将会拥有(并实现)这些方法的契约。如果你想拥有一个字段值,你应该在课堂上使用它。

public class SomeClass { 
    protected int someValue = 45; 
} 

//... 
public class OtherClass extends SomeClass { 

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

} 
1

接口中的字段总是默认为public static。这意味着他们属于班级,而不是实例。

当你访问你必须明确地指定要访问其类的静态字段,所以没有办法超越,甚至是影子,静态字段。

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

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 

我相信这应该成为你的疑问,良好的实际的解释。

另外请注意,没有内存堆中的原始静态final变量分配;该值驻留在描述类别类别的存储器结构内,而不是类别的实例。根据特定JVM的细节,类描述结构可以位于为JVM内部保留的特殊堆区域中,也可以不在堆中。

+1

+1你还应该补充说,静态成员永远不会被继承,它们被隐藏并属于类/接口。 –

+1

我编辑过;实际上,成员*是*继承的,可以用简单的名称访问。当然,它不会*重写*原始的,它仍然存在于超类型中;只有名称解析规则才会更改。 –

相关问题