Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

di il
13 risposte

Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

Salve.
Sto studiando Java su un vecchio libro di testo delle scuole medie superiore. Sono arrivato al punto in cui il libro parla delle classi interne a un'altra classe.
Vorrei creare un array di oggetti della classe interna, che quindi ereditano attributi e metodi della classe esterna, per gestire un archivio scolastico.
L'utente inserisce il nome dell'Istituto, il cognome, nome, classe, viaPiazza, cap, città e nazione per ciascun alunno dell'istituto scolastico che vanno inseriti nei vari oggetti dell'array.
Scrivo di seguito parte del codice sorgente:

import java.io.*;

public class Studente {
	private String nomeIstitutoScolastico = new String();
	private String cognome = new String();
	private String nome = new String();
	private String classe = new String();
	
	public void nomeIstitutoScolastico(String valoreNomeIstitutoScolastico) {this.nomeIstitutoScolastico = valoreNomeIstitutoScolastico;}
	public void cognome(String valoreCognome) {this.cognome = valoreCognome;}
	public void nome(String valoreNome) {this.nome = valoreNome;}
	public void classe(String valoreClasse) {this.classe = valoreClasse;}
	public String nomeIstitutoScolastico() {return this.nomeIstitutoScolastico;}
	public String cognome() {return this.cognome;}
	public String nome() {return this.nome;}
	public String classe() {return this.classe;}
	
	public class Indirizzo {
		private String viaPiazza = new String();
		private String cap = new String();
		private String città = new String();
		private String nazione = new String();
		
		public void viaPiazza(String valoreViaPiazza) {this.viaPiazza = valoreViaPiazza;}
		public void cap(String valoreCap) {this.cap = valoreCap;}
		public void città(String valoreCittà) {this.città = valoreCittà;}
		public void nazione(String valoreNazione) {this.nazione = valoreNazione;}
		public String viaPiazza() {return this.viaPiazza;}
		public String cap() {return this.cap;}
		public String città() {return this.città;}
		public String nazione() {return this.nazione;}
	}
	
	public static void main(String args[]) throws IOException {
		...
	 	// DEVO ORA CREARE UN ARRAY DI OGGETTI DELLA CLASSE INTERNA "Indirizzo".
		...
	}
trovate il listato completo del programma da terminare al seguente indirizzo:


So creare un array di oggetti di una classe (nel mio caso la classe "Studente"), ma non un array di oggetti di una classe interna (nel mio caso "Indirizzo").
Per favore, mi date una mano? Mi dite come devo scrivere il codice?
Il libro non spiega nulla a riguardo.
Grazie.

13 Risposte

  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    Ho trovato questo esempio cercando sul Web:
    
    {   // Inizio del blocco di elaborazione per la ridefinizione dell'array archivioAlunniIstitutoScolastico assegnandogli una nuova dimensione (pari al numero degli alunni) e creazione degli oggetti della classe "Studente".
    	Studente.Indirizzo archivioAlunniIstitutoScolastico[] = new Studente.Indirizzo[numeroAlunniIstitutoScolastico];
    	for (int i = 0; i<numeroAlunniIstitutoScolastico; i++)
    		archivioAlunniIstitutoScolastico[i] = new Studente.Indirizzo();
    					}
    
    Però gli oggetti della classe interna sembrano non ereditare gli attributi della classe esterna.
    Come mai?
    Non riesco a richiamare metodi della classe esterna.
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    GGAbramoF55 ha scritto:


    So creare un array di oggetti di una classe (nel mio caso la classe "Studente"), ma non un array di oggetti di una classe interna (nel mio caso "Indirizzo").
    Per favore, mi date una mano? Mi dite come devo scrivere il codice?
    Tralasciando per un momento il fatto che non hai seguito le convenzioni standard per i metodi "accessori" (setter/getter), dovresti comprendere meglio le classi dette genericamente "innestate".

