Prima di proseguire non discutiamo e discutiamo brevemente.
E un argomento molto importante chiamato binding del metodo.
È legato al modo in cui i metodi vengono eseguiti.
Ho scoperto che anche molti ingegneri di alto livello non hanno una buona conoscenza di questo
argomento, ma arriveremo alla fine di questo attraverso un Demel molto approfondito quando discuteremo del polimorfismo indirettamente
discusso su parte del legame metallico senza fare alcun riferimento esplicito.
Ad esempio visita che il look del compilatore ha il tipo di riferimento per sapere se B può invocare o meno
un particolare metodo su un riferimento a un oggetto.
E hai anche detto che la JVM esamina il tipo di oggetto per sapere quale metodo eseguirlo.
Quindi questo è tutto il metodo di collegamento è stato divulgato nel contesto dei metodi di istanza.
Ma abbiamo anche metodi statici, quindi ci sono alcuni dettagli in più che dobbiamo sapere riguardo al
binding dei metodi.
Vediamoli.
Tutti i metodi vincolanti sono associati a tutti i metodi.
Quindi ogni volta che vedi una chiamata al metodo che è il metodo di binding su come suggerisce il nome,
si tratta di un meccanismo di associazione di una chiamata di metodo a una dichiarazione e all'implementazione del metodo che viene chiamato.
Ma quella dichiarazione sarebbe l'implementazione del metodo di firma del metodo è il corpo del metodo che viene eseguito
in fase di runtime.
Il summit che chiama è associato a queste due cose.
Uno è la firma del metodo sull'implementazione del metodo su questi sono due passaggi distinti del binding del
metodo su ogni paese pieno di essi come binding della firma del metodo sull'associazione dell'attuazione del metodo.
Diamo un'occhiata a entrambi iniziando con il binding della firma del motard.
Una volta che il compilatore incontra un metodo nell'istruzione Ruction controlla il tipo di riferimento
fuori dall'oggetto reference su questo il metodo è stato invocato include un metodo comparabile
che includerebbe parametri uguali o confrontabili.
E se trova uno denigra le informazioni sulla firma del metodo nel bytecode.
Altrimenti sappiamo che genera un errore del compilatore su questo intero processo, che può essere chiamato binding della
firma del metodo.
E questo è sempre fatto dal compilatore, non importa se il metodo è statico o istanza successiva quando si tratta di eseguire
il metodo vich in fase di esecuzione.
Tale decisione può essere presa dal compilatore o dal budget in tempo, a seconda del tipo di metodo nel contesto se il metodo
è lo stock, quindi la decisione viene presa al momento della compilazione stesso e si
basa ancora sul tipo di riferimento Nahor come metodo di istanza.
Quindi la decisione viene presa in fase di esecuzione dalla JVM e si basa sull'oggetto.
Ricordo come JVM sceglie la domanda più specifica del metodo nella struttura di ereditarietà a partire dall'oggetto su
cui il metodo è invocato.
Quindi i metodi fondamentalmente vincolanti o statici sono completati al momento della compilazione stesso, che si basa
sul tipo di riferimento e ha perfettamente senso perché i metodi di arresto sono metodi di classe e non
mostrano come oggetti GRUBERT creati solo in fase di esecuzione.
Quindi, quale metodo da eseguire in fase di esecuzione viene deciso al momento della compilazione. Arison su un tale tipo di binding
viene indicato come associazione al tempo di compilazione o associazione anticipata.
Questo legame di istanza è importante attendere fino al runtime in quanto dipende dall'oggetto.
Questo si basa solo sull'oggetto e contraddice il runtime.
Vorremmo sapere quale metodo deve essere eseguito un tale tipo di binding è indicato
come runtime binding o late binding, ma tieni presente che anche per esempio i metodi dead firme sono ancora Bontoc compile
time è un leg leg binding è quello che abbiamo visto prima stiamo imparando il polimorfismo e Metallo
su cui stiamo scrivendo qui è una cosa interessante mentre i metodi di istanza sono legati.
Le variabili di istanza sono legate in anticipo che si utilizza una banda diversa per associare variabili di istanza
a variabili statiche e quindi anche esse sono bonderate in anticipo.
Quindi in Java l'associazione anticipata si applica a entrambi i metodi statici e libera la discussione sui militanti o su quale scrittura
di sartorie di variabili d'istanza dovrebbe chiarire il perché.
Le variabili di istanza sono all'inizio di Bonnat e non è quello di chiuderle e questo ci darà una chiara comprensione del
legame con i motard.
E vedremo il bytecode per vedere come funziona l'intero processo di binding dei metodi.
Quindi vedremo un po 'di meno in questa demo se guardiamo solo al metodo binding per i metodi statici
seguiti dal metodo binding per i metodi di istanza.
Dopo di ciò vedranno un esempio interessante.
Questa volta sto provando la demo nel mio editor di notepad perché volevo il pool di runit dalla riga di comando in
aiuto di pull dice in analisi.
Quindi sarà una demo interessante.
E cominciamo con il grosso attacco di motard di serie.
Quindi queste sono le lezioni del nostro caso studio.
Quindi li stiamo solo estendendo e colpendo il suo utente su Djala.
Ho aggiunto questo metodo statico chiama tattica.
È chiamato come metodo tattico e ha un corpo vuoto e Witan è il miglior Djala utente.
Quindi stiamo creando un oggetto stop e il tipo di riferimento è utente in roba di tipo oggetto e stiamo invocando
questo metodo un nuovo metodo chiamato materia statica.
Andiamo avanti e compiliamo e quindi è soddisfacente.
Ora vogliamo assemblare. Vogliamo guardare il bytecode.
E per questo abbiamo bisogno di un Java.
Abbiamo bisogno di un disassemblatore.
Quindi viene fornito con un disassemblatore chiamato jalopy.
È uno strumento.
Puoi trovarlo nella directory di installazione nella cartella bin.
Quindi eccomi qui e la mia directory di installazione in geoduck 1. 8 e nella cartella bin ho
questo strumento chiamato jalopies e può essere usato per disassemblare i classificatori l'input per lo strumento sarebbe un file di classe e
ti mostrerà il byte court che include le istruzioni per JVM.
Quindi facciamolo.
È gelap b il meno.
È un'opzione che significa che è quello che vuoi mostrare tutto.
Un sacco di dettagli riguardanti la bicicletta o e dal momento che il metodo in posizione è fatto nel test utente.
Diciamo solo test utente di classe Daut.
Quindi deve essere di classe Goch e mostra il core di byte del corpo di ogni metodo di classe utente Biton.
E cosa interessante per noi qui, in quanto questa istruzione si chiama static in-work.
E ha anche questo numero qui.
È un numero indice e questo è solo un commento che dice solo ciò che questa particolare istruzione sta
facendo.
OK, quindi qui dice che sai che c'è questa nuova metrica chiamata questione tattica ed è all'interno della
classe utente.
E quindi stiamo invocando questo metodo statico e questa informazione questa parentesi vuota indica che il metodo
non prende alcun parametro e la V.
Questo è il tipo di ritorno del metodo e questo lo rende nullo.
Quindi tutte le informazioni sono qui rappresentate in questo indice ed è un indice in una tabella.
Qui in alto chiamiamo quel pool costante, ma non preoccupiamoci adesso perché ne
discuteremo nel GBM nel prossimo capitolo.
Ma qualunque cosa sia rappresentata lì a indicizzato, allora all'interno di quella tabella, l'output di quello è ciò che vedrai
qui.
OK, ma andiamo verso l'alto e vediamo come appare l'indice.
Quindi questo è chiamato come una costante.
Ecco qui.
Quindi nel prossimo è qui e sta offrendo ancora una volta gruppo ad altri numeri indice ventinove e
trentanove.
Quindi a ventinove qui come qui.
Ed è semplicemente il nome della classe e 39 è qui e include il nome del metodo e le informazioni sui parametri sul
tipo di ritorno.
Quindi questa informazione le informazioni sui parametri e il tipo di ritorno è chiamato come una forma descrittiva
della materia.
È così
che il chiamante così tutta questa cosa è chiamata la specifica Metro.
User Dortch tattica mentoring e questa analisi seguita dal tipo di ritorno.
Quindi si chiama specifica del metodo in modo da avere il nome della classe che
si ha il nome del motard e si ha il descrittore dell'argomento che è fondamentalmente l'informazione del parametro insieme al tipo di ritorno.
Quindi, come puoi vedere, il binding della firma del metodo è già stato fatto.
Ora Van GBM lo incontra quando eseguiamo questo programma su GBM e sui canneti questa istruzione in estatica.
Quindi esaminerà l'indice numero 10 e siccome è semplicemente estatico, sa che lo stocktake motard deve essere all'interno di questa
classe utente che è un tipo di riferimento e guarda in quella classe e trova ciò che
conta.
E poi lo esegue.
Quindi è un legame precoce.
Quindi, nel lavoro statico come Stellung il GBM che è questo è dove la classe è attiva e otterrai.
Ok, adesso è in Rockstar.
Quindi lascia che tu entri nel lavoro che lo farà.
Quindi, se torniamo nella nostra classe, qui siamo in piedi, poster di te, la materia pubblicata sul tuo metodo è
un ordine di materia che abbiamo già nella classe dello staff.
Tutto ok.
È una vecchia scrittura, quindi sostituisce la pubblicazione della classe dell'utente finale.
Quindi questa è una revisione del metodo di istanza è un metodo di istanza come puoi vedere qui.
Ora torniamo al nostro prompt dei comandi e qui alla riga 16.
Dice in-work cosa sei così in-lavoro Whelchel significa che stai per invocare un metodo di istanza.
Quindi cosa vuol dire virtuale.
Significa che il metodo da invocare verrà deciso in fase di runtime.
Destra.
Come vengono richiamati i metodi di istanza ma il binding della firma del metodo è già stato eseguito dal compilatore.
Quindi ho finito qui.
Le istruzioni dicono che se entrate in questo numero dell'indice, beh, ha tutte le informazioni e le
informazioni sono rappresentate in questo commento qui.
Come puoi vedere dice che guarda al tipo di riferimento il tipo di riferimento è l'utente non scritto
che abbiamo questo poster di te e il parametro è una stringa perché sta prendendo una vera stringa di testo
sotto di esso e digita come l'oggetto stesso.
Sappiamo che questo è il binding della firma della metrica ma in fase di esecuzione.
GBM e contatore è questa istruzione.
Osserva il tipo di oggetto e ne conosce già la firma perché è morto nel
byte court.
E quindi cerca nell'oggetto la classe corrispondente al tipo di oggetto che tenta di trovare quel
particolare metodo.
Se lo è se lo trova nella stessa classe, lo esegue semplicemente.
Altrimenti inizia a risalire l'albero ereditario finché trova un metodo e quindi cerca di
trovare un metodo più specifico che conosciamo.
Significa che conosciamo l'intero processo come funziona.
Ecco come lavoreremo.
Questa è la motivazione del motard che abbiamo appena discusso.
Quindi, in pratica, in Rockstar pick è presto l'associazione ci invochiamo virtuali dal momento dell'esecuzione effettiva, ma la
decisione su quale metodo eseguire avviene in tempo.
Legatura tardiva
OK.
Diamo un'occhiata ad un esempio di caso limite.
È un esempio interessante.
Mostralo.
Quindi qui ho questo metodo in uso o dot Java.
È un metodo di istanza chiamato così come metodo di istanza.
Prende un doppio parametro doppio come parametro e semplicemente apre il nome della classe e il nome
di loro al loro staff.
Ho un metodo di istanza del metodo simile qui e ci vuole, invece di raddoppiarne l'assunzione.
E un secondo stampa il nome della classe sul nome del metodo.
Ma non è un metodo prevalente perché la ragione è che il parametro qui è Ingrid come nella superclasse
era doppio.
Quindi deve essere visto.
Posso interpretare un tipo di parametro deve essere lo stesso in ordine.
È più delle regole per sovrascrivere Quindi non è un test utente nomine che si sovrappone.
Lasciatemi solo commentare questo.
Il Midwest qui è nella dichiarazione di posizione.
Quindi eccoci nel metodo dell'istanza di lavoro e stiamo passando la lettera e quale no.
E così lo stiamo passando.
Quindi, cosa pensi che metodo sarebbe invocato.
Naturalmente penseremmo che dal momento che è un metodo di istanza invocherebbe questo particolare metodo
nella classe dello staff perché è la versione più specifica e ha come parametro anche un argomento
passato qui.
E comunque questo non succederà e vedremo anche perché la ragione di ciò.
Quindi fammi solo compilare questo.
Lascia che esegua il test utente come puoi vedere, non sta stampando il metodo di istanza nella classe utente, non in una
classe e roba.
Quindi questa è un'informazione sorprendente.
E il motivo è che lasciatemi fare una jalopy sulla classe di test dell'utente.
Ecco il metodo principale e tutto il codice byte all'interno del metodo principale e qui è la parte interessante.
Quindi dice di invocare quello che vuoi perché è un metodo di istanza, ma qui dice che il metodo
di istanza è in user class, che è OK ma la cosa principale è che dice che il parametro è doppio.
Non ha detto che è un tipo di sottoscrizione ovviamente è nullo.
E la ragione di ciò è il compilatore quando incontra questa dichiarazione di invocazione.
Quindi esaminerà la classe User e vedrà se può trovare un metodo comodo se riesce a
trovare un metodo compatibile.
Quindi li guarda e glielo dice.
E usa il classico trova questo nome di metodo.
E poi lo guarda se c'è un parametro compatibile.
Quindi qui il parametro è e quindi l'istruzione location, ma qui il parametro è doppio.
Quindi è come se un doppio fosse comodo perché a causa dell'implicito può essere implicitamente lanciato per raddoppiare.
Quindi è completo. È un tipo compatibile.
Quindi nel bytecode che scrive la firma della metrica come metodo di istanza e utilizza il parametro
deve essere doppio.
Quindi in fase di esecuzione sai quando JVM è finito e guarda le istruzioni che vede.
OK.
Ecco un metodo di istanza che esamina il tipo di oggetto.
Quindi inizia da stop e quindi Stafford non trova questo metodo giusto perché esiste un metodo di
istanza, ma nel bloccarci ha il parametro.
E così scala l'albero ereditario su di esso che entra in un utente e lì lo vede.
OK, questo è il metodo di istanza con il doppio barometro ASP eseguito.
E questo è il motivo per cui lo stiamo vedendo.
Quindi questa è una cosa interessante quando il compilatore cerca di trovare un metodo comodo che è stato il
motivo principale di questo strano comportamento.
E ho anche sentito la stessa cosa per un altro metodo che è anche chiamato Does instance matter ma invece di
primer non stiamo avendo l'utente come il parametro su questo è in uso o meno Java e cose del genere.
Abbiamo roba come parametro che è un sottotipo.
Quindi è esattamente lo stesso comportamento.
Non abbiamo nemmeno bisogno di testare i record.
È solo per istruire.
Ma potrebbe darsi che stiamo usando lo stesso tipo di riferimento.
Quindi, come puoi vedere, stavolta stampa un utente con un metodo di istanza.
Ecco, questo è un caso limite e la maggior parte di queste informazioni proviene da un articolo scritto da Kishor.
Sharon è stato l'autore di sfruttare Java 7, che è uno dei buoni libri del libro, quindi ho
intenzione di caricare l'articolo nella sezione risorse in cui fornirò un collegamento a quell'articolo.
Starei bene con loro
Quindi, se sei interessato, puoi guardarli ma scoprire che le informazioni sono presentate qui, quindi
non devi farlo.
Ma se sei un investitore puoi verificarlo anche tu.
E questo è.