Richiesta di aiuto per risolvere un esercizio

di il
27 risposte

Richiesta di aiuto per risolvere un esercizio

Buongiorno a tutti .
Mi presento . Mi chiamo Fabio e sono uno studente lavoratore .
Studio Ingegneria informatica .
Devo prepararmi per sostenere l'esame di Ingegneria del software e programmazione ad oggetti.
Mi sono installato un compilatore java precisamente Netbeans in ambiente java JDK.
Inizio a svolgere i primi programmi in java e fino ad oggi la compilazione e' andata sempre bene.
Oggi mi si e' presentato un problema nello svolgimento dell'esercizio postato in basso.
Vorrei riuscire a compilare questo programma sperando che possiate darmi un aiuto.
Il problema e' non riesco a capire cosa devo aprire in java .
Mi spiego meglio . Quando si crea un nuovo programma java si crea un pacchetto (Package ) e fin qui e' semplice .
Mi creo per esempio un package che si chiama Polimorfismo .
Una volta creato un package quali sono glia altri passi da fare ??
E' giusto crearsi due classi una C.java e l'altra L.java ?
devo utilizzare New class ?
inoltre la cosa piu' importante cos'e' e come si apre una interface ??
Spero veramente possiate darmi un aiuto perchè sono all'inizio.
Non chiedo di risolvermi l'esercizio ma soltanto di indicarmi cosa fare .
Grazie



/* obiettivo: verificare comprensione polimorfismo e overloading
- cosa stampa il seguente programma?
- perche' ?
- compilare ed eseguire il programma per verificare la propria risposta

*/

interface C {
public void dim(C c);
public void dim(L l);
public void dim(K k);
}
class K implements C {
public void dim(C c) {
System.out.println("K.dim(C) ");
}
public void dim(L l) {
System.out.println("K.dim(L) ");
}
public void dim(K k) {
System.out.println("K.dim(K) ");
}
}
public class L implements C {
public void dim(C c) {
System.out.println("L.dim(C) ");
}
public void dim(L l) {
System.out.println("L.dim(L) ");
}
public void dim(K k) {
System.out.println("L.dim(K) ");
}

public static void main(String args[]) {
C a = new K();
C b = new L();
a.dim(b);
L a1 = new L();
a1.dim(a);
}
}

