代码如下。
public interface DesignPatternInterface
{
int CUSTOMERAGE = 45;
}
public class ImplementInterface extends AbstaractDemo implements DesignPatternInterface
{
private static final int CUSTOMERAGE =20;
}
我的问题是接口变量是静态最终的,内存将被分配
答案 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)
我的问题是界面变量是静态最终
接口主体中的每个字段声明都是隐式的public,static和final。允许为这些字段冗余地指定任何或所有这些修饰符。
下一步:
将分配内存
不确定你的意思。这只是一个静态的最终领域。
DesignPatternInterface.CUSTOMERAGE
和ImplementInterface.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
}
}