Я предполагаю, что у вас есть два файла 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.
Обратите внимание, что загрузка сильно отличается от экземпляра. Фраза «создание экземпляра класса» означает создание «экземпляра» класса. Чтобы создать экземпляр класса, мы используем новый оператор, как:
Car myCar = new Car();
Новый оператор инстанцирует класс путем выделения памяти для нового объекта и возвращает ссылку на эту память. Здесь память для переменных экземпляра также будет распределяться динамически (по мере необходимости). Обратите внимание, что каждому экземпляру будет выделено новое пространство памяти. Однако они по-прежнему будут использовать одни и те же статически распределенные переменные.
Таким образом, в вашей программе, вы не инстанцировании класс автомобилей, но вы все еще загрузки его в JVM.
Возможно, я должен уточнить свой вопрос. Хорошо, поэтому я понимаю, что объект Car не будет создан. И я также понимаю разницу между полем класса и полем экземпляра. Что я не понимаю, так это то, что, поскольку объект не был создан, как появился автомобиль «вернуть» значение «0»? Возможно, я просто слишком много думаю об этом. – Sanuglia
'counter' - переменная * класса *. Вам не нужен объект для доступа к переменной * класса *. – pbaldauf