che*_*vim 255
来自Philip Shaw的Java界面设计常见问题解答:
接口变量是静态的,因为Java接口本身无法实例化; 必须在没有实例的静态上下文中分配变量的值.最终修饰符确保分配给接口变量的值是一个真正的常量,不能由程序代码重新赋值.
dga*_*002 38
由于接口没有直接对象,访问它们的唯一方法是使用类/接口,因此如果接口变量存在,它应该是静态的,否则它根本不可访问外部世界.既然它是静态的,它只能保存一个值,任何实现它的类都可以改变它,因此它会变得一团糟.
因此,如果有一个接口变量,它将是隐式静态的,最终的,显然是公共的!
Nut*_*tan 35
public:用于跨所有类的可访问性,就像界面中存在的方法一样
静态:如接口不能有一个对象,该interfaceName.variableName可用于引用它或者直接在VARIABLENAME在执行它的类.
final:使它们成为常数.如果2类实现相同的接口,你给他们两个来改变权值,将发生在VAR,这就是为什么只有一个初始化时间允许的电流值的冲突.
所有这些修饰符都是隐含的接口,你真的不需要指定它们中的任何一个.
Mal*_*von 12
(这不是一个哲学的答案,而是一个实际的答案).对static
修饰语的要求是显而易见的,已被其他人回答.基本上,由于接口无法实例化,访问其字段的唯一方法是使它们成为类字段 - static
.
的背后的原因interface
字段自动成为final
(常数)是为了防止不同的实现意外更改接口变量的值可无意中影响其它实施方式的行为.想象一下下面的场景,其中一个interface
属性没有final
被Java 明确地变成:
public interface Actionable {
public static boolean isActionable = false;
public void performAction();
}
public NuclearAction implements Actionable {
public void performAction() {
// Code that depends on isActionable variable
if (isActionable) {
// Launch nuclear weapon!!!
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,想想如果另一个实现的类Actionable
改变了接口变量的状态会发生什么:
public CleanAction implements Actionable {
public void performAction() {
// Code that can alter isActionable state since it is not constant
isActionable = true;
}
}
Run Code Online (Sandbox Code Playgroud)
如果这些类是由类加载器在单个JVM中加载的,那么当它被执行后(在同一个线程或其他情况下)调用时,其行为NuclearAction
会受到另一个类的影响,在这种情况下可能是灾难性的(从语义上讲).CleanAction
performAction()
CleanAction
由于我们不知道a的每个实现interface
将如何使用这些变量,因此它们必须隐含final
.
因为其他任何东西都是实现的一部分,并且接口不能包含任何实现.
public interface A{
int x=65;
}
public interface B{
int x=66;
}
public class D implements A,B {
public static void main(String[] a){
System.out.println(x); // which x?
}
}
Run Code Online (Sandbox Code Playgroud)
这是解决方案。
System.out.println(A.x); // done
Run Code Online (Sandbox Code Playgroud)
我认为这是接口变量是静态的原因之一。
不要在Interface内部声明变量。
归档时间: |
|
查看次数: |
342386 次 |
最近记录: |