Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Classi Astratte

  1. #1

    Classi Astratte

    Salve,
    Ho letto questa riga di codice nei Java Tutorials :
    codice:
    ByteBuffer out = ByteBuffer.wrap(data);
    Come può out venire dichiarato se ByteBuffer è una classe astratta e le classi astratte non possono essere istanziate?

    ByteBuffer.wrap() ritorna ByteBuffer, ma essendo ByteBuffer una classe astratta, il metodo wrap()
    deve ritornare una classe che implementa la classe astratta ByteBuffer. Il metodo wrap() non è astratto, e per cui sicuramente ritorna una classe che implementa ByteBuffer,ma nella javadoc non è menzionata alcuna classe di tale tipo .Ad aumentare la mia confusione nel forum
    stackoverflow.com/questions/35317493/java-abstract-class-and-types mi dicono che il metodo wrap() ritorna la classe HeapByteBuffer, ma io questa classe non riesco proprio a trovarla nella javadoc.

    In sintesi , che classe ritorna il metodo wrap()?E dunque l'oggetto out di quale classe è istanza?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Le classi astratte non possono essere istanziate. Infatti, se noti, non c'è scritto da nessuna parte

    new ByteBuffer( ... )


    Bensì, c'è il richiamo ad un metodo statico... cosa fa quel metodo statico? Molto probabilmente istanzierà una sottoclasse concreta di ByteBuffer e ritorna il valore, che verrà assegnato ad una variabile di tipo ByteBuffer: infatti, non è possibile istanziare oggetti di classi astratte, ma è ovviamente possibilissimo dichiarare variabili di tipo astratto (essendo solo dei reference). Allo stesso modo è possibile dichiarare variabili di tipo "interfaccia".


    Quote Originariamente inviata da JavaJava Visualizza il messaggio
    In sintesi , che classe ritorna il metodo wrap()?E dunque l'oggetto out di quale classe è istanza?

    Per saperlo dovrai andarti a guardare il sorgente di ByteBuffer oppure farti stampare il getClass() dell'oggetto out. Ma di per se non ha nessuna importanza quale sia esattamente la classe concreta... quel che importa è che questa sarà sicuramente una implementazione di ByteBuffer e di conseguenza disporrà di tutti i suoi metodi (e, quindi, tu potrai usarne tutti [e soli] i suoi metodi)


    Ciao.
    Ultima modifica di LeleFT; 11-02-2016 a 12:24
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da JavaJava Visualizza il messaggio
    mi dicono che il metodo wrap() ritorna la classe HeapByteBuffer, ma io questa classe non riesco proprio a trovarla nella javadoc.
    HeapByteBuffer è una classe "top-level" (non contenuta in un'altra classe) che è nello stesso package di ByteBuffer ma ha il livello di accesso di "default" (ovvero package level):

    class HeapByteBuffer extends ByteBuffer // Nota: non c'è public !

    Quindi: a) non è visibile all'esterno di java.nio e b) Nei javadoc generalmente (è una cosa configurabile quando si genera la documentazione javadoc) non ci sono le classe package level, perché sostanzialmente sono "private" al package.


    P.S. ce ne sono tante altre similari: HeapCharBuffer, HeapIntBuffer ecc...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Ok grazie avete chiarito bene la questione

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.