2011-09-08 9 views
31

Questo potrebbe essere semplice per gli sviluppatori Java esperti, ma ho appena cant sembrano capirlo. Ho letto un post da qui. Il codice eraJava metodi di primaria importanza per la creazione di nuova istanza di una classe

View v = new View(this) { 
    @Override 
    protected void onDraw(Canvas canvas) { 
     System.out.println("large view on draw called"); 
     super.onDraw(canvas); 
    } 
}; 

Era una domanda Android. Qui l'utente crea un'istanza di una vista e sostituisce un metodo in una singola riga. Esiste un nome per questo tipo di codifica?

Il mio secondo dubbio è, egli ignora un metodo protetto da un altro pacchetto. Non è protetto significa pacchetto privato. So che funzionerà come ho provato ma non riuscivo a capire perché funzionasse. Quindi, perché questo codice funziona?

Ho provato a google questo e cercare in SO prima di chiedere, ma non riuscivo a capire una risposta.

risposta

18

protected significa (approssimativamente) "disponibile per le sottoclassi". (Vedi this table.) Poiché lo new View(this) { ... } crea una sottoclasse, è possibile sovrascrivere il metodo al suo interno.

In questo caso non importa che sei in un pacchetto differente. (Vedere la riga protected e la seconda colonna in this table.) Il fatto che il metodo sia in una sottoclasse è sufficiente per "accedere" a un metodo protetto.


potenziale domanda di follow-up: Che senso ha, se io non posso chiamare il metodo in ogni caso?

Tutti i metodi in Java sono virtuale. Ciò significa che ogni volta che la classe View esegue una chiamata apparentemente interna al metodo onDraw, questa chiamata verrà inviata al metodo sottoposto a override.

+0

ho un pò dimenticati di accesso predefinito e l'accesso protetto. Ma non ero a conoscenza della classe anonima. Grazie. – blessenm

9

Questo non è esattamente un tipo di codifica. Questa è una classe anonima Java. È molto comune in Android e in generale con gli ascoltatori di eventi e quel genere di cose.

Per maggiori dettagli potete leggere this link (probabilmente non il migliore):

Le classi interne anonime è molto utile in qualche situazione. Per esempio si consideri una situazione in cui è necessario creare l'istanza di un oggetto senza creare sottoclassi di una classe e anche eseguendo attività aggiuntive come l'overloading dei metodi.

Circa la seconda domanda, la parola chiave protected significa che il metodo è disponibile solo per le sottoclassi, quindi è possibile eseguire l'override del metodo.

+0

Non ero a conoscenza delle classi anonime in java. Grazie per il link e la spiegazione. Voto +1. – blessenm

3

Questa è una classe anonima. Hai ragione a escludere un metodo protetto e questo è perfettamente normale. Un metodo protetto è visibile e può quindi essere sovrascritto da una sottoclasse, che è ciò che hai creato qui.

pacchetto protetta è l'ambito predefinito quando non si fornisce un ambito per la variabile o il metodo. Questo è diverso da protetto.

1

Proprio come gli altri qui sono già risposto a questa si chiama classe anonima, e sovrascrivendo metodi protetti è legale in quanto metodi protetti sono visibili a classi figlie e classi nel pacchetto stesso.

1

Tante answeres erano lì per "protetto", così ho intenzione di altro :)
@Override è informare il compilatore di ignorare il metodo della classe base, e se non v'è alcun metodo della classe base di questa firma, allora genera errore di compilazione.

Queste sono chiamate annotazioni. Puoi cercare l'argomento delle annotazioni in java. Puoi anche creare annotazioni personalizzate.

saluti,
SSuman185

Problemi correlati