2013-06-02 16 views
10
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; 
    } 
     // ... 
} 

Nauczyłem się w mojej klasie, że Static variables should be accessed by calling with class name. tj ClassName.VariableNameDostęp do zmiennych statycznych

Ale w powyższym kodzie, jak jest to stwierdzenie id = ++numberOfBicycles; skompilowany bez błędów, choć zmienna numberOfBicycles jest static

+3

Od poza klasą „zmienne statyczne powinny być dostępne dzwoniąc z nazwą klasy. " Od wewnątrz kwalifikacja klasy jest określana przez kompilator. –

+3

Zauważ, że ta linia 'id = ++ numberOfBicycles;' nie jest bezpieczna dla wątków –

Odpowiedz

11

Statyczne zmienne należą do klasy, a nie do poszczególnych instancji (obiektów). Odnośne zmienne statyczne poza klasą są przez ClassName.myStaticVariable, ale wewnątrz klasy jest podobny do innych zmiennych instancji.

Zawsze można używać zmiennych statycznych w metodach nie statycznych, ale nie można używać zmiennych statycznych w metodach statycznych, z których wynika, że ​​przy ładowaniu metod statycznych nie są tworzone inne statyczne zmienne instancji.

Twoje oświadczenie id = ++numberOfBicycles; jest całkowicie poprawne i zostanie skompilowane bez błędów.

5

Od wewnątrz klasie Bicycle kwalifikator jest opcjonalny na zmiennych statycznych, podobnie jak this kwalifikatora jest opcjonalne dla zmiennych instancji

3

Może być tym, o czym mówił twój wykładowca, jeśli chodzi o dostęp do nich spoza klasy, a nie z wnętrza klasy. static zmienne są dostępne poza klasą taką jak ta ClassName.VariableName lub object.VariableName. Jednak pierwsza metoda jest preferowana.

Z poziomu klasy nie jest potrzebne, można użyć słowa kluczowego this lub classname-qualifier, aby ujednoznacznić ze zmiennymi lokalnymi o tej samej nazwie wewnątrz metod i konstruktorów.

3

Zmienne statyczne to zmienne wspólne. Dostęp do nich można uzyskać za pomocą klasy Class.staticVariable lub obiektu klasy instance.staticVariable. W każdym razie będziesz odwoływał się do pojedynczej kopii zmiennej w pamięci, bez względu na to, ile obiektów tworzysz.

1

Biorąc klasa ..

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

    // .. 
} 

gdy tworzę obiekty typu rowerów, to będzie tak:

Bicycle a = new Bicycle (1,2,3); 

Bicycle b = new Bicycle (2,3,4); 

w pamięci, to jest tak:

[a] --> { id:1, cadence:1, gear:2, speed:3 } 

[b] --> { id:2, cadence:2, gear:3, speed:4 } 

numberOfBicycles jest statyczny, więc nie jest częścią żadnego obiektu rowerowego, jest związany z klasą, a nie z obiektem, a więc będzie b e jak to w pamięci:

[Bicycle] --> { numberOfBicycles:2 } 

I tak, aby uzyskać dostęp element statyczny, najpierw zdefiniować statyczną getter dla niego:

public static int getNumberOfBicycles() 
{ 
    return numberOfBicycles; 
} 

wtedy nazywamy go z klasy:

System.out.println(Bicycle.getNumberOfBicycles()); 
1

Metody nie statyczne mogą uzyskać dostęp do elementów statycznych klasy, ponieważ istnieje tylko jedna kopia zmiennej statycznej, w przeciwieństwie do zmiennych instancji, które są tworzone tylko po utworzeniu nowego obiektu tego typu. Polecam, abyś przetestował inną klasę, np. BicycleTest, która będzie miała główną klasę, a następnie utworzy 4Bicycle obiekty i za pomocą 2getterów w klasie Bicycle pobierze numberofBicycles i ID za każdym razem, gdy utworzysz obiekt, który może dać ci zdjęcie co się dzieje.

2
public int getID(){ 
    return numberOfBicycles; 
} 

public static int getNOB(){ 
    return numberOfBicycles; 
} 


W klasie rowerów

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


W głównej klasy BicycleTest pracował dobrze dla mnie

+1

nie musisz tworzyć dwóch odpowiedzi ..... możesz po prostu edytować swoją pierwszą odpowiedź, aby dołączyć ten kod – pinkpanther

+0

tak, następnym razem zrobię to ... tak długo, jak to czytasz i rozumiesz. – Manny265

Powiązane problemy