我假设你有两个文件Car.java & Cars.java,对应于你给出的代码。 现在,当您编译Cars.java时,它会自动创建Car.class和Cars.class 实际上,需要此Car.class来运行Cars.class程序。如果删除了前者,然后尝试运行的汽车节目,你会得到以下异常:
Exception in thread "main" java.lang.NoClassDefFoundError: Car
at Cars.main(Cars.java:3)
Caused by: java.lang.ClassNotFoundException: Car
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
通知异常的来源在这里
java.lang.ClassLoader.loadClass
的Java类加载器是JRE的一部分动态将Java类加载到JVM中。当一个类被初始化时,所有静态变量实例被放置在堆上。由于您的Cars.class程序引用了Car.class程序的静态变量,因此它也将其加载到JVM中。
请注意,加载与实例化有很大不同。 “实例化类”一词意味着创建一个类的“实例”。实例化一个类,我们使用new运算符为:
Car myCar = new Car();
新员通过一个新的对象分配内存,并返回到内存的引用实例化一个类。这里的实例变量的内存也将被动态分配(根据需要)。请注意,每个实例将被分配一个新的内存空间。但是,它们仍将共享相同的静态分配变量。
所以,在你的程序中,你是不是实例 Car类,但你仍然装载入JVM。
也许我应该澄清我的问题。好的,所以我明白没有Car对象会被实例化。我进一步理解了类字段和实例字段之间的区别。我不清楚的是,因为没有任何对象被实例化,所以Car“成立”是如何返回'0'的值?也许我只是想太多了。 – Sanuglia
'counter'是一个*类变量*。你不需要一个对象来访问一个*类变量*。 – pbaldauf