Domanda in vista di un esame!

di il
5 risposte

Domanda in vista di un esame!

Salve a tutti ragazzi, ho una domanda da farvi in vista di un esame!
Sto facendo degli esercizi sulla definizione di classi e mi trovo di fronte al seguente problema:
inizialmente avevo scritto questo codice:
public class Prove {

    /**
     * @param args the command line arguments
     */
    
    public static void main(String[] args) {
	      Coppia a, b, c;
	      a = new Coppia(1,2);                // a è la coppia (1,2)
	      b = new Coppia(3,4);                // b è la coppia (3,4)
	      System.out.println(a.primo());      // visualizza 1.0
	      System.out.println(b.secondo());    // visualizza 4.0
	      System.out.println(b.toString());   // visualizza (3.0,4.0)
	      c = b.inverti();                    // c è la coppia (4,3)
	      System.out.println(c.toString());   // visualizza (4.0,3.0)
	      System.out.println(b.toString());   // visualizza ancora (3.0,4.0)
    } 
    
  public class Coppia {
	/* primo elemento della coppia */ 
	private double primo;
	/* secondo elemento della coppia */ 
	private double secondo;
	
	/* Crea una nuova coppia, dati i suoi due elementi. */ 
	public Coppia(double primo, double secondo) {
		this.primo = primo;
		this.secondo = secondo;
	}
	
	/* Restituisce il primo elemento di questa coppia. */ 
	public double primo() {
		return this.primo;
	}
	/* Restituisce il secondo elemento di questa coppia. */ 
	public double secondo() {
		return this.secondo;
	}

	/* Restituisce una descrizione testuale di questa coppia. */ 
	public String toString() {
		return "("+this.primo+", "+this.secondo+")";
	}

	/* Verifica se questa coppia è uguale alla coppia c. */ 
	public boolean equals(Coppia c) {
		return (this.primo == c.primo() && this.secondo == c.secondo());
	}
	
	/* Crea una nuova coppia, che è l'inversa di questa coppia. */ 
	public Coppia inverti() {
		return new Coppia(this.secondo, this.primo);
	}
			
	}
      }
E mi segna come errore " a = new Coppia(1,2); " e " b = new Coppia(3,4); ", avvertendomi che: the "non-static variable this cannot be referenced from a static context".

Quindi, per logica, ho corretto " public class Coppia {....} " con " static class Coppia {....} ", ed effettivamente ora funziona.
Il fatto è che la soluzione dell'esercizio proposta dal prof riporta anch'essa la dicitura " public class Coppia {....} ", e in generale su questo tipo di esercizi " public class NomeClassePerIstanziareOggetti {....} ". Sinceramente mi pare strano che abbia ragione io piuttosto che un docente, ma ho provato a copiare tutte le sue soluzioni, e tutti riportano lo stesso errore di impossibilità di usare la variabile non-statica this in un contesto static.

So che all'esame ci sarà almeno un esercizio di questo tipo, quindi vi chiedo:
E' giusta la correzione?
Se è giusta, dovrei riportare " static class Coppia {....} ", o " public class Coppia {....} " come scrive lui nelle sue soluzioni?

Grazie mille in anticipo

5 Risposte

  • Re: Domanda in vista di un esame!

    Forse il punto è che la classe Coppia è definita all'interno della classe Prove
  • Re: Domanda in vista di un esame!

    End of the road ha scritto:


    public class Prove {
    
        public class Coppia {
            [ .....]
        }
    }
    Per come l'avevi definita così, Coppia è una "inner" class dentro Prove. Il concetto basilare delle inner class è che una istanza di una inner class deve essere associata ad una istanza della classe "contenitore" (Prove). Cioè Coppia andrebbe istanziata con:

    istanzaDiProve.new Coppia( .... );

    istanzaDiProve potrebbe anche essere il 'this' implicito se fossi in un metodo di istanza di Prove.
    Nel tuo caso nulla di questo era così.

    Se hai messo:

    public static class Coppia {

    allora Coppia diventa una "nested" class dentro Prove. Va meglio, nel senso che non c'è più quella relazione "particolare" tra classe contenitore e classe contenuta. E quindi puoi fare direttamente new Coppia ( ... );

    Nessuna di queste due cose presumo era quello che volevi/speravi. Quindi le possibilità sono due:

    a) Definisci Coppia nello stesso sorgente dove hai Prove ma fuori dal { } di Prove e soprattutto Coppia non può essere public perché Prove è già public.

    altrimenti

    b) Definisci Coppia in un sorgente distinto.
  • Re: Domanda in vista di un esame!

    Grazie mille delle risposte!

    Ora funziona tutto perfettamente! Ho messo:
     public class Prove {
           
        public static void main(String[] args) {
    	     ..............
        } 
        
    } 
     class Coppia {
    ...........
    }
     
    Ed ho anche capito qual'era il problema grazie alla risposta di andbin (quindi grazie )

    L'unico problema, ora, è capire perchè il prof nella soluzione mi mette " public class Coppia {...} ".
    Calcolando che l'esame è su foglio (come credo tutti gli esami di programmazione), se mi dovesse chiedere, ad esempio: "Si vuole definire una classe Coppia per istanziare oggetti "; gli scrivo "class Coppia {}" o "public class Coppia{}"?
    (Già sono ansioso di mio, poi sta cosa mi ha mandato pure nel pallone )
  • Re: Domanda in vista di un esame!

    End of the road ha scritto:


    L'unico problema, ora, è capire perchè il prof nella soluzione mi mette " public class Coppia {...} ".
    All'interno di un singolo sorgente .java puoi avere più tipi (classi, interfacce, ecc...) definiti ma solo uno può essere marcato public.
    Se vuoi tutte le classi public, definiscile ognuna in un sorgente separato.
  • Re: Domanda in vista di un esame!

    andbin ha scritto:


    End of the road ha scritto:


    L'unico problema, ora, è capire perchè il prof nella soluzione mi mette " public class Coppia {...} ".
    All'interno di un singolo sorgente .java puoi avere più tipi (classi, interfacce, ecc...) definiti ma solo uno può essere marcato public.
    Se vuoi tutte le classi public, definiscile ognuna in un sorgente separato.
    Credo di aver capito! Grazie per l'aiuto e per la pazienza
Devi accedere o registrarti per scrivere nel forum
5 risposte