Newsgroup: it.comp.java
Titolo: Aiuto: riuso di una classe

Ciao a tutti.
Premetto che sono un esordiente totale del linguaggio java.
Ho creato una classe "inserisci"(priva di main) che riempie,
richiedendo all'utente "n" valori, un array di interi.
Sto cercando di riusare una istanza della classe "inserisci"
all'interno del programma "ordina".
L'unica funzione che svolge per ora il programma "ordina" è quella di
creare una nuova istanza della classe "inserisci" e cercare di accedere
al suo attributo (public) array.
I file "inserisci.java" e "ordina.java" risiedono nello stesso package.
Di seguito riporto il loro codice:
import java.io.*;    // package necessario per effettuare i/o
public class inserisci
{
 public int array[]; // dichiarazione di un attributo array di interi
 public int[] inserisci() // metodo costruttore==>ha lo stesso nome
della classe
 {
  InputStreamReader in=new InputStreamReader(System.in); // istruzione
di "preparazione"
  BufferedReader tastiera=new BufferedReader(in);        // istruzione
di "preparazione" all'i/o
  System.out.println("Quanti elementi deve contenere l'array ?");
  try
  {
   int n=Integer.parseInt(tastiera.readLine()); // istruzione di i/o
   array=new int[n];                // allocazione...ora array punta a
una locazione di n interi
   for(int i=0; i<n ; i++)          // ciclo di riempimento dell'array
   {
    System.out.println("Inserisci l'elemento numero "+(i+1)+"
dell'array");
    array[i]=Integer.parseInt(tastiera.readLine());
   }
   System.out.println("Gli elementi contenuti nell'array sono:");
   for(int i=0; i<n ; i++)          // ciclo di verifica di riempimento
dell'array
   {
    System.out.println(array[i]);
   }
  }
  catch(Exception E)
  {
   System.out.println("E' stata catturata una eccezione...");
  }
  return(array);
 }
}
class ordina
{
 public static void main(String args[])
 {
  System.out.println("Sto creando una nuova istanza della classe
'inserisci'...");
  inserisci a=new inserisci();
  System.out.println("L'oggetto 'a' è stato creato !");
  System.out.println("L'attributo 'a.array' contiene --->"+a.array);
 }
}
La sintassi del codice è corretta ma ciò che stampa a video
l'istruzione
System.out.println("L'attributo 'a.array' contiene --->"+a.array); è :
L'attributo 'a.array' contiene --->null
Inoltre non mi viene neanche richiesto di riempire l'array con n
valori...dove sbaglio ?
Ringrazio anticipatamente tutte le persone che mi risponderanno
Ciao

>  public int[] inserisci() // metodo costruttore==>ha lo stesso nome
questo non e' il costruttore, ma un metodo qualsiasi, il costruttore
non restituisce nessun risultato,quindi sarebbe
public inserisci(){
....
}
se fosse corretto quello che hai scritto, questa istruzione
inserisci a=new inserisci();
ti dovrebbe dare un type mismatch perchè "a" e' di tipo "inserisci"
mentre il "costruttore" secondo te dovrebbe restituire un int[]
per fare quello che vuoi fare devi fare
inserisci a=new inserisci();
a.array = a.inserisci();
comunque un paio di consigli:
1. leggere la documentazione
2. I nomi delle classi e' fortemente consigliato che siano dei nomi che
iniziano con una lettera maiuscola, a differenza dei nomi dei metodi e
delle variabili/attributi di classe che iniziano con la lettera
minuscola.
3. Evita di mettere metodi che si chiamano come il costruttore, per
carita' il tuo codice funziona, ma converrai che in questo modo si fa
molta + confusione

Ho seguito alcuni tuoi consigli.
Non mi era chiaro il concetto che il costruttore non dovesse ritornare
nulla...ho ristrutturato le due classi come segue:
import java.io.*;    // package necessario per effettuare i/o
public class inserisci
{
 public int array[]; // dichiarazione di un attributo(variabile
d'istanza) array di interi
 private int n;
 private InputStreamReader in=new InputStreamReader(System.in); //
istruzione di "preparazione" all'i/o
 private BufferedReader tastiera=new BufferedReader(in);        //
istruzione di "preparazione" all'i/o
 public inserisci() // metodo costruttore==>ha lo stesso nome della
classe
 {
  System.out.println("Quanti elementi deve contenere l'array ?");
  try
  {
   n=Integer.parseInt(tastiera.readLine()); // istruzione di i/o
   array=new int[n];                // allocazione...ora array punta a
una locazione di n interi in memoria
  }
  catch(Exception E)
  {
   System.out.println("E' stata catturata una eccezione...");
  }
 }
 public void riempi()
 {
  try
  {
   for(int i=0; i<n ; i++)          // ciclo di riempimento dell'array
   {
    System.out.println("Inserisci l'elemento numero "+(i+1)+"
dell'array");
    array[i]=Integer.parseInt(tastiera.readLine());
   }
  }
  catch(Exception E)
  {
   System.out.println("E' stata catturata una eccezione...");
  }
 }
 public void visualizza()
 {
   System.out.println("Gli elementi contenuti nell'array sono:");
   for(int i=0; i<n ; i++)          // ciclo di verifica di riempimento
dell'array
   {
    System.out.println(array[i]);
   }
 }
}
class ordina
{
 public static void main(String args[])
 {
  System.out.println("Sto creando una nuova istanza della classe
'inserisci'...");
  inserisci a=new inserisci();
  System.out.println("L'oggetto 'a' è stato creato !");
  System.out.println("Sto richiamando il metodo riempi() dell'oggetto
'a'");
  a.riempi();
  System.out.println("L'attributo 'array' dell'oggetto 'a' è stato
riempito");
  System.out.println("Sto richiamando il metodo 'visualizza()'
dell'oggetto 'a'");
  a.visualizza();
  System.out.println("Il programma è terminato !");
 }
}
E tutto sembra funzionare correttamente.
Un ultima domanda...che fine fà l'oggetto 'a' alla fine di 'ordina'
viene deallocato ?
grazie per l'aiuto !
ciao

 
Alla deallocazione dell'istanza è deputato il Grabage Collector di java.
Quando questi si accorge che l'istanza a no nviene + referenziata da 
nessuna classe in esecuzione, libera l'area di memoria corrispondente ad a.

 istruzione di "preparazione" all'i/o
Non creare oggetti che potrebbero lanciare eccezioni tra le variabili di 
instanza. O li crei nel costruttore o nel metodo quando dovrai leggere 
davvero o in {}
P.S.: Tra l'altro questi stream non li chiudi mai... dovrai farlo prima 
o poi..

Scusa Pietro, uso da poco questo linguaggio, non capisco a quali
eccezioni tu ti riferisca ne tantomeno come fare per evitare che
vengano sollevate, per quanto riguarda poi gli stream non so come
chiuderli !
Potresti fare qualche esempio applicato al mio codice ? 
grazie