    Le classi "innestate" si dividono in due tipi:
    - le "nested" (static) class
    - le "inner" (non static!) class che sono di 3 tipi: le "regular" (insomma, regolari, come la tua Indirizzo), le "anonymous" e le "method local" (o semplicemente "local").

    Le nested class sono classi interne marcate static. Non hanno alcuna peculiarità davvero particolare, se non per il fatto che la classe "contenitore" fa sostanzialmente solo da namespace in più per la nested class.
    Le inner class (non static) invece sono più particolari, perché esiste una relazione molto specifica tra la istanza della inner class e la istanza della classe che la contiene.

    Arriviamo al dunque: per ottenere nel tuo caso un oggetto Indirizzo, DEVI prima creare un oggetto Studente e su questo istanziare il Indirizzo.
    Questo è il punto essenziale per quella relazione particolare detta poco fa. In virtù di questa relazione, dall'interno della classe inner è possibile accedere ai dati della classe contenitore, semplicemente perché la inner class mantiene il riferimento ad una istanza specifica della classe contenitore.

    La tua classe Indirizzo non "eredita" un bel nulla da Studente. Non nel senso della ereditarietà tradizionale. Semplicemente 1 oggetto Indirizzo deve essere legato ad 1 oggetto Studente. E dall'interno di Indirizzo è lecito accedere a metodi e campi "di istanza" di quell'oggetto Studente associato.

    Questo di seguito l'ho scritto al volo ma farà sicuramente (spero) capire:
    public class Prova {
        public static void main(String[] args) {
            Persona mario = new Persona();
            mario.setNome("Mario");
    
            Persona.Hobby hobby1 = mario.new Hobby();
            hobby1.setDescrizione("suonare il pianoforte");
    
            System.out.println(hobby1);
        }
    }
    
    class Persona {
        private String nome;
    
        public String getNome() {
            return nome;
        }
    
        public void setNome(String nome) {
            this.nome = nome;
        }
    
        class Hobby {
            private String descrizione;
    
            public String getDescrizione() {
                return descrizione;
            }
    
            public void setDescrizione(String descrizione) {
                this.descrizione = descrizione;
            }
    
            public String toString() {
                return getDescrizione() + " è l'hobby di " + getNome();
            }
        }
    }
    Ho creato un oggetto Persona di nome Mario e l'ho assegnato ad una variabile appunto mario.

    Vedi sotto la forma mario.new Hobby() ?
    Questa è una invocazione di new molto particolare, in pratica si invoca il new della inner class su una istanza specifica della classe contenitore.

    Il System.out.println(hobby1) fa invocare il toString() di Hobby e la stampa è

    suonare il pianoforte è l'hobby di Mario

    Nota che nel toString() ho invocato getNome(). In virtù della relazione molto speciale detta prima, da un metodo di istanza di Hobby è lecito usare campi/metodi di istanza di Persona, perché i due oggetti sono collegati (l'oggetto Hobby mantiene un riferimento nascosto all'oggetto Persona).

    Ma nota che se si tentasse di fare:

    System.out.println(hobby1.getNome()); // ERRORE!!

    Sarebbe un errore. La classe Hobby non "eredita" un bel nulla da Persona e quindi su un reference di tipo Hobby NON puoi invocare metodi di Persona.

    Tutto questo ti risulta più chiaro ora?


    EDIT:

    GGAbramoF55 ha scritto:


    Ho trovato questo esempio cercando sul Web:
    
    		archivioAlunniIstitutoScolastico[i] = new Studente.Indirizzo();
    
    Riguardo questo, la forma new ClasseContenitore.ClasseInterna() si riferisce alle "nested" (static) class. NON alle "inner" class.
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    Nel tuo esempio definisci tre classi singole.
    Non una classe con all'interno altre classi.
    Il metodo getNome() che utilizzi nella classe Hobby, appartiene alla classe Persona, e quindi si trova in una regione di visibilità diversa.
    Ho provato ha compilare il tuo codice, ma mi da errore di compilazione.
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    GGAbramoF55 ha scritto:


