同一个类中的Java静态和非静态变量

时间:2017-08-08 13:09:08

标签: java variables static non-static

我需要一些帮助来澄清静态和非静态变量。我的理解是,静态变量在类的所有实例中具有相同的值。但是,假设我在同一个类中混合了静态和非静态变量。当我引用静态变量时,无论使用哪个实例,我都会得到相同的值?然而,当我引用一个非静态变量时,我将得到与该特定类相关的值?这似乎是一个记忆管理的噩梦。这真的是它的工作原理以及如何处理静态内存?是在每个实例中创建变量的多个副本,然后以某种方式同步,或者是在每个实例中创建的地址引用?在同一个类中混合使用静态和非静态变量是否有任何陷阱? TIA。

4 个答案:

答案 0 :(得分:4)

你的断言是正确的......等等。静态实际上并没有在类的实例之间共享,因为你不需要一个类实例来引用它。

public class Foo {
   public static String MYSTRING = "test";
}
可以在没有Foo实例的情况下访问

String localString = Foo.MYSTRING;

我不太担心JVM如何选择存储静态变量的内存引用,这是一个委托给JVM设计器的实现细节。

有一个定义静态和非静态(实例)变量的类没有任何陷阱,它一直发生并且非常自然......只要你理解静态是如何工作的,它似乎你做的。

答案 1 :(得分:2)

取自OCA Java SE 7 Programmer I Certification Guide: Prepare for the 1ZO-803 exam

  

静态变量

     

静态变量属于一个类。它们对于类的所有实例都是通用的,并不是类的任何实例所特有的。静态属性独立于类的任何实例而存在,即使没有创建类的实例,也可以访问它们。您可以将静态变量与共享变量进行比较。静态变量由类的所有对象共享。

     

静态方法

     

静态方法与对象无关,不能使用类的任何实例变量。您可以定义静态方法来访问或操作静态变量

     

您还可以使用静态方法来定义实用程序方法,这些方法通常操作方法参数来计算并返回适当的值

     

非私有静态变量和方法由派生类继承。静态成员不参与运行时多态性。您不能覆盖派生类中的静态成员,但可以重新定义它们。如果您不了解继承和派生类,那么对静态方法及其行为的任何讨论都会非常混乱。

答案 2 :(得分:0)

Static个变量在整个程序中是相同的,因为它们没有实例化。这确实是拥有静态变量的重点。它们不是"它们是相同的值",它们是相同的值,因为它们从未被实例化,并且在运行时期间只有同一个类中同一个名称的静态变量。

答案 3 :(得分:0)

我不知道背后的'记忆逻辑',但我已经创建了一个例子

public abstract class CustomRepository<T, ID> {

    private static final Logger LOG =LoggerFactory.getLogger(CustomRepository.class);

    protected SessionFactory sessionFactory;

    private T _clazz;
    private String className;

    public CustomRepository() {             
        String className = _clazz.getClass().getName();
        if (className.contains(".")) {
            className = className.substring(className.lastIndexOf('.') + 1);
        }
        LOG.info("classname:{}", className);
    }
}