Доступ к статическим переменным
public class Bicycle {
private int cadence;
private int gear;
private int speed;
private int id;
private static int numberOfBicycles = 0;
public Bicycle(int startCadence, int startSpeed, int startGear){
gear = startGear;
cadence = startCadence;
speed = startSpeed;
id = ++numberOfBicycles;
}
// ...
}
Я узнал в своем классе, что Static variables should be accessed by calling with class name
. т.е. ClassName.VariableName
Но в коде выше, как этот оператор id = ++numberOfBicycles;
скомпилирован без ошибок, хотя переменная numberOfBicycles
равна static
Ответы
Ответ 1
Статические переменные принадлежат классу, а не отдельным экземплярам (объектам). Ссылаясь на статические переменные вне класса, он ClassName.myStaticVariable
, но внутри класса он похож на другие переменные экземпляра.
Вы всегда можете использовать статические переменные в нестатических методах, но вы не можете использовать нестатические переменные в статических методах, потому что когда статические методы загружаются, другие нестатические переменные экземпляра не создаются.
Таким образом, ваше утверждение id = ++numberOfBicycles;
отлично действует и будет компилироваться без ошибок.
Ответ 2
Внутри класса квалификатор Bicycle
является необязательным для статических переменных, так же как и квалификатор this
является необязательным для переменных экземпляра
Ответ 3
Возможно, ваш лектор говорит о доступе к ним из-за пределов класса, но не изнутри класса. static
переменные могут быть доступны вне класса, например, ClassName.VariableName
или object.VariableName
. Но, тем не менее, первый метод предпочтительнее.
Внутри класса вам не понадобится использовать ключевое слово this
или classname-qualifier
для устранения неоднозначности с локальными переменными с тем же именем внутри методов и конструкторов.
Ответ 4
Статические переменные являются общими переменными. Таким образом, вы можете получить к ним доступ, используя либо Classname.staticVariable, либо используя объект класса instance.staticVariable. В любом случае вы будете ссылаться на единственную копию переменной в памяти, независимо от того, сколько объектов вы создаете.
Ответ 5
public int getID(){
return numberOfBicycles;
}
public static int getNOB(){
return numberOfBicycles;
}
В классе Bicycle
Bicycle bc = new Bicycle(30, 90, 1);
System.out.println(Bicycle.getNOB());
System.out.println(bc.getID());
Bicycle bc2 = new Bicycle(30,90, 1);
System.out.println(Bicycle.getNOB());
System.out.println(bc2.getID());
Bicycle bc3 = new Bicycle(30,90, 1);
System.out.println(Bicycle.getNOB());
System.out.println(bc3.getID());
Bicycle bc4 = new Bicycle(30,90, 1);
System.out.println(Bicycle.getNOB());
System.out.println(bc4.getID());
В основном классе BicycleTest работал отлично для меня
Ответ 6
Учитывая ваш класс..
public class Bicycle
{
private int cadence;
private int gear;
private int speed;
private int id;
private static int numberOfBicycles = 0;
// ..
}
Когда я создаю объекты типа Bicycle, это будет выглядеть так:
Bicycle a = new Bicycle (1,2,3);
Bicycle b = new Bicycle (2,3,4);
В памяти это выглядит так:
[a] --> { id:1, cadence:1, gear:2, speed:3 }
[b] --> { id:2, cadence:2, gear:3, speed:4 }
numberOfBicycles является статическим, поэтому он не является частью какого-либо объекта Bicycle, он связан с классом, а не с объектом, и так будет в памяти:
[Bicycle] --> { numberOfBicycles:2 }
Итак, чтобы получить доступ к статическому члену, сначала мы определяем для него статический getter:
public static int getNumberOfBicycles ()
{
return numberOfBicycles;
}
то мы называем это из класса:
System.out.println(Bicycle.getNumberOfBicycles());
Ответ 7
Нестатические методы могут обращаться к статическим членам класса, потому что существует только одна копия статической переменной, в отличие от переменных экземпляра, которые создаются только после создания нового объекта этого типа.
Я рекомендую вам пройти еще один класс для тестирования, например, BicycleTest, который будет иметь основной класс, а затем создать, возможно, 4-байтовые объекты и использовать 2getters в классе Bicycle, чтобы получить количество велосипедов и идентификаторов каждый раз, когда вы создаете объект, возможно, это даст вам изображение о том, что происходит.
Ответ 8
Вы не написали Bicycle.numberOfBicycles. В этом нет необходимости, поскольку мы уже находимся в этом классе, поэтому компилятор может вывести его.