    Nel tuo esempio definisci tre classi singole.
    No, guarda bene.
    A parte "Prova" (giusto con il main() per una prova) c'è una classe Persona e DENTRO una INNER class Hobby.

    GGAbramoF55 ha scritto:


    Il metodo getNome() che utilizzi nella classe Hobby, appartiene alla classe Persona, e quindi si trova in una regione di visibilità diversa.
    E cosa vorresti dire?
    L'ho detto prima. in virtù della RELAZIONE molto speciale tra Hobby (la inner class) e Persona (la classe "contenitore"), dentro toString() di Hobby È lecito invocare getNome() che è di Persona. Perché un oggetto Hobby mantiene internamente nascosto un riferimento all'oggetto Persona a cui è stato associato durante la costruzione.

    GGAbramoF55 ha scritto:


    Ho provato ha compilare il tuo codice, ma mi da errore di compilazione.
    Tutto il blocco di codice, preso ESATTAMENTE così come l'ho postato io e messo in un Prova.java compila perfettamente senza errori con un qualunque JDK. Punto.
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    Si hai ragione.
    Lo messo su Eclipse è funziona.
    Sto cercando ora di capire il codice sulla base delle tue spiegazioni.


    ...


    Ma una scrittura di questo tipo vedo che me la compila ugualmente. Creo un oggetto della classe interna.
    
    import java.io.*;
    
    public class Studente {
    	private String nomeIstitutoScolastico = new String();
    	private String cognome = new String();
    	private String nome = new String();
    	private String classe = new String();
    	
    	public void nomeIstitutoScolastico(String valoreNomeIstitutoScolastico) {this.nomeIstitutoScolastico = valoreNomeIstitutoScolastico;}
    	public void cognome(String valoreCognome) {this.cognome = valoreCognome;}
    	public void nome(String valoreNome) {this.nome = valoreNome;}
    	public void classe(String valoreClasse) {this.classe = valoreClasse;}
    	public String nomeIstitutoScolastico() {return this.nomeIstitutoScolastico;}
    	public String cognome() {return this.cognome;}
    	public String nome() {return this.nome;}
    	public String classe() {return this.classe;}
    	
    	public static class Indirizzo {
    		private String viaPiazza = new String();
    		private String cap = new String();
    		private String città = new String();
    		private String nazione = new String();
    		
    		public void viaPiazza(String valoreViaPiazza) {this.viaPiazza = valoreViaPiazza;}
    		public void cap(String valoreCap) {this.cap = valoreCap;}
    		public void città(String valoreCittà) {this.città = valoreCittà;}
    		public void nazione(String valoreNazione) {this.nazione = valoreNazione;}
    		public String viaPiazza() {return this.viaPiazza;}
    		public String cap() {return this.cap;}
    		public String città() {return this.città;}
    		public String nazione() {return this.nazione;}
    	}
    	
    	public static void main(String args[]) throws IOException {
    		String stringaInput = new String();
    		InputStreamReader lettoreFlussoIngresso = new InputStreamReader(System.in);
    		BufferedReader tastiera = new BufferedReader(lettoreFlussoIngresso);
    		String nomeIstitutoScolastico = new String();
    		Studente.Indirizzo archivioAlunniIstitutoScolastico[] = new Studente.Indirizzo[100];
    		for (int i = 0; i<100; i++)
    			archivioAlunniIstitutoScolastico[i] = new Studente.Indirizzo();
    	}
    }
    
    Questo codice non mi da errore di compilazione.
    Però quanto tendo di accedere ai metodi della classe esterna, in ECLIPSE non appaiono.
    Io scrivo:
    
    archivioAlunniIstitutoScolastico[i].
    
    e mi appaiono solo i metodi della classe "Indirizzo" e non quelli ereditati dalla classe "Studente". Come faccio ad accedere ai metodi della classe "Studente"?. Questo codice non funziona? Non è corretto istanziare così?
    
