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

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

问题描述:

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

+1

'当我引用静态变量,不管哪一个实例used' - >你不需要(并且不应该)使用实例来获取静态变量的值。例如,您应该使用以下语法获得它的值:'YourClass.YOUR_STATIC_FINAL_VARIABLE'。正如你所看到的,不需要'new YourClass()。something'。 –

+0

谢谢,但答复不是我正在做的。我使用'myclass1 = new MyClass(); myclass2 = new MyClass();'。然后,我将静态变量引用为'myclass1.something'或'myclass2.something',并期望它们具有相同的值。同时,'myclass1.somethingelse'和'myclass2.somethingelse'会有不同的值。这正是我想要验证的,并知道是否有任何缺陷。 –

你在断言中是正确的......排序。由于您不需要类实例来引用一个实例,所以静态实际上并不真正共享该类的实例。

public class Foo { 
    public static String MYSTRING = "test"; 
} 

可以不富

的实例
String localString = Foo.MYSTRING; 

我真的不会担心太多关于JVM如何选择存储为静态变量的内存引用来访问,这是一个实现细节被委派给JVM设计者。

有一个定义静态和非静态(实例)变量的类没有任何缺陷,它始终在发生,并且非常自然......只要您了解静态如何工作,看来你是这样做的。

+0

谢谢。我认为是这样,但只是需要温暖和模糊。 –

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

静态变量

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

静态方法

静态方法不与对象相关联,并且不能使用任何一个类的实例变量。您可以定义静态方法来访问或操控静态变量

您也可以使用静态方法来定义的实用方法,这些方法通常操纵方法的参数来计算并返回一个适当的值

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

Static变量在整个程序中都是相同的,因为它们没有实例化。这确实是具有静态变量的全部要点。它们不是“某种程度上相同的值”,它们是相同的值,因为它们从来没有实例化过,并且在运行时只有一个来自同一类的同名静态变量。

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

public class TestClass { 

private static int a = 1; 
private int b = 1; 

public static void main(String[] args) { 
    TestClass firstInstance = new TestClass(); 
    TestClass secondInstance = new TestClass(); 

    // 'a' shouldn't be accessed like firstInstance.a, use TestClass.a instead(!) 
    System.out.println("firstInstance a: "+firstInstance.a+" b: "+firstInstance.b); // firstInstance a: 1 b: 1 
    System.out.println("secondInstance a: "+secondInstance.a+" b: "+secondInstance.b);// secondInstance a: 1 b: 1 

    firstInstance.a = 2; 
    firstInstance.b = 2; 

    System.out.println("firstInstance a: "+firstInstance.a+" b: "+firstInstance.b); //firstInstance a: 2 b: 2 
    System.out.println("secondInstance a: "+secondInstance.a+" b: "+secondInstance.b);//secondInstance a: 2 b: 1 
    //a is now 2 also for 'secondInstance' because it's static, secondInstance.b didn't change because b exists specifically for each instance 

    /* 
    * You can access 'a' even when no instance of TestClass exists 
    * think about a simple Dog class where the amount of legs is 4 for every dog, so you can make it static, 
    * but not every Dog has the same name, so it wouldn't be clever to make the name static 
    */ 
} 
}