Доступ к статическим переменным

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. В этом нет необходимости, поскольку мы уже находимся в этом классе, поэтому компилятор может вывести его.