    Studente.Indirizzo oggettoClasseInterna = new Studente.Indirizzo();
    
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    Ho modificato il tuo codice. Ed effettivamente funziona.
    
    public class Prova {
    	public static void main(String[] args) {
    		Persona Abramo = new Persona();
    		Persona.Hobby passione = Abramo.new Hobby();
    		Abramo.nome("Abramo Gerardo Giordano");
    		passione.hobby("Mangiare i gelati");
    		System.out.print("\n\n\n\n\n\t" + passione.leggiHobby() + ".\n\n\n\n\n");
    	}
    }
    
    class Persona {
    	private String nome = new String("Abramo Gerardo Giordano");
    	public void nome(String nome) {this.nome = nome;}
    	public String nome() {return this.nome;}
    
    	class Hobby {
    		private String hobby = new String("Cavalcare i cavalli");
    		public void hobby(String hobby) {this.hobby = hobby;}
    		public String hobby() {return this.hobby;}
    		public String leggiHobby() {return hobby() + " è l'hobby di " + nome();}
    	}
    }
    Ma io mi riferivo ad UNA sola classe interna (ANNIDATA) nella classe che contiene il metodo main().
    E poi tu, nella classe "Hobby", richiami un metodo della classe "Persona". Tanto vale riscrivere (nel mio caso) tutti i metodi di accesso agli attributi di istanza della classe esterna, anche nella classe interna. Ma è questa l'ereditarietà?
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    Guarda, la metto giù ancora più semplice con questo codice:
    
    public class Esterna {
    	private String nome = new String("Abramo");           // Variabile di istanza della classe esterna. 
    	public void nome(String nome) {this.nome = nome;}     // Metodo per la scrittura della variabile di istanza della classe esterna.
    	public String nome() {return this.nome;}              // Metodo per la lettura della variabile di istanza della classe esterna.
    	
    	public class Interna {
    		private String cognome = new String("Giordano");                  // Variabile di istanza della classe interna.
    		public void cognome(String cognome) {this.cognome = cognome;}     // Metodo per la scrittura della variabile di istanza della classe interna.
    		public String cognome() {return this.cognome;}                    // Metodo per la lettura della variabile di istanza della classe interna.
    	}
    	
    	public static void main(String args[]) {
    		// Vorrei ora crere un oggetto della classe "Interna", in questo metodo main(), che acceda al metodo della classe "Esterna" nome().
    		
    		
    		
    	}
    }
    
    Qualcuno mi può aiutare?
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    GGAbramoF55 ha scritto:


    Ma una scrittura di questo tipo vedo che me la compila ugualmente. Creo un oggetto della classe interna.
    
    	public static class Indirizzo {
    
    Questo codice non mi da errore di compilazione.
    Però quanto tendo di accedere ai metodi della classe esterna, in ECLIPSE non appaiono.
    Nota bene, hai scritto:

    public static class Indirizzo

    Questo rende Indirizzo una "nested" (io aggiungo sempre static per chiarire) class. Non una inner class.
    Una nested class non ha alcuna relazione particolare con la classe contenitore. La nested class è una classe funzionalmente come qualunque altra classe "normale", si istanzia, si usa, ecc... come qualunque altra classe. L'unica cosa è che la classe contenitore "qualifica" meglio il nome completo. Invece di essere es. com.pincopalla.Nested è com.pincopalla.Contenitore.Nested . Tutto qui.

    GGAbramoF55 ha scritto:


    e mi appaiono solo i metodi della classe "Indirizzo" e non quelli ereditati dalla classe "Studente".
    L'ho già detto prima ma lo ripeto (meglio).
    Una inner o nested class NON "eredita" alcunché dalla classe contenitore! Non è così che funzionano.

    GGAbramoF55 ha scritto:


