Domanda Aiuto esercizio Java non capisco dove sbaglio

Rebel811

Utente Iron
25 Giugno 2022
4
2
3
6
Ultima modifica da un moderatore:
Ciao a tutti,

Mi è stato assegnato un esercizio per vedere le differenze tra i vari modificatori di accesso, il problema che non riesco nemmeno a istanziare le variabili nel main e non capisco dove sbaglio, spero possiate aiutarmi a capire.

Ho questo esericizio:

Utilizzando la classe Vettore vista a lezione:
Java:
public class Vettore {
private double x;
private double y;
private double z;
public Vettore(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
}
Scrivere un metodo main() che crei una istanza della classe e tenti di accedere agli attributi
x, y e z e verificare gli errori ottenuti dal compilatore.
Ripetere lo stesso esercizio cambiando il modificatore di accesso degli attributi e definendoli
con:
• visibilità public
• visibilità protected
• visibilità package
e verificando, per ciascun livello di visibilità gli eventuali errori restituiti dal compilatore.

io ho provato scrivere questo main per istanziare la classe ma in tutti i casi mi dà questo errore "non-static variable this cannot be referenced from a static context"
questo è il main che ho scritto ho provato vari metodi per iniziallizare le variabili ma in tutti i modi che ho provato ricevo sempre il medesimo errore:

Java:
    public class Main {
        public static void main(String args[]) {
            Vettore[] Vettori = new Vettore[3];
            this.x=3.1;
           
            this.y=4.1;
          
            this.z=5.1;

        System.out.println(this.x + this.y + this.z);
       
    }
}
Mi sapete indicare dove sto sbagliando e perchè? ho anche pensato che il problema degli errori derivi da qui:
Java:
public Vettore(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
e che dovrebbe essere scritto così:
Java:
public Vettore(double x, double y, double z) {
this.x = new x;
this.y = new y;
this.z = new z;
}
 
Ciao a tutti,

Mi è stato assegnato un esercizio per vedere le differenze tra i vari modificatori di accesso, il problema che non riesco nemmeno a istanziare le variabili nel main e non capisco dove sbaglio, spero possiate aiutarmi a capire.

Ho questo esericizio:

Utilizzando la classe Vettore vista a lezione:
public class Vettore {
private double x;
private double y;
private double z;
public Vettore(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
}
Scrivere un metodo main() che crei una istanza della classe e tenti di accedere agli attributi
x, y e z e verificare gli errori ottenuti dal compilatore.
Ripetere lo stesso esercizio cambiando il modificatore di accesso degli attributi e definendoli
con:
• visibilità public
• visibilità protected
• visibilità package
e verificando, per ciascun livello di visibilità gli eventuali errori restituiti dal compilatore.

io ho provato scrivere questo main per istanziare la classe ma in tutti i casi mi dà questo errore "non-static variable this cannot be referenced from a static context"
questo è il main che ho scritto ho provato vari metodi per iniziallizare le variabili ma in tutti i modi che ho provato ricevo sempre il medesimo errore:

}
public class Main {
public static void main(String args[]) {
Vettore[] Vettori = new Vettore[3];
this.x=3.1;

this.y=4.1;

this.z=5.1;

System.out.println(this.x + this.y + this.z);

}
}

Mi sapete indicare dove sto sbagliando e perchè? ho anche pensato che il problema degli errori derivi da qui:
public Vettore(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
e che dovrebbe essere scritto così:
public Vettore(double x, double y, double z) {
this.x = new x;
this.y = new y;
this.z = new z;
}
Il problema non è quello, ma risiede nel fatto che stai cercando di accedere dalla classe Main alle proprietà degli oggetti della classe Vettore senza avere un riferimento ad essa. Dalla classe Main se vuoi assegnare dei valori alle proprietà di un oggetto di tipo Vettore devi fare così, avendo il costruttore già fatto:
Java:
Vettore vettore = new Vettore(3.1, 4.1, 5.1)
Se vuoi fare le cose fatte bene devi anche crearti un metodo per la stampa del vettore nella classe Vettore. Attenzione all'uso del riferimento "this"!!!! Si utilizza solo quando una classe vuole accedere alle SUE proprietà: non si può utilizzare come hai fatto tu, ossia per accedere alle proprietà di altre classi.
 
  • Grazie
Reazioni: Rebel811 e MRPants
Il problema non è quello, ma risiede nel fatto che stai cercando di accedere dalla classe Main alle proprietà degli oggetti della classe Vettore senza avere un riferimento ad essa. Dalla classe Main se vuoi assegnare dei valori alle proprietà di un oggetto di tipo Vettore devi fare così, avendo il costruttore già fatto:
Java:
Vettore vettore = new Vettore(3.1, 4.1, 5.1)
Se vuoi fare le cose fatte bene devi anche crearti un metodo per la stampa del vettore nella classe Vettore. Attenzione all'uso del riferimento "this"!!!! Si utilizza solo quando una classe vuole accedere alle SUE proprietà: non si può utilizzare come hai fatto tu, ossia per accedere alle proprietà di altre classi.
Ciao CrazyMonk,

Grazie mille per le dritte ora funziona e devo essere riuscito anche a inserire il metodo stampa, pare che il programma funzioni.

Ti chiedo gentilmente di correggermi in qualsiasi cosa che studiando in autonomia, mi sono perso parecchi dettagli fondamentali che pensavo di aver appreso e invece mi sono sfuggiti.

Java:
 public class Vettore {
/*attributi della classe*/
        [U]public[/U] double x;
        [U]public[/U] double y;
        [U]public [/U]double z;
  /*costruttore della classe*/      
    public Vettore(double x, double y, double z) {
        this.x = x;
        this.y = y;
        this.z = z;
        stampaVettore();
    } 
/*metodo per stampare la classe*/   
    public void stampaVettore() {
        System.out.println(this.x);
        System.out.println(this.y);
        System.out.println(this.z);

    }
        public static void main(String args[]) {
/*Vettore fà riferimento alla classe Vettore dove sono elencati gli attributi
con new Vettore invece ho istazniato i valori x, y e z come indicato dal costruttore*/
            Vettore vettore = new Vettore(3.1, 4.1, 5.1); 
        }
}

Ho eseguito anche la seconda parte dell'esercizio utilizzando i modificatori di accesso private, public, protected e package mdoficandoli solo nella parte sottolineata che nel primo topic non avevo evidenziato.
Con il codice qui sopra funziona con tutti i modificatori di accesso tranne per il modificatore package.
Credo sia coretto che funzioni con tutti i modificatori in quanto fa tutto parte della stasse classe.

Grazie mille per il tuo tempo e Buona Domenica
Rebel811
 
  • Mi piace
Reazioni: --- Ra ---
Ciao CrazyMonk,

Grazie mille per le dritte ora funziona e devo essere riuscito anche a inserire il metodo stampa, pare che il programma funzioni.

Ti chiedo gentilmente di correggermi in qualsiasi cosa che studiando in autonomia, mi sono perso parecchi dettagli fondamentali che pensavo di aver appreso e invece mi sono sfuggiti.

Java:
 public class Vettore {
/*attributi della classe*/
        [U]public[/U] double x;
        [U]public[/U] double y;
        [U]public [/U]double z;
  /*costruttore della classe*/    
    public Vettore(double x, double y, double z) {
        this.x = x;
        this.y = y;
        this.z = z;
        stampaVettore();
    }
/*metodo per stampare la classe*/ 
    public void stampaVettore() {
        System.out.println(this.x);
        System.out.println(this.y);
        System.out.println(this.z);

    }
        public static void main(String args[]) {
/*Vettore fà riferimento alla classe Vettore dove sono elencati gli attributi
con new Vettore invece ho istazniato i valori x, y e z come indicato dal costruttore*/
            Vettore vettore = new Vettore(3.1, 4.1, 5.1);
        }
}

Ho eseguito anche la seconda parte dell'esercizio utilizzando i modificatori di accesso private, public, protected e package mdoficandoli solo nella parte sottolineata che nel primo topic non avevo evidenziato.
Con il codice qui sopra funziona con tutti i modificatori di accesso tranne per il modificatore package.
Credo sia coretto che funzioni con tutti i modificatori in quanto fa tutto parte della stasse classe.

Grazie mille per il tuo tempo e Buona Domenica
Rebel811
Per la visibilità package...che si chiama "friendly" basta non specificare alcun modificatore di visibilità prima delle proprietà. Non mettere il metodo stampa all'interno del costruttore, per un fatto di ordine.
Esiste anche un altro metodo per la stampa di un oggetto che è il toString: quello di default che c'è per ogni classe non va bene, ma si può modificare facendo una sovrascrittura.
 
  • Mi piace
  • Grazie
Reazioni: Rebel811 e MRPants
mha infatti il mio tono era tranquillo , ma il messaggio era : abbiamo le reaction , usiamole , specie quando qualcuno viene in nostro aiuto , anche per spronare la partecipazione della community quando qualcuno riporta un problema o una difficoltà ;)
 
  • Mi piace
Reazioni: --- Ra ---
ragazzi quando qualcuno vi aiuta , mette il suo tempo al servizio vostro , almeno una reazione di ringraziamento eddaje
Ciao MRPants,

hai ragione chiedo scusa ma sono stato preso per qualche giorno, mi sono ricollegato ora e ho provveduto, inoltre ero convinto di aver letto nel regolamento che non se ne potessero dare piu di due al giorno di reaction le avevo già usate durante la presentazione.
 
Ciao MRPants,

hai ragione chiedo scusa ma sono stato preso per qualche giorno, mi sono ricollegato ora e ho provveduto, inoltre ero convinto di aver letto nel regolamento che non se ne potessero dare piu di due al giorno di reaction le avevo già usate durante la presentazione.

tranquillo comunque avevi ringraziato , infatti i toni erano rilassati era solo un consiglio ;)