2013-06-02 23 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; 
    } 
     // ... 
} 

Ho imparato nella mia classe che Static variables should be accessed by calling with class name. cioè ClassName.VariableNameAccesso alle variabili statiche

Ma nel codice di cui sopra, come è questo dichiarazione id = ++numberOfBicycles; compilata senza errori, anche se la variabile numberOfBicycles è static

+3

dall'esterno della classe, "variabili statiche devono essere accessibili da chiamare con il nome della classe. " Dall'interno, la qualifica della classe viene dedotta dal compilatore. –

+3

Si noti che questa riga 'id = ++ numberOfBicycles;' non è thread-safe –

risposta

11

Le variabili statiche sono di proprietà della classe anziché delle singole istanze (oggetti). Le variabili statiche di riferimento al di fuori della classe sono di ClassName.myStaticVariable ma all'interno della classe è simile ad altre variabili di istanza.

È sempre possibile utilizzare le variabili statiche in metodi non statici ma non è possibile utilizzare variabili non statiche nei metodi statici, poiché quando vengono caricati metodi statici non vengono create altre variabili di istanza non statiche.

Quindi la vostra dichiarazione id = ++numberOfBicycles; è perfettamente valida e verrà compilata senza errori.

5

all'interno della classe qualificatore Bicycle è opzionale su variabili statiche, proprio come il qualificatore this è facoltativo sulle variabili di istanza

3

Può essere quello che ha detto il docente riguarda l'accesso da fuori classe non all'interno della classe. È possibile accedere alle variabili static all'esterno della classe come questa ClassName.VariableName o object.VariableName. Ma comunque il primo metodo è preferibile.

Dall'interno della classe non è necessario è possibile utilizzare la parola chiave this o classname-qualifier per distinguere le variabili locali con lo stesso nome all'interno di metodi e costruttori.

3

Le variabili statiche sono le variabili condivise. Quindi puoi accedervi usando Classname.staticVariable o usando un oggetto della classe instance.staticVariable. In ogni caso ti riferirai alla singola copia della variabile in memoria, indipendentemente dal numero di oggetti che crei.

1

Data la tua classe ..

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

    // .. 
} 

Quando creo un oggetti di tipo bicicletta, sarà simile a questo:

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

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

In memoria, è come questo:

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

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

numberOfBicycles è statico, quindi non fa parte di alcun oggetto Bicycle, è correlato alla classe e non a un oggetto, quindi sarà b e come questo in memoria:

[Bicycle] --> { numberOfBicycles:2 } 

E così per accedere al membro statico, in primo luogo definiamo un getter statico per esso:

public static int getNumberOfBicycles() 
{ 
    return numberOfBicycles; 
} 

poi ci chiamano dalla classe:

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

I metodi non statici possono accedere ai membri statici di una classe poiché esiste solo una singola copia della variabile statica a differenza delle variabili di istanza che vengono create solo dopo aver creato un nuovo oggetto di quel tipo.
Ti consiglio di avere un'altra classe da testare, come BicycleTest che avrà la classe principale e quindi creare forse 4 oggetti Bicycle e utilizzando 2getters nella classe Bicycle recupera il numero di biciclette e ID ogni volta che crei un oggetto che forse ti darà una foto di che cosa sta succedendo.

2
public int getID(){ 
    return numberOfBicycles; 
} 

public static int getNOB(){ 
    return numberOfBicycles; 
} 


Nella classe biciclette

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


Nella classe principale del BicycleTest funzionato bene per me

+1

non è necessario effettuare due risposte ..... è sufficiente modificare la prima risposta per includere questo codice – pinkpanther

+0

yeah la prossima volta lo farà ... a patto che tu lo abbia letto e capito. – Manny265

Problemi correlati