    Come faccio ad accedere ai metodi della classe "Studente"?
    Se Indirizzo è una "nested" (static!) class in Studente, allora dall'interno di Indirizzo si può accedere ai membri di istanza di Studente SOLO avendo (ottenendo/ricevendo) un reference ad un oggetto Studente. Ad esempio passando ad un costruttore di Indirizzo un reference a Studente e tenendolo referenziato. Ma è concettualmente proprio quello che fa una inner class.

    Ma scusa, hai compreso l'esempio Persona/Hobby?

    GGAbramoF55 ha scritto:


    Questo codice non funziona? Non è corretto istanziare così?
    
    Studente.Indirizzo oggettoClasseInterna = new Studente.Indirizzo();
    
    Certo, così è tecnicamente corretto (con Indirizzo "nested"). Ma non è quello il punto. Tu sulla variabile oggettoClasseInterna vorresti invocare direttamente i metodi di Studente. NON puoi. Nè se Indirizzo è inner né se è nested.
    Lo ripeto: una inner/nested class non "eredita" NULLA dalla classe contenitore.
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    Ciao andbin.
    Grazie per il tuo aiuto, ma senza codice io non capisco.
    Mi termini per favore il metodo main() del codice sotto riportato:
    
    public class Esterna {
    	private String nome = new String("Abramo");           // Variabile di istanza della classe esterna. 
    	public void nome(String nome) {this.nome = nome;}     // Metodo per la scrittura della variabile di istanza della classe esterna.
    	public String nome() {return this.nome;}              // Metodo per la lettura della variabile di istanza della classe esterna.
    	
    	public class Interna {
    		private String cognome = new String("Giordano");                  // Variabile di istanza della classe interna.
    		public void cognome(String cognome) {this.cognome = cognome;}     // Metodo per la scrittura della variabile di istanza della classe interna.
    		public String cognome() {return this.cognome;}                    // Metodo per la lettura della variabile di istanza della classe interna.
    	}
    	
    	public static void main(String args[]) {
    		// Vorrei ora creare un oggetto della classe "Interna", in questo metodo main(), che acceda al metodo della classe "Esterna" nome().
    		
    		
    		
    	}
    }
    
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    GGAbramoF55 ha scritto:


    Ma io mi riferivo ad UNA sola classe interna (ANNIDATA) nella classe che contiene il metodo main().
    Ma NON c'entra dove sta il main().
    Una sola classe annidata (inner) è appunto l'esempio che ho fatto io.

    GGAbramoF55 ha scritto:


    E poi tu, nella classe "Hobby", richiami un metodo della classe "Persona".
    Sì e te lo ripeto: è in virtù di quella relazione "speciale" tra le due classi.

    GGAbramoF55 ha scritto:


    Tanto vale riscrivere (nel mio caso) tutti i metodi di accesso agli attributi di istanza della classe esterna, anche nella classe interna.
    Pessima idea.

    GGAbramoF55 ha scritto:


    Ma è questa l'ereditarietà?
    Assolutamente no.

    GGAbramoF55 ha scritto:


    Grazie per il tuo aiuto, ma senza codice io non capisco.
    Ascolta, mi spieghi perché ti stai incaponendo con le classi innestate ("inner" o "nested" che siano) senza peraltro averle comprese (presumo) davvero bene??

    La ereditarietà qui non c'entra nulla. La ereditarietà si usa per definire una relazione di generalizzazione/specializzazione tra due classi. Dove la sotto-classe è una specializzazione, un "caso particolare" rispetto alla super-classe.
    Un gatto è-un animale (quindi ok: public class Gatto extends Animale), un cubo è-un solido (quindi ok: public class Cubo extends Solido).

    Un indirizzo NON è uno studente e né viceversa. La ereditarietà qui NON serve.

    Ora: tralasciamo un attimo le classi innestate, detto in generale. Se Studente e Indirizzo fossero classi normali ("top-level" si dicono), ci sarebbero 2 design possibili:

