Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    68

    Overriding di una classe

    Sto studiando Java e sto vedendo le inner class, così mi sono imbattuto su questo codice:
    codice:
    class A {
    	public void t() { System.out.println("A.t()"); }
    	public void g() { System.out.println("A.g()"); }
    }
    
    class B {
    	public static A f() {
    		return new A() {
    			public void g() { System.out.println("Override A.g()"); }
    		};
    	}
    }	
    
    public class Test {
    	public static void main(String[] args) {
    		A a = B.f();
    		a.g();
    		a.t();
    	}
    }
    
    //Output
    Override A.g()
    A.t()
    Ciò che non capisco con certezza è se la classe anonima A definita all'interno della funzione f() rappresenta un estensione della classe A definita inizialmente oppure la sotituisce?
    Dall'output sono propenso a pensare che ne sia una estensione, un po come se fosse definita con la keyword "extends".

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    che intendi per classe anonima? sicuramente non raprresenta estensione, sostituisce solo il metodo g


    il metodo f di B ritorna una nuova istanza di A con metodo g in @Override.
    Quindi questa nuova istanza di A chiamando g stampa "Override A.g()".
    Poi viene richiamato t (non in @Override )che stampa A.t().

    Se avessimo voluto stamapre "A.g()" del metodo g avremmo duvouto creare l'istanza di A così(intendo nel main):
    A a = new A();
    a.g();
    a.t();
    //Output
    "A.g()"
    "A.t()"
    in questo modo non c'è @Override.
    spero di essere stato chiaro
    nh

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    68
    Originariamente inviato da newhook
    che intendi per classe anonima? sicuramente non raprresenta estensione, sostituisce solo il metodo g
    Per classe anonima intendo una "anonymous inner class". Comunque se come dici tu sostituisce solo il metodo g allora significa che o effettua l'overriding della classe A precedente oppure definisce una nuova classe A però interna a B. Tuttavia dopo che nessuno mi rispondeva ho deciso di scrivere questo articolo sul mio blog dove affermo che la classe interna A è un estensione della classe A precedentemente definita.

    Originariamente inviato da newhook
    il metodo f di B ritorna una nuova istanza di A con metodo g in @Override.
    Se guardi il mio articolo e nella fattispecie il secondo "main" verrebbe da pensare che il metodo f di B ritorna non una nuova istanza di A bensì una classe interna di B derivata da A.

    Originariamente inviato da newhook
    Se avessimo voluto stamapre "A.g()" del metodo g avremmo duvouto creare l'istanza di A così(intendo nel main):
    A a = new A();
    a.g();
    a.t();
    //Output
    "A.g()"
    "A.t()"
    in questo modo non c'è @Override.
    spero di essere stato chiaro
    nh
    Onestamente non volevo sapere come stampare "A.g()" in quanto mi è sempre stato chiaro, piuttosto il mio dubbio (che attualmente mi porto dietro) è ed era relativo al fatto di capire se la classe anonima A sia un overriding o una classe derivata di A.

    Intanto ti ringrazio della risposta, l'unica dopo molto tempo.

    P.S. Nel mio articolo naturalmente non do una risposta bensì avanzo semplicemente un ipotesi quindi quanto affermo è giustamente opinabile e criticabile.

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

    Re: Overriding di una classe

    Originariamente inviato da M@P
    Ciò che non capisco con certezza è se la classe anonima A definita all'interno della funzione f() rappresenta un estensione della classe A definita inizialmente oppure la sotituisce?
    Innanzitutto ogni classi ha ovviamente un nome, il fatto che quella sia "anonima" vuol solo dire che è il programmatore che non "sa" quale nome abbia (il nome lo sceglie il compilatore!).

    Le anonymous inner-class possono fare 2 cose: estendere 1 classe oppure estendere (implicitamente) Object e implementare 1 interfaccia. E nota bene: o l'una o l'altra cosa!! Non è possibile con una anonymous class estendere X e implementare Y.

    Quindi:

    a) new UnaClasse() { .... }

    b) new UnaInterfaccia() { .... }

    Nel primo caso si definisce una classe (nome "anonimo") che estende UnaClasse.
    Nel secondo caso si definisce una classe (nome "anonimo") che estende implicitamente Object e implementa UnaInterfaccia.

    Il secondo caso è l'unico caso in Java in cui si può mettere un nome di interfaccia dopo un "new". E lo dico in altro modo: non vuol dire che sto istanziando una interfaccia!
    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
    Registrato dal
    Mar 2010
    Messaggi
    68
    Grazie andbin adesso mi è tutto più chiaro, ancora una volta hai risolto i miei dubbi.

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.