类中相同类的静态对象与其数据成员的用法是什么?

时间:2015-10-15 11:26:33

标签: java static

我正在阅读代码段:

Class MyDAO{
     public static final MyDAO DAO = new MyDAO();
     public void loadData(){
         //Hibernate Code to do something
     }
 ...
}

所以我很惊讶,我现在面临的问题是:

as static关键字表示可以访问"成员变量或方法,而无需对其所属的类进行实例化"。简单来说,这意味着您可以调用方法,即使您从未创建过它所属的对象。

data member声明为static并实例化一个类有什么用?它是一种设计模式还是什么?最重要的是什么用途?当你说Class.staticMember时,如何将类加载到JVM的内存中?

4 个答案:

答案 0 :(得分:1)

它可用于实现 Singleton 模式。

答案 1 :(得分:1)

当您希望数据成员在所有实例中保持相同的值(在类的不同对象之间共享)时,将声明该数据成员

声明静态不是设计模式,但它是设计应用程序的一种方式。

除此之外,如果您的成员仅被类中的方法使用,并且不希望直接访问它,则可以将其设置为私有静态。

答案 2 :(得分:1)

这是一种将DAO对象作为全局对象提供给应用程序其余部分的方法。它粗糙而且丑陋并且难以进行测试,因为很难提供DAO的模拟实现。

静态成员在加载类时初始化。首次引用类时会延迟加载类。应用程序中的其他类可以访问此DAO而无需初始化它。

这样的代码就是创建依赖注入框架(Spring,Guice,Hivemind等)的原因。此代码使应用程序依赖于特定实现而不是抽象,使用依赖注入通过使应用程序依赖抽象并让DI容器负责选择实现和强制执行单一范围来减少耦合并提高可测试性。

答案 3 :(得分:0)

  

将数据成员声明为静态并实例化一个类有什么用?

数据成员保持为静态不会给您任何不实例化该类的理由,因为您的类可能仍包含其他非静态成员。

  • 那么你什么时候不必实例化这个类?

当所有成员都是静态的时,例如实用程序类。一个例子是Java中的Math类。

  

最重要的是什么用途?

如果您的类包含非静态成员,那么如果您不实例化该类,您如何期望访问这些数据?请记住,如果未实例化它们所属的类,则非静态成员将不会存在于内存中。

  

它是一种设计模式还是什么?

它与设计模式没有直接关系。通常,当一个成员是类本身的行为或属性 而不是单个对象时,将其声明为静态。

  

当你说Class.staticMember类被加载到JVM的内存中时。

我不确切知道Java内存是如何在内部工作的,但是在对象实例化之前就存在静态成员,这意味着已经在运行时创建并加载了声明为static的变量。

这也意味着静态成员实际上属于类(不是单个实例)。