Статические элементы принадлежат классу.Поэтому лучший способ получить к ним доступ через класс.Так что в вашем случае распечатка должна быть.
System.out.println(CarCounter.getCounter());
Это может показаться ненужным, но это не так.Рассмотрим следующий код
// VehicleCounter.java
public class VehicleCounter {
static int counter = 0;
public VehicleCounter(){
counter++;
}
public static int getCounter(){
return counter;
}
}
// CarCounter.java
public class CarCounter extends VehicleCounter {
static int counter = 0;
public CarCounter(){
counter++;
}
public static int getCounter(){
return counter;
}
}
// CarCounterTest.java
public class CarCounterTest {
public static void main( String args[] ){
VehicleCounter vehicle1 = new VehicleCounter();
VehicleCounter vehicle2 = new CarCounter();
System.out.println(vehicle1.getCounter());
System.out.println(vehicle2.getCounter());
}
}
Что должен печатать вышеуказанный код?
Поведение вышеуказанного кода определить сложно.vehicle1
объявлен как VehicleCounter
, а объект на самом деле является VehicleCounter
, поэтому он должен напечатать 2 (созданы два автомобиля).
vehicle2
объявлен как VehicleCounter
, но объект является действительнымCarCounter
.Что должно быть напечатано?
Я действительно не знаю, что будет напечатано, но я вижу, что это легко запутать.Так что для лучшей практики статические элементы всегда должны быть доступны через определенный класс.
Гораздо проще предсказать, что будет напечатано с помощью следующего кода.
// CarCounterTest.java
public class CarCounterTest {
public static void main( String args[] ){
VehicleCounter vehicle1 = new VehicleCounter();
VehicleCounter vehicle2 = new CarCounter();
System.out.println(VehicleCounter.getCounter());
System.out.println(CarCounter .getCounter());
}
}
Надеюсь, это объясняет.
НаваМан: -D