Доступ да статычных пераменным

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;
    }
      //...
}

Я даведаўся ў сваім класе, што Статычныя зменныя павінны быць даступныя па тэлефоне з імем класа . г.зн. ClassName.VariableName

Але ў прыведзеным вышэй кодзе, як гэта зацвярджэнне ID = ++ numberOfBicycles; кампілюецца без памылак, нават калі пераменная numberOfBicycles гэта статычным

10
Звярніце ўвагу, што гэты радок ID = ++ numberOfBicycles; ня струменева
дададзена аўтар Steve Kuo, крыніца
З-за межаў класа, «статычныя зменныя павінны быць даступныя па тэлефоне з імем класа.» З унутранага боку, кваліфікацыя класа выводзіцца кампілятарам.
дададзена аўтар Dek Dekku, крыніца

7 адказы

Статычныя зменныя прыналежаць класу, а не яго асобных асобнікаў (аб'ектаў). Што тычыцца статычных зменных па-за класа з'яўляецца ClassName.myStaticVariable , але ўнутры класа ён падобны на іншыя зменныя асобніка.

Вы заўсёды можаце выкарыстоўваць статычныя зменныя ў не-статычных метадах, але вы не можаце выкарыстаць не-статычныя зменныя ў статычнай прычыне метад, калі статычныя метады загружаюцца другія не статычныя зменнымі асобніка не ствараюцца.

Такім чынам, ваш аператар ID = ++ numberOfBicycles; цалкам дапушчальна і будзе кампілявацца без памылак.

11
дададзена

Знутры класа Ровар класіфікатар не з'яўляецца абавязковым на статычных зменных, гэтак жа, як гэта класіфікатар з'яўляецца дадатковым пераменным асобніка

5
дададзена

Можа быць тое, што кажа ваш лектар з нагоды доступу да іх звонку класа не ўнутры класа. <�Код> статычным зменныя могуць быць даступныя за межамі класа, як гэты ClassName.VariableName або object.VariableName . Але тым не менш першы метад preferrable.

Знутры класа гэта не патрабуецца, вы можаце выкарыстоўваць гэта ключавое слова або имя_класса-класіфікатар у неадназначнасці з лакальнымі зменнымі з тым жа імем ўнутры метадаў і канструктараў.

3
дададзена

Статычныя зменныя з'яўляюцца агульнымі зменнымі. Такім чынам, вы можаце атрымаць да іх доступ, выкарыстоўваючы або Classname.staticVariable або выкарыстоўваючы аб'ект класа instance.staticVariable. У любым выпадку вы будзеце мець на ўвазе адзіным экзэмпляры зменнай у памяці, незалежна ад таго, колькі аб'ектаў вы ствараеце.

3
дададзена
 public int getID(){
    return numberOfBicycles;
}

public static int getNOB(){
    return numberOfBicycles;
}


In the Bicycle class

    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());


In the main class of BicycleTest worked just fine for me

2
дададзена
Вам не трэба, каб зрабіць два адказы ..... вы можаце проста змяніць свой першы адказ ўключыць гэты код
дададзена аўтар pinkpanther, крыніца
ды ў наступны раз будзе рабіць гэта ... да таго часу, пакуль вы чыталі і разумелі.
дададзена аўтар Manny265, крыніца

Нумары статычныя метады могуць атрымаць доступ да статычных членам класа, таму што толькі адна копія статычнай зменнай існуе ў адрозненне ад зменных асобніка, якія ствараюцца толькі адзін раз новы аб'ект гэтага тыпу быў створаны.
Я рэкамендую вам яшчэ адзін клас, каб праверыць, як BicycleTest, які будзе мець галоўны клас, а затым стварыць, можа быць, аб'екты 4Bicycle і выкарыстоўваючы 2getters у класе ровараў здабывання numberofBicycles і ID кожны раз вы ствараеце аб'ект, можа быць, дасць вам карціну пра тое, што адбываецца.

1
дададзена

Улічваючы ваш клас ..

public class Bicycle
{
    private int cadence;
    private int gear;
    private int speed;
    private int id;
    private static int numberOfBicycles = 0;

   //..
}

Калі я ствараю аб'екты тыпу ровара, гэта будзе выглядаць наступным чынам:

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] --> { numberOfBicycles:2 }

І так, каб атрымаць доступ да статычнаму члену, спачатку мы вызначаем статычны паглынальнік для яго:

public static int getNumberOfBicycles ()
{
    return numberOfBicycles;
}

то мы называем яго з класа:

System.out.println(Bicycle.getNumberOfBicycles());
1
дададзена