Java中实例变量和类(静态)变量有什么区别?

8
这个问题的标题实际上是一个以前的考题,我正在寻找澄清/答案。
请注意,我正在学习Java并熟悉它的语法。
我知道这个问题可能已经被问过了,如果是这样的话,有人可以告诉我在哪里可以访问这个问题吗?如果是这样,请接受我的道歉。
为了证明我一直在研究这个领域,我自己的理解是实例变量属于某个类(模板)的对象/实例,并且可以在该实例/对象内随时更改(突变)。
类变量是只有一个副本且可访问但不能修改(突变?),但可根据需要提供给所有类使用的变量?
这里我是不是正确的?
另外,'static'到底是做什么用的?如果一个类的实例只存在于类的主实例中,那么它就是静态的了吗?
非常感谢。

1
你几乎是正确的。类变量可以被改变,尽管如此。 - Code-Apprentice
2
你大部分是正确的。(如果不是final,)静态变量是可以被改变的。具体术语“static”在这个上下文中有点滥用,有些成为了传统。 - Hot Licks
https://dev59.com/8HRC5IYBdhLWcg3wFdBx - Code-Apprentice
2
一个类没有“主实例”——所有实例都是相等的(即使有些时候比其他实例更相等)。 - Hot Licks
这是非常好的反馈和答案。我正在开始理解它,尽管进展缓慢!谢谢大家。 - PrimalScientist
请问为什么这个问题被降级了呢? 我觉得这个问题很直接,答案也还可以吧? - PrimalScientist
3个回答

20

一个静态变量被类的所有实例所共享,而实例变量对于类的每个实例是唯一的。

静态变量的内存在编译时分配,它们在加载时被加载并在类初始化时被初始化。对于实例变量,以上所有操作都在运行时完成。

下面是一个有用的例子:

实例变量是每个对象独有的:每个对象都有自己的实例变量副本。

public class Test{

   int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();

t1 和 t2 都将拥有它们自己的 x 的副本。

静态变量是每个类共享的:该类的每个对象都共享同一静态变量。

public class Test{

   public static int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();

t1和t2将共享相同的x。


谢谢你的反馈。这很有帮助,因为这可能会令人感到困惑!谢谢! - PrimalScientist
这是一个很好的例子。帮助我理解答案。非常感谢。 - PrimalScientist
感谢大家在这里的帮助。我们真的非常感激。 - PrimalScientist
1
静态变量不是在编译时加载的。它们是在加载时加载并在类初始化时初始化的。 - user207421

5

您可以创建多个类的实例。当您声明一个实例变量时,每个实例都会获得其自己独特的变量副本。当您声明一个静态变量时,它是所有实例的相同变量和值。

public class Foo
{
    public int instanceVariable;
    public static int staticVariable;
}

Foo instance1 = new Foo();
Foo instance2 = new Foo();
instance1.staticVariable = 1;
instance1.instanceVariable = 2;
instance2.instanceVariable = 3;

instance1.staticVariable == 1 // true
instance2.staticVariable == 1 // true

instance1.instanceVariable == 2 //true
instance2.instanceVariable == 3 //true

太好了。感谢澄清。 - PrimalScientist
这个答案比第一个更好 :) - Manjeet
非常好的解释,您解决了我一个月的困惑。神奇的2.25行代码解释。 - jax

1
静态变量存储一个在定义它的类的所有实例(或非实例)之间共享的值。而与之不同,实例变量通过名称每次创建一个新副本。当新的对象被创建时。

非常感谢您的反馈。现在开始明白了。 - PrimalScientist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接