Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Polimorfismo Exception

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305

    Polimorfismo Exception

    Se ho
    codice:
    Exception ex=exc;
    System.out.println(ex.getMessage());
    nell'ipotesi che exc, sia una qualsiasi exception (unchecked o checked), che si verifica magari in seguito a un errore. Il metodo getMessage() restituisce lo stesso messaggio anche senza cast?

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Certo!

    Poco importa che l'eccezione sia una NullPointerException, una IOException o una qualsiasi altra classe: il getMessage() che verrà chiamato sarà quello dell'oggetto che è stato istanziato.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Il metodo getMessage() restituisce lo stesso messaggio anche senza cast?
    Sì, non c'è differenza tra ex.getMessage() e, direttamente, exc.getMessage(). Il getMessage() invocato è comunque sempre quello implementato nell'oggetto istanziato.

    Con i metodi di istanza tieni sempre a mente che: il compilatore sceglie solo la signature del metodo basandosi sul tipo "statico" del reference e sugli argomenti (quantità e tipo "statico") passati. Mentre la JVM a runtime invoca la versione implementata nell'oggetto realmente istanziato.
    Ultima modifica di andbin; 21-05-2014 a 21:11
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da andbin Visualizza il messaggio

    Con i metodi di istanza tieni sempre a mente che: il compilatore sceglie solo la signature del metodo basandosi sul tipo "statico" del reference e sugli argomenti (quantità e tipo "statico") passati.
    Potresti rispiegare meglio questo passaggio. Grazie

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Potresti rispiegare meglio questo passaggio. Grazie
    Certo. Dato:

    codice:
    public class A {
        public void test(Object o) { System.out.println("A.test(Object o)"); }
        public void test(String s) { System.out.println("A.test(String s)"); }
    }
    
    public class B extends A {
        public void test(Object o) { System.out.println("B.test(Object o)"); }
        public void test(String s) { System.out.println("B.test(String s)"); }
    }

    e poi es.:

    codice:
    A obj = ........
    Object arg = "hello";
    
    obj.test(arg);

    Il compilatore sceglie innanzitutto la signature da invocare. Il compilatore non guarda e non "sa" cosa c'è assegnato a obj. Io ho messo dei puntini .... potrei assegnare new A() o new B(), il compilatore non può sapere cosa succederà a runtime, e io potrei assegnare un oggetto A o B in base ad altre condizioni.
    Quindi il compilatore si basa solo sul tipo "statico" del reference (della variabile obj) che è A.

    Esiste un metodo "test" noto in A che riceve 1 argomento? Sì.
    Inoltre il tipo "statico" dell'argomento (variabile arg) è Object. Idem anche qui il compilatore non guarda cosa c'è assegnato a arg (non può saperlo a priori in generale). Il fatto che ho assegnato la stringa fissa "hello" non cambia le cose.

    Quindi esiste un metodo "test" in A che riceve un Object? Sì. Stop, per il compilatore finisce qui. La signature da usare è test(Object).

    Poi se a runtime viene istanziato e assegnato realmente un oggetto A a obj, allora sarà il suo test(Object) ad essere eseguito (quindi vedi "A.test(Object o)").
    Se invece a runtime viene istanziato e assegnato realmente un oggetto B a obj, allora sarà il suo (e non quello di A) test(Object) ad essere eseguito (quindi vedi "B.test(Object o)").
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.