Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
静态关键字在Java中是如何工作的?_Java - Fatal编程技术网

静态关键字在Java中是如何工作的?

静态关键字在Java中是如何工作的?,java,Java,我从一开始就在阅读,我有一个关于字段或变量的static关键字的问题。正如Java所说: 类变量(静态字段)类变量是使用静态修饰符声明的任何字段;这会告诉编译器,不管类被实例化了多少次,该变量只有一个副本存在。定义特定类型自行车档位数量的字段可以标记为静态,因为概念上相同的档位数量将应用于所有实例 有了它,我想如果你有一个对象(在本例中是类Bicycle)和一个字段,它的是静态的,那么不管你是在引用bicycle1还是bicycle2,这个字段的静态值都是相同的。是我错了还是我理解得很好 我是说

我从一开始就在阅读,我有一个关于字段或变量的
static
关键字的问题。正如
Java
所说:

类变量(静态字段)
类变量是使用静态修饰符声明的任何字段;这会告诉编译器,不管类被实例化了多少次,该变量只有一个副本存在。定义特定类型自行车档位数量的字段可以标记为静态,因为概念上相同的档位数量将应用于所有实例

有了它,我想如果你有一个对象(在本例中是类
Bicycle
)和一个字段,它的
是静态的
,那么不管你是在引用
bicycle1
还是
bicycle2
,这个字段的静态值都是相同的。是我错了还是我理解得很好

我是说,如果我有:

Bicycle bicycle1 = new Bicycle();
Bicycle bicycle2 = new Bicycle();
在类
Bicycle
中,我有一个
static
字段,如:

class Bicycle{
   static int gears;

   //Methods to set and get gears
}
自行车1
中,我将档位设置为7:

bicycle1.setGears(7);
然后,如果我试图获得
自行车2
中的档位值,我应该得到与我在
自行车1
上设置的档位值相同的值,对吗

System.out.println(bicycle2.getGears()); //7
好吧,这里是我有疑问的地方,因为正如我在上面引用的
Java
所说:

这会告诉编译器该变量存在一个副本


这个副本存放在哪里?对象如何访问该副本?何时创建此副本?

java中的静态变量存储在类中,您不需要创建它的实例来访问它们

class Bicycle{
   public static int gears = 7;

   //Methods to set and get gears
}
您可以像这样访问静态方法

Bicycle.gears;
所以,java上只声明了一个Bicycle类,当您实例化一个类时,它将创建一个Bicycle实例,并声明所有静态属性

这个副本存放在哪里

静态变量存储在一些静态存储中(我相信是在permgen中),您不应该为此烦恼

这个副本是什么时候创建的

它们是在第一次访问类时创建的(由类加载器加载),并且从不删除(除非类被卸载)

对象如何访问该副本

实例引用了它的类,类尊重它的所有变量。如何准确地将C结构放置在内存中是具体实现的细节


因为静态变量绑定到类而不是实例,所以您甚至不需要实例化类来访问它们<代码>MyClass.myStaticVar正常

此副本存储在哪里?

副本(静态变量)存储在永久生成部分中,但是如果使用Java8,永久生成部分将不再存在。 静态变量和静态方法是反射数据的一部分,反射数据与类相关,与实例无关

对象如何访问该副本?

您创建的类(对象)的每个实例都有对该类的引用

何时创建此副本?

它是在运行时加载类时创建的:这是在第一次引用类时由JVM的类加载器完成的

静态变量属于类,而不属于类的实例。 你的直觉是正确的——不管你创建了多少个对象,你只有一个副本

您可以使用类的名称访问静态变量,如本例所示:

class Static {

    static int staticField;

}

public class UseStatic {

    public static void main(String[] args) {

        System.out.println(Static.staticField);

    }
}
静态字段可用于创建某种类常量。

最后,为了方便地初始化特定类的静态字段,您可以使用

资料来源:大学java课程

有了这个,我想如果你有一个对象(在这个例子中是一个 类的实例)及其内部的字段 然后是静态的,独立于您是否正在参考bicycle1或 bicycle2,其静态值将具有相同值的字段。我是吗 错了还是我理解得很好

当您第一次用Java实例化一个类时,JVM会创建两件事:

  • 一个例子。将为您创建的每个实例在堆上分配一组非静态字段。这些实例字段独立于所有其他实例(并用于表示其对象的状态)

  • 类对象。Java中的每个类都有一个且只有一个类对象。。。无论创建了多少实例。例如,Class
    String
    的类对象是
    Class
    (以文本形式表示为
    String.Class
    )。可以将类的静态字段视为属于类对象。类对象的生命周期独立于类实例的生命周期;只要JVM进程在运行,类对象就存在(因此,它们的静态字段也存在那么长的时间)

由于一个类只有一个类对象,并且一个类的所有实例都共享同一个类对象,因此一个类的静态字段由所有存在的类实例共享

一般来说,将
static
关键字理解为“独立于任何实例”是很有用的:

  • 静态字段属于类对象,而不属于任何实例
  • 静态方法通过类对象调用,不能直接访问任何实例
  • 静态成员类实例不依赖于任何其他实例

顺便说一句,您通常不应从实例调用静态方法/属性。我不知道为什么法律允许这样做compiler@Dici你能解释一下如果我使用它们会产生什么问题吗?@Error404我认为这只是误导。当您这样做时,编译器会发出警告。@Dici这就是我提出这个问题的原因。知道它是如何工作的,然后可以