    Caso A)
    public class Studente {
        private String nome;
        //.....ecc...
        private Indirizzo indirizzo;   // uno Studente ha il riferimento ad un oggetto Indirizzo
        //...
    }
    
    public class Indirizzo {
        private String viaPiazza;
        //.....ecc...
    }

    Caso B)
    public class Studente {
        private String nome;
        //.....ecc...
    }
    
    public class Indirizzo {
        private String viaPiazza;
        //.....ecc...
        private Studente studente;   // un Indirizzo ha il riferimento ad un oggetto Studente
        //...
    }
    Nessuno di questi due è "sbagliato". Diciamo che il caso A) è un po' più sensato/utile. Tu potresti avere nella applicazione un'altra classe es. Azienda che ha anch'essa un campo di tipo Indirizzo. In questo senso Indirizzo non "sa" nulla di nessuno ... modella solo un indirizzo e basta.
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    Ciao andbin.
    Scusa hai ragione.
    Sono andato a rileggere la parte teorica del libro e effettivamente hai ragione tu.
    Non c'è scritto che la classe interna eredita attributi e metodi di quella esterna, ma che semplicemente la classe interna ha accesso ad attributi di istanza e metodi (anche privati) di quella in cui è contenuta.
    Scusami. Io cerco di studiare Java su un libro delle superiore e non ho ricordato bene la parte teorica.
    Per ogni esempio nella parte teorica cerco di scrivere un programma per comprendere meglio la teoria, partendo dall'esempio di codice del libro.
    Come puoi vedere anche dal mio sito: www.lascuolacomehobby.i
    Spero così di aumentare le mie competenze, perché mi rimane sempre il sogno, un giorno, di poter lavorare come programmatore. Sogno che non si è realizzato per varie vicissitudini familiari nel mio passato.
    L'ultimo esempio che tu mi mostri, l'ho già realizzato, creando un oggetto di una classe esterna in un'altra classe. Sul mio sito e la PT5_6.
    Grazie comunque. Adesso ho capito. Non centra nulla l'ereditarietà...
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    Ho modificato il codice nel seguente modo:
    
    import java.io.*;
    
    public class Studente {
    	private String nomeIstitutoScolastico = new String();
    	private String cognome = new String();
    	private String nome = new String();
    	private String classe = new String();
    	
    	public void scriviNomeIstitutoScolastico(String valoreNomeIstitutoScolastico) {this.nomeIstitutoScolastico = valoreNomeIstitutoScolastico;}
    	public void scriviCognome(String valoreCognome) {this.cognome = valoreCognome;}
    	public void scriviNome(String valoreNome) {this.nome = valoreNome;}
    	public void scriviClasse(String valoreClasse) {this.classe = valoreClasse;}
    	public String leggiNomeIstitutoScolastico() {return this.nomeIstitutoScolastico;}
    	public String leggiCognome() {return this.cognome;}
    	public String leggiNome() {return this.nome;}
    	public String leggiClasse() {return this.classe;}
    	
    	public class Indirizzo {
    		private String viaPiazza = new String();
    		private String cap = new String();
    		private String città = new String();
    		private String nazione = new String();
    		
    		public void nomeIstitutoScolastico(String nomeIstitutoScolastico) {scriviNomeIstitutoScolastico(nomeIstitutoScolastico);}     // Accedo al metodo "scriviNomeIstitutoScolastico()" della classe esterna.
    		public void cognome(String cognome) {scriviCognome(cognome);}                                                                 // Accedo al metodo "scriviCognome()" della classe esterna.
    		public void nome(String nome) {scriviNome(nome);}                                                                             // Accedo al metodo "scriviNome()" della classe esterna.
    		public void classe(String classe) {scriviClasse(classe);}                                                                     // Accedo al metodo "scriviClasse()" della classe esterna.
    		public void viaPiazza(String viaPiazza) {this.viaPiazza = viaPiazza;}
    		public void cap(String valoreCap) {this.cap = valoreCap;}
    		public void città(String valoreCittà) {this.città = valoreCittà;}
    		public void nazione(String valoreNazione) {this.nazione = valoreNazione;}
    		public String nomeIstitutoScolastico() {return leggiNomeIstitutoScolastico();}                                                // Accedo al metodo "leggiNomeIstitutoScolastico()" della classe esterna.
    		public String cognome() {return leggiCognome();}                                                                              // Accedo al metodo "leggiCognome()" della classe esterna.
    		public String nome() {return leggiNome();}                                                                                    // Accedo al metodo "leggiNome()" della classe esterna.
    		public String classe() {return leggiClasse();}                                                                                // Accedo al metodo "leggiClasse()" della classe esterna.
    		public String viaPiazza() {return this.viaPiazza;}
    		public String cap() {return this.cap;}
    		public String città() {return this.città;}
    		public String nazione() {return this.nazione;}
    	}
    	
    	public static void main(String args[]) throws IOException {
    		String stringaInput = new String();
    		InputStreamReader lettoreFlussoIngresso = new InputStreamReader(System.in);
    		BufferedReader tastiera = new BufferedReader(lettoreFlussoIngresso);
    		String nomeIstitutoScolastico = new String();
    		Studente oggettoClasseEsterna = new Studente();
    //		Studente.Indirizzo oggettoClasseInterna = oggettoClasseEsterna.new Indirizzo();
    		Studente.Indirizzo archivioAlunniIstitutoScolastico[] = new Studente.Indirizzo[0];
    		...
    		...
    		{   // Inizio del blocco di elaborazione per la ridefinizione dell'array "archivioAlunniIstitutoScolastico" assegnandogli una nuova dimensione (pari al numero degli alunni) e creazione degli oggetti della classe interna "Indirizzo".
    			archivioAlunniIstitutoScolastico = new Studente.Indirizzo[numeroAlunniIstitutoScolastico];     // Ridefinizione della dimensione dell'array.
    			for (int i = 0; i<numeroAlunniIstitutoScolastico; i++)
    				archivioAlunniIstitutoScolastico[i] = oggettoClasseEsterna.new Indirizzo();                // Creazione degli oggetti della classe interna "Indirizzo" nell'array "archivioAlunniIstitutoScolastico".
    		}
    		...
    		...
    	}
    }
    
    
  • Re: Creare un array con oggetti di una classe interna, che ereditano attributi e metodi della classe esterna.

    GGAbramoF55 ha scritto:


    semplicemente la classe interna ha accesso ad attributi di istanza e metodi (anche privati) di quella in cui è contenuta.
    Esatto! Questa è quella relazione molto "speciale" che dicevo.

    GGAbramoF55 ha scritto:


    
    public class Studente {
    	private String nomeIstitutoScolastico = new String();
    	private String cognome = new String();
    	private String nome = new String();
    	private String classe = new String();
    
      [...]	
    	
    	public class Indirizzo {
    		private String viaPiazza = new String();
    		private String cap = new String();
    		private String città = new String();
    		private String nazione = new String();
    		
    		public void nomeIstitutoScolastico(String nomeIstitutoScolastico) {scriviNomeIstitutoScolastico(nomeIstitutoScolastico);}     // Accedo al metodo "scriviNomeIstitutoScolastico()" della classe esterna.
    		public void cognome(String cognome) {scriviCognome(cognome);}                                                                 // Accedo al metodo "scriviCognome()" della classe esterna.
    		public void nome(String nome) {scriviNome(nome);}                                                                             // Accedo al metodo "scriviNome()" della classe esterna.
    
      [...]
    
    Non vorrei sembrare ripetitivo ma ... l'ho già detto prima: è una pessima idea "ripetere" nella inner-class i metodi per l'accesso ai dati nella enclosing-class (la classe "contenitore"). Non è così che si usano le inner-class.
Devi accedere o registrarti per scrivere nel forum
13 risposte