2012-01-31 1 views
9

In Java, è possibile accedere a un membro pubblico di una classe utilizzando . come si può vedere nella seconda riga del metodo principale nell'esempio seguente (per l'esempio, ignorare il mio scarso utilizzo di incapsulamento).È il '.' per l'accesso dei membri considerato un operatore in Java?

public class Test { 
    public static void main(String[] args) { 
     Position p = new Position(0,0); 
     int a = p.x; // example of member access 
    } 
} 

class Position { 
    public int x; 
    public int y; 

    public Position(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

Is i . considerati un operatore nel linguaggio di programmazione Java, proprio come *, ~, e != sono considerati operatori?


Modifica - Estendere l'esempio di cui sopra:

Come è stato fatto notare, sembra che la specifica del linguaggio Java considera . di essere un separatore e non un operatore. Tuttavia, vorrei sottolineare che . mostra un comportamento che sembra piuttosto operatore-ish. Si consideri l'esempio precedente estesa alla seguente:

public class Test { 
    public static void main(String[] args) { 
     Position p = new Position(0,0); 
     int a = p . x; // a -> 0 
     int x = 1; 
     int b = p . x + x; // b -> 1 
    } 
} 

class Position { 
    public int x; 
    public int y; 

    public Position(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

È chiaro che alcuni precedenza viene applicata in modo tale che l'accesso membro è valutata prima dell'aggiunta. Questo sembra intuitivo perché se l'aggiunta dovesse essere valutata prima, allora avremmo p.2 che è una sciocchezza. Tuttavia, è chiaro che . mostra un comportamento che gli altri separatori non presentano.

+0

Considera di ignorare la sintassi "this". È una cattiva pratica nel mondo java, super nell'altra parte va bene quando estendi le lezioni. – Tom

+3

@Tom Se mi sono sbarazzato degli usi di 'this' nel mio esempio, allora i miei campi pubblici non sarebbero stati istanziati e avrei avuto un errore in fase di esecuzione. Inoltre, ciò non è particolarmente attento alla mia domanda. – jbranchaud

+3

@ Tom La tua opinione forse, ma difficilmente una regola generale. Personalmente trovo l'uso di questo in setter e costruttori di gran lunga superiore a inventare nuovi nomi per i parametri, così posso distinguerli e i campi. – Voo

risposta

15

è considerato un separatore , non un operatore . Vedere lo Java Language Specification sections 3.11 and 3.12 per un elenco di tutti i separatori e operatori.

+0

Ho ancora qualche incertezza. Nel contesto di un doppio (ad esempio '1.1'), sembra un separatore, ma sembra essere più di un operatore nel contesto dell'accesso dei membri. – jbranchaud

+0

@Treebranch - Nella discussione su [controllo accessi] (http://java.sun.com/docs/books/jls/third_edition/html/names.html#104285), il JLS descrive _qualified names_: "a". "appare il token, preceduto da qualche indicazione di un pacchetto, tipo o espressione avente un tipo e seguito da un identificatore che nomina un membro del pacchetto o del tipo." Quindi c'è un "token" e più simile alla punteggiatura (cioè, separatore) di un operatore. In ogni caso, l'esatta classificazione del "." il token non è così importante in Java come lo è, diciamo, in C++, perché Java non consente l'override dell'operatore. –

+0

Ha senso quando si mette così, grazie per la spiegazione! – jbranchaud