27 Risposte

  • Re: Richiesta di aiuto per risolvere un esercizio

    FabioJ ha scritto:


    Una volta creato un package quali sono glia altri passi da fare ??
    E' giusto crearsi due classi una C.java e l'altra L.java ?
    I package servono principalmente per due scopi:
    1) "qualificare" meglio le classi. java.util.Date e java.sql.Date sono entrambe classi che rappresentano un istante nel tempo (la prima in generale, la seconda specifica per JDBC per i database), hanno stesso nome semplice ma nome completamente qualificato differente. Quindi per la JVM sono tipi differenti.
    2) raggruppare "logicamente" tipi che sono correlati tra di loro.

    FabioJ ha scritto:


    inoltre la cosa piu' importante cos'e' e come si apre una interface ??
    Cioè?? Così è detto "male".

    FabioJ ha scritto:


    Spero veramente possiate darmi un aiuto perchè sono all'inizio.
    Non chiedo di risolvermi l'esercizio ma soltanto di indicarmi cosa fare .
    Ci sono due concetti molto importanti: override e overload. Li hai compresi? Hai dubbi o problemi a riguardo?
  • Re: Richiesta di aiuto per risolvere un esercizio

    Grazie per avermi risposto.
    Il concetto di override e overload teoricamente li ho piu' meno compresi pero' praticamente no.
    Speravo di riuscire a compilare questo esercizio per capire questi due concetti nella pratica.
    Ho fatto la domanda sul package perche' nell'esercizio non e' riportato .
    Comunque mi sembra di capire che per compilare un programma in java sia necessario creare un package , almeno utilizzato come raccoglitore ( cartellina)
    Sarebbe importante riuscire a compilare questo esercizio almeno riuscire a capire bene i concetti di Polimorfismo e overloading.
    Ho provato a trascrivere l'esercizio in java cosi' come e' in una sola classe pero' gli errori erano molti e non di facile comprensione.

    Per quanto riguarda interface ho notato che nel banner di netbeans nella tendina New c'e' java interface pero' non e' come new class e' un'latra cosa che non riesco a capire . Nell'esercizio c'e' scritto " interface C { " , Interface significa interfaccia pero' non capisco a cosa serve , per questo vorrei compilare questo esercizio e vedere il risultato.
  • Re: Richiesta di aiuto per risolvere un esercizio

    FabioJ ha scritto:


    Comunque mi sembra di capire che per compilare un programma in java sia necessario creare un package
    No, tecnicamente non è obbligatorio dare un package alle classi. Per progetti "reali" e ampi chiaramente è assolutamente buona cosa usare i package.
    Per prove al volo o programmini di esempio, i package si possono anche non usare. Ovvero si usa il package "unnamed" (senza nome) o detto anche di "default".
    In Eclipse ad esempio viene indicato come (default package) che in sostanza vuol dire che i sorgenti sono direttamente dentro una "src" (o src/main/java se il progetto è basato su Maven). In NetBeans è sicuramente similare (ma come ti indica il package di default non lo so ora).

    FabioJ ha scritto:


    Ho provato a trascrivere l'esercizio in java cosi' come e' in una sola classe pero' gli errori erano molti e non di facile comprensione.
    Tutto quel codice che hai postato (dimentichiamo il package, NON ti serve per ora), messo in un file L.java (c'è una classe pubblica, che è L, quindi il file sorgente DEVE chiamarsi L.java) compila senza errori.
  • Re: Richiesta di aiuto per risolvere un esercizio

    In questo momento non posso utilizzare il compilatore.
    Domani ci provo. In ogni modo per ricapitolare quello che mi stai dicendo è di creare un programma senza Package perché non necessario e una classe pubblica di nome L.java? È sicuro che basta una sola classe con all'interno tutte le istruzioni compreso il main ? Mi sembra strano però ci provo.
  • Re: Richiesta di aiuto per risolvere un esercizio

    FabioJ ha scritto:


    È sicuro che basta una sola classe con all'interno tutte le istruzioni compreso il main ? Mi sembra strano però ci provo.
    Le regole di Java a questo livello sono semplici:
    - un singolo file sorgente .java può contenere più definizioni di tipi (classi, interfacce, ....)
    - ci può essere al massimo solo un tipo marcato "public" nel file sorgente
    - se c'è un tipo public, il nome del file .java DEVE corrispondere esattamente al nome della classe (maiuscolo/minuscolo compresi).
    - se non c'è un tipo public, non c'è alcuna imposizione sul nome del file.
  • Re: Richiesta di aiuto per risolvere un esercizio

    Buongiorno Endbin.
    Buone notizie . Ho seguito i tuoi consigli e sono riuscito a far girare il programma.
    Nessun errore , il programma e' partito al primo colpo.
    Questo e' quello che visualizza a video dopo la compilazione .
    Ho deciso comunque di creare un package . Il risultato e' il seguente .

    run:
    K.dim(C)
    L.dim(C)
    BUILD SUCCESSFUL (total time: 0 seconds)


    Il primo passo per la soluzione di questo esercizio e svolto pero' purtroppo non capito perche' viene fuori
    K.dim(C) , e L.dim(C) .
    Non ho capito con questa verifica ne il polimorfismo e ne l'overloading.
    So programmare bene in C e in C++ ed ho svolto diversi esercizi con vettori e matrici pero' non mi e' mai capitato di svolgere un esercizio del genere .
    K.dim(C) e L.dim(C) sembrano due vettori che contengono la variabile C pero' non ho compreso questo risultato.

    Vorrei capire il polimorfismo di questo esercizio partendo da questa definizione:
    ( Mi aiutate per favore )
    Polimorfismo = un'espressione oggetto puo' avere tipo il dinamico diverso da quello statico:
    • ad hoc
    ? overloading
    ? coercion
    • universale
    ? parametrico
    ? d'inclusione (indotto dall'ereditarieta')
  • Re: Richiesta di aiuto per risolvere un esercizio

    FabioJ ha scritto:


    Non ho capito con questa verifica ne il polimorfismo e ne l'overloading.
    Hai un buon libro su cui studiare Java? Non posso ovviamente (per tempo/spazio) spiegarti tutto dell'overload/override.
    Se hai dubbi precisi, posso risponderti certamente. Ma se la tua questione è "non ho capito nulla di questi concetti", non posso farti un post chilometrico.

    P.S. parti dal "overload" che è più semplice.
  • Re: Richiesta di aiuto per risolvere un esercizio

    Prendiamo questo di esempio scritto al volo:
    class A {
        public void prova(Object o) {
            System.out.println("A.prova(Object)");
        }
    
        public void prova(Number n) {
            System.out.println("A.prova(Number)");
        }
    
        public void prova(Long l) {
            System.out.println("A.prova(Long)");
        }
    }
    
    class B extends A {
        public void prova(Integer i) {     // Questo è un overload !
            System.out.println("B.prova(Integer)");
        }
    
        public void prova(Number n) {      // Questo è un override !
            System.out.println("B.prova(Number)");
        }
    }

    Scenario semplice, se fai:
    A a = new A();
    Double d = new Double(12);
    a.prova(d);
    Cosa ti aspetti di ottenere?
  • Re: Richiesta di aiuto per risolvere un esercizio

    Secondo me ,

    A.prova(Object)

    questa risposta la sto dando al volo senza aver troppo ragionato .

    forse devo rifletterci un po' di piu' ...
  • Re: Richiesta di aiuto per risolvere un esercizio

    FabioJ ha scritto:


    Secondo me ,

    A.prova(Object)
    No. Innanzitutto il concetto di overload. Overloading significa dare lo stesso nome a più metodi della stessa classe (o tra una sotto-classe e super-classe, vale lo stesso) che però devono avere quantità/tipi di parametri differenti. Questo si usa per dare maggior "flessibilità" a chi vuole usare una certa funzionalità dell'oggetto. Insomma, più metodi in overload dovrebbero fare concettualmente la stessa/similare cosa ma con "input" differenti.

    Tieni presente che le classi Byte, Short, Integer, Long ecc... hanno come super-classe Number, che fa da generalizzazione. E poi Number deriva da Object.

    Altra cosa importante e fondamentale: l'overloading viene risolto in fase di compilazione. E il compilatore sceglie la versione da invocare solo in base al tipo "statico" (quello che deduce il compilatore) del reference su cui è invocato il metodo e in base al tipo statico degli argomenti.

    Il metodo prova è invocato su a che è di tipo A. Quindi SOLO i metodi di A vengono considerati. L'argomento è di tipo Double, questo è noto al compilatore. Dei tre metodi di A, quello prova(Long) NON è applicabile. La classe Long non c'entra niente con Double.
    Restano quindi prova(Object) e prova(Number), entrambi sono in grado di gestire un Double. Il compilatore però sceglie sempre la versione più "specifica". E tra i due è Number ad essere più specifico di Object. Quindi il metodo invocato è prova(Number)



    Altro scenario, attenzione qui:
    A a = new A();
    Object o = new Double(12);
    a.prova(o);
    Ora?
  • Re: Richiesta di aiuto per risolvere un esercizio

    Se non ti dispiace vorrei arrivarci passo passo perche' voglio dare la risposta giusta.

    Per esempio nel tuo quesito :

    A a = new A();
    Object o = new Double(12);
    a.prova(o);
    Io asserisco che i metodi sono A e Object
    Dove vengono istanziati con a = newA(); e o = New Double(12);
    scrivendo a.prova(o) si rende uguali i due metodi
    ( primo passo )Questa mia asserzione e' corretta ?
  • Re: Richiesta di aiuto per risolvere un esercizio

    FabioJ ha scritto:


    Io asserisco che i metodi sono A e Object
    Dove vengono istanziati con a = newA(); e o = New Double(12);
    scrivendo a.prova(o) si rende uguali i due metodi
    Che vuol dire "si rende uguali i due metodi" ?? Non ha granché senso, detto così.

    Qui lo scenario è questo: il prova è invocato su un reference di tipo A e l'argomento, attenzione, per il compilatore è di tipo Object.
  • Re: Richiesta di aiuto per risolvere un esercizio

    Al momento non riesco a dare una risposta a questo quesito. E' inutile buttare una risposta a caso.
    Mi serve un po' di tempo per capire bene l'argomento.
    Ti chiedo cortesemente ( se puoi ) di non mollarmi perché e' un concetto importante un po' difficile da capire .
    E' un nodo da sciogliere . Grazie.
  • Re: Richiesta di aiuto per risolvere un esercizio

    Comunque una risposta ad intuito e non a caso la do.

    A.prova(Object)
Devi accedere o registrarti per scrivere nel forum
27 risposte