什么';静态变量和全局变量(Java)之间的区别是什么?

什么';静态变量和全局变量(Java)之间的区别是什么?,java,variables,Java,Variables,我被静态变量和全局变量之间的差异弄糊涂了。当我今天浏览Java教科书时,我的眼睛被“声明为静态的变量本质上是全局变量。声明对象时,不会复制静态变量”吸引住了。我非常清楚为什么静态变量由其类中的所有对象共享,但我不明白为什么静态变量是全局变量。据我所知,静态变量只能在其类中被视为“全局变量”。静态变量可以(也应该)使用class.Variable来访问 如果静态变量是公共的,则它们将始终全局可用 public class MyClass { public static int X = 5; }

我被静态变量和全局变量之间的差异弄糊涂了。当我今天浏览Java教科书时,我的眼睛被“声明为静态的变量本质上是全局变量。声明对象时,不会复制静态变量”吸引住了。我非常清楚为什么静态变量由其类中的所有对象共享,但我不明白为什么静态变量是全局变量。据我所知,静态变量只能在其类中被视为“全局变量”。

静态变量可以(也应该)使用
class.Variable来访问

如果静态变量是
公共的
,则它们将始终全局可用

public class MyClass {
 public static int X = 5;
}
可以在类可用的任何地方使用

MyClass.X

没有实际的“global”关键字或任何东西,但它接近它的意图。

我认为您的书(错误地)使用global作为描述与类关联的变量的更简单方法

例如,以这个类为例:

public class Apple {
    private static int numberOfApples = 0;

    public Apple() {
        numberOfApples++;
        System.out.println(numberOfApples);
    }
}
每次创建苹果时,它都会增加numberOfApples变量并将其打印出来。如果创建两个Apple对象,则它将打印:

1
2
本例中的静态变量由所有Apple实例全局共享,这可能就是它的含义,但这是因为它与类绑定。这与其他语言中的全局变量不同


编辑:正如其他人所提到的,您可以访问静态变量,而无需类的任何实例化。如果我将
numberOfApples
公开,并在创建任何苹果实例之前将其打印出来,那么它将打印0。类似地,在创建了两个Apple类并销毁了这两个对象之后,我可以打印
NumberOfApple
,它会显示为2。

静态:只有一个变量具有该名称。(虽然每个实例都存在实例变量)

全局:静态和可见性是公共的

因此,每个全局变量必须是静态的

全局变量的示例是:
java.lang.System.out

静态变量和全局变量(Java)之间有什么区别


区别在于Java中不存在全局变量。你的书甚至不应该提到他们

据我所知,内存是由调用方法的main中声明的对象分配的。如果它调用一个非静态变量,那么每次调用它时它都会被初始化。另一方面,只有在调用静态变量时,它的值保持不变,才会为静态变量分配一次内存

抱歉,java中没有全局变量。通常静态变量被视为全局变量。如果它们的可见性为
public
,则可以将它们视为全局变量。java中没有全局变量。
Class SomeClass
带有
public static int someInt
。这个
someInt
可以被视为“
global
”,因为它可以被包含该类的任何东西访问。即使它们不是
public
,它们也是全局状态,特别是如果它们可以通过公共方法操纵的话。谢谢你,杰伦,你的回答消除了我的困惑。“与其他语言的区别”如果你把它公之于众,它就会消失。@Ingo说得好。我认为公平地说,在其他语言中传统上被认为是全局变量的东西是Java中静态变量的子集,因为还有其他可能的访问修饰符可用?嗯。。。如果我们将static理解为“既不是本地函数也不是动态分配的”,而将global理解为“可以从其他模块编译单元访问,或者以相同的固定名称访问”,那么我们在许多语言中都有相同的概念。Java在这方面绝对不例外。