静态变量与实例变量:区别?

新手上路,请多包涵

静态变量和实例变量有什么区别。下面这句话是我无法得到的:

在某些情况下,一个类的所有对象应该只共享一个特定变量的副本——这里使用静态变量。

静态变量表示类范围的信息。类的所有对象共享相同的数据。

我认为实例变量是在类范围内使用的,而静态变量只在它们自己的方法中有作用域?

原文由 user2971033 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 412
2 个回答

在类属性的上下文中, static 具有不同的含义。如果您有这样的字段:

 private static int sharedAttribute;

然后,该类的 每个实例 都将共享 相同的 变量,因此如果您在一个实例中更改它,则更改将反映在更改之前或之后创建的所有实例中。

如此说来,您可能明白这在很多情况下都是不好的,因为它很容易变成不希望的副作用:更改对象 a 也会影响 b 你可能最终想知道为什么 b 没有明显的原因改变。无论如何,在某些情况下这种行为是绝对可取的:

  1. 类常量:因为它们是 const ,所以让所有类访问相同的值不会有任何坏处,因为没有人可以更改它。如果您有 很多 该类的实例,它们也可以节省内存。不过,不确定 并发 访问。
  2. 旨在 共享的变量,例如引用计数器 &co。

static vars 在你的程序启动之前被实例化,所以如果你有太多,你 可能会 减慢启动速度。

A static 方法只能访问 static 属性,但在尝试之前请三思。

经验法则:不要使用 static ,除非有必要并且你知道自己在做什么或者你正在声明一个类常量。

原文由 Stefano Sanfilippo 发布,翻译遵循 CC BY-SA 3.0 许可协议

假设有一个测试类:

 class Test{
public static int a = 5;
public int b = 10;
}
// here t1 and t2 will have a separate copy of b
// while they will have same copy of a.
Test t1 = new test();
Test t2 = new test();

您可以像这样使用它的类名访问静态变量

Test.a = 1//some value But you can not access instance variable like this
System.out.println(t1.a);
System.out.println(t2.a);

在这两种情况下,输出都将为 1,因为 a 由测试类的所有实例共享。而实例变量将每个都有 b (实例变量)的单独副本所以

 t1.b = 15 // will not be reflected in t2.
 System.out.println(t1.b); // this will print 15
 System.out.println(t2.b); / this will still print 10;

希望能解释您的查询。

原文由 user2754122 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题