2012-01-02 67 views
1

由于静态字段对象是在类级别创建的(并且对所有对象都通用),它是静态导入特定字段还是继承(使用实现),所有字段都会创建相同数量的内存?如何继承静态字段会影响性能?

例如在下面的propgram中创建了多少个MyOwn对象?

class MyOwn{} 

public interface ConstantIfc { 
    public final static MyOwn REF = new MyOwn(); 
} 

class A implements ConstantIfc {} 
class B implements ConstantIfc {} 

public class c { 
    public static void main(String... arg) { 
     A refA = new A(); 
     B refB = new B(); 
    } 
} 

如果相同,静态导入的最终常量类如何比常量接口好?

更新:
我明白,最好避免常量的遗传。不适当地利用实现继承往往会导致设计不灵活。所以我们最好去静态导入类/接口。但仍然接口是抽象的,为了保持抽象,它们不应该包含实现细节(包括常量变量)。接口也经常用于描述公共API,其中实现细节不属于。出于这个原因,将常量数据放入类而不是接口是有意义的。感谢robjb。

+2

我相信只有一个实例被创建(对于每个类加载器)。 – 2012-01-02 05:57:41

回答

1

在您给出的示例中,只有一个MyOwn对象被创建。它是在您的程序第一次加载ConstantIfc界面时创建的。

即使您使用静态导入,答案仍然是相同的。静态导入不应该在性能上比常量在接口中更好。他们被引入到语言中,以避免接口,他们所做的只是将常量定义为从未用作接口(没有变量与它们键入),从而导致混淆。

+0

非常感谢!但我仍然无法理解为什么只有常量的Ineterface是不允许的。它有什么问题?请解释一下。或者给一些链接请。 – 2012-01-02 07:05:40

+0

这不是他们不允许的。他们只是气馁。更多细节可以在这里找到:http://en.wikipedia.org/wiki/Constant_interface – 2012-01-02 16:20:51

1

为MyOwn实现默认构造函数,让它执行println()并为自己计数。

+0

它只创建一次。因此对于特定字段的静态导入或通过实现常量接口继承所有常量;两者会创建相同的内存? – 2012-01-02 06:52:20

+0

@Kanagavelu Sugumar:试试这个: – 2012-01-02 07:09:19

+0

@Hannes R“试试这个”是无法访问的。 – 2012-01-02 07:17:16