Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di angelo85ct
    Registrato dal
    Dec 2007
    Messaggi
    322

    Esercizio java, ereditarietà super o this??

    Salve ragazzi, il proff oggi ha spiegato questo piccolo esempio:

    Codice PHP:

    public class Student {
    public 
    String name "";
    public 
    String gtNumber "";
    public 
    int transcriptCount 0;
    public 
    void identifySelf( ) {
    System.out.println("My name is " name);
    // identifySelf
    public void requestTranscript( ) {
    sendTranscript( );
    transcriptCount++;
    // requestTranscript
    public void sendTranscript( ) {
    System.out.println("Sending transcript");
    // sendTranscript
    // Student 
    Codice PHP:

    public class GradStudent extends Student {
    int cost;
    public 
    GradStudent() {
    this.cost 2// oppure this.setCost(2);
    // constructor
    public int getCost(){ return cost; }
    public 
    void setCost(int cost) { this.cost cost; }
    public 
    void sendTranscript( ) {
    this.identifySelf();
    System.out.println("I am a graduate student.");
    System.out.println("Transcript Cost: " getCost());
    setCost(getCost()+1);
    // sendTranscript
    // GradStudent 
    il mio problema è il segunete:

    dove dice:
    this.identifySelf(); non dovrebbe essere super???

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Esercizio java, ereditarietà super o this??

    Originariamente inviato da angelo85ct
    dove dice:
    this.identifySelf(); non dovrebbe essere super???
    Visto che comunque identifySelf() viene "ereditato" (e quindi "c'è" in GradStudent) il this è corretto.
    Per come sono quelle due classi e basta (e senza preventivare altro), mettere super sarebbe anche funzionalmente corretto. Ma con super si "forza" la invocazione proprio del metodo sempre e solo nella superclasse! Se GradStudent (o una eventuale sottoclasse) ridefinisse identifySelf(), mettendo super non verrebbe affatto usata la nuova implementazione!!
    super vuol dire "esattamente quello nella superclasse" .... che è ben diverso da "quello implementato nell'oggetto istanziato".

    Quindi, in mancanza di esigenze/indicazioni specifiche, il this è appropriato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di angelo85ct
    Registrato dal
    Dec 2007
    Messaggi
    322
    Grazie, ma una cosa, allora in questo esempio, mettendo this, lui si richiama il metodo della classe madre, visto che nella figlia non è stato definito nessun metodo, oppure no???

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da angelo85ct
    Grazie, ma una cosa, allora in questo esempio, mettendo this, lui si richiama il metodo della classe madre, visto che nella figlia non è stato definito nessun metodo, oppure no???
    Nota innanzitutto che puoi anche non esplicitare this., il discorso che ho fatto prima è solo concettuale sul fatto che super è ben diverso da this!

    Comunque sì, che tu metta o no this, viene invocato il identifySelf() di Student, che per come è GradStudent, è l'unica implementazione del metodo.
    Se in GradStudent avessi messo un void identifySelf(), la invocazione avrebbe usato questo (che è l'override).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di angelo85ct
    Registrato dal
    Dec 2007
    Messaggi
    322
    Molte grazie.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da angelo85ct
    Molte grazie.
    Prego. E se vuoi verificare la giusta comprensione del tutto, prova a dire cosa stampa questo:

    codice:
    public class Prova {
        public static void main(String[] args) {
            C c = new C();
            c.m1();
        }
    }
    
    class A {
        public void m1() {
            System.out.print("A");
            this.m3();
        }
    
        public void m2() {
            System.out.print("B");
        }
    
        public void m3() {
            System.out.print("C");
        }
    }
    
    class B extends A {
        public void m1() {
            System.out.print("D");
        }
    
        public void m2() {
            System.out.print("E");
            super.m1();
        }
    }
    
    class C extends B {
        public void m1() {
            System.out.print("F");
            this.m2();
        }
    
        public void m3() {
            System.out.print("G");
            super.m3();
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di angelo85ct
    Registrato dal
    Dec 2007
    Messaggi
    322
    Dovrebbe stampare FEAC, ma facendolo eseguire, mi sono accorto che stampa FEAGC, come mai?

    se viene creato un oggetto di tipo c, e chiamato solo il metodo c.m1, perché stampa la G?? che risiede nel metodo m3 della classe c?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da angelo85ct
    Dovrebbe stampare FEAC, ma facendolo eseguire, mi sono accorto che stampa FEAGC, come mai?

    se viene creato un oggetto di tipo c, e chiamato solo il metodo c.m1, perché stampa la G?? che risiede nel metodo m3 della classe c?
    Eh eh ... l'ho scritto apposta con flusso "strano" per mescolare un po' le carte ....

    - Il main invoca m1() di C e su questo non ci sono dubbi, stampa "F".
    - m1() di C invoca this.m2(). In C non c'è un m2() ma c'è quello "ereditato" da B, quindi viene invocato m2() di B, pertanto stampa "E".
    - m2() di B invoca super.m1(). super come ho già detto vuol dire "esattamente quello nella superclasse". Non c'è alcuna invocazione "virtuale" basata sull'oggetto reale! Quindi vuol dire proprio m1() di A che stampa "A".
    - m1() di A invoca this.m3(). Questa è una invocazione "virtuale". Il this non vuol dire "quello di questa classe" ma "quello ridefinito nell'oggetto realmente instanziato". Pertanto viene invocato m3() di C (che è l'oggetto istanziato) che stampa "G".
    - m3() di C invoca super.m3(), quindi il m3() di B. Non c'è un m3() dichiarato espressamente in B ma resta comunque quello ereditato da A, pertanto viene invocato m3() di A che stampa "C".

    EDIT: e i 'this' espliciti li ho messi solo per "confondere" un po' ... sono superflui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9

    Re: Esercizio java, ereditarietà super o this??

    Originariamente inviato da angelo85ct
    Salve ragazzi, il proff oggi ha spiegato questo piccolo esempio:

    Codice PHP:

    public class Student {
    public 
    String name "";
    public 
    String gtNumber "";
    public 
    int transcriptCount 0;
    public 
    void identifySelf( ) {
    System.out.println("My name is " name);
    // identifySelf
    public void requestTranscript( ) {
    sendTranscript( );
    transcriptCount++;
    // requestTranscript
    public void sendTranscript( ) {
    System.out.println("Sending transcript");
    // sendTranscript
    // Student 
    Codice PHP:

    public class GradStudent extends Student {
    int cost;
    public 
    GradStudent() {
    this.cost 2// oppure this.setCost(2);
    // constructor
    public int getCost(){ return cost; }
    public 
    void setCost(int cost) { this.cost cost; }
    public 
    void sendTranscript( ) {
    this.identifySelf();
    System.out.println("I am a graduate student.");
    System.out.println("Transcript Cost: " getCost());
    setCost(getCost()+1);
    // sendTranscript
    // GradStudent 
    il mio problema è il segunete:

    dove dice:
    this.identifySelf(); non dovrebbe essere super???

    Se tu fossi dentro all'override del metodo "public void identifySelf( ) { " nella classe GradStudent alllora si che per riferirti al metodo della classe padre devi fare super.... se no è giusto this dato che.. non essendo overridato... lo eredita direttamente da Student

  10. #10
    tempo di rispondere e avete già fatto e finito la 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.