同一类中的Java静态变量和非静态变量
我需要一些帮助来澄清静态变量和非静态变量。我的理解是,静态变量在类的所有实例中具有相同的值。但是,假设我在同一个类中混合使用了静态变量和非静态变量。当我引用一个静态变量时,无论使用哪个实例,我都会得到相同的值?然而,当我引用一个非静态变量时,我将获得与该特定类相关的值?这似乎是一个记忆管理的噩梦。这真的是如何工作,以及如何处理静态内存?是在每个实例中创建的变量的多个副本,然后以某种方式同步或作为每个实例中创建的地址的引用?在同一个类中使用混合静态变量和非静态变量是否有任何缺陷? TIA。同一类中的Java静态变量和非静态变量
你在断言中是正确的......排序。由于您不需要类实例来引用一个实例,所以静态实际上并不真正共享该类的实例。
public class Foo {
public static String MYSTRING = "test";
}
可以不富
的实例String localString = Foo.MYSTRING;
我真的不会担心太多关于JVM如何选择存储为静态变量的内存引用来访问,这是一个实现细节被委派给JVM设计者。
有一个定义静态和非静态(实例)变量的类没有任何缺陷,它始终在发生,并且非常自然......只要您了解静态如何工作,看来你是这样做的。
谢谢。我认为是这样,但只是需要温暖和模糊。 –
从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
*/
}
}
'当我引用静态变量,不管哪一个实例used' - >你不需要(并且不应该)使用实例来获取静态变量的值。例如,您应该使用以下语法获得它的值:'YourClass.YOUR_STATIC_FINAL_VARIABLE'。正如你所看到的,不需要'new YourClass()。something'。 –
谢谢,但答复不是我正在做的。我使用'myclass1 = new MyClass(); myclass2 = new MyClass();'。然后,我将静态变量引用为'myclass1.something'或'myclass2.something',并期望它们具有相同的值。同时,'myclass1.somethingelse'和'myclass2.somethingelse'会有不同的值。这正是我想要验证的,并知道是否有任何缺陷。 –