Aiuto su variabili di istanza, set e get.

di il
10 risposte

Aiuto su variabili di istanza, set e get.

Salve a tutti studio autodidatticamente java e non conoscendo nessuno a cui chiedere spero di avere aiuto qui

Ho capito vagamente le variabili di istanza che in sostanza sono un attributo di una classe/oggetto???? boh..

e non ho proprio capito set e get, qualcuno che mi aiuta per favore?
 //classe Registro contenente una variabile di istanza nomeCorso e impostare set e get per leggere il valore.

public class Registro {
	
	private String nomeCorso;//nome del corso di questo registro
	
	public void setnomeCorso (String nome){
	
	nomeCorso=nome;
	}
	
	public String getnomeCorso(){

	return nomeCorso;
	}
	
	public void mostraMessaggio(){
		System.out.printf("benvenuto al registro %s",getnomeCorso());
		
	}

} fine classe
ho scritto questo ricopiando dal manuale ma eclipse mi dice

The method printf(String, Object[]) in the type PrintStream is not applicable for the arguments (String, String)

non riesco a capire.

10 Risposte

  • Re: Aiuto su variabili di istanza, set e get.

    federico992 ha scritto:


    Ho capito vagamente le variabili di istanza che in sostanza sono un attributo di una classe/oggetto???? boh..
    Le variabili "di istanza" (non static) appartengono distintamente a ciascun oggetto mentre le variabili "di classe" (static) appartengono alla classe, sono "uniche", indipendentemente da quante istanze ci sono della classe.
    public class Prova {
        public static int numeroA;    // variabile "di classe"
        public int numeroB;           // variabile "di istanza"
    }
    numeroA è di classe, ne esiste uno solo, mentre ciascun oggetto istanza di Prova ha il suo proprio campo numeroB.

    Se fai:
    Prova p1 = new Prova();
    Prova p2 = new Prova();

    Le espressioni Prova.numeroA (questo è il modo convenzionale di accederci) oppure p1.numeroA oppure p2.numeroA fanno riferimento alla stessa identica variabile. Il valore è unico.

    Mentre p1.numeroB può avere un valore e p2.numeroB può averne un altro.

    federico992 ha scritto:


    e non ho proprio capito set e get
    I metodi getter/setter permettono di applicare la tecnica del "incapsulamento".

    Se in Prova sopra volessi garantire che numeroB sia sempre e solo maggiore di 0, non potrei farlo. Il campo è pubblico, chiunque ha il riferimento all'oggetto può cambiarne il valore senza vincoli.

    Allora si mette il campo private e si mettono i metodi getter/setter pubblici:
    public class Prova {
        private int numeroB;
    
        public int getNumeroB() {
            return numeroB;
        }
        
        public void setNumeroB(int numeroB) {
            if (numeroB <= 0) {
                throw new IllegalArgumentException("numeroB deve essere maggiore di 0");
            }
            
            this.numeroB = numeroB;
        }
    }
    Così posso garantire quel vincolo.

    federico992 ha scritto:


    The method printf(String, Object[]) in the type PrintStream is not applicable for the arguments (String, String)
    printf è di Java 5 ed è un metodo "varargs" (con numero variabile di argomenti).
    Sicuramente hai un JDK 5 o superiore (altrimenti printf non esisterebbe proprio) ma assicurati che il compilatore stia compilando per Java 5 o più .... e non con target es. 1.4)
  • Re: Aiuto su variabili di istanza, set e get.

    Scusa ma continuo a non capire,

    riesci a spiegarmelo in modo diverso? perché davvero non ho capito come e quando usarle.
    Nell'esempio del libro la variabile è data come private String. Quindi se non sbaglio in questo caso l'unico modo per modificare il loro valore è utilizzare setnomeCorso e leggerle con getnomeCorso.
    (correggimi se sbaglio)

    In ogni caso non ci sono sullo static e non static....se sono static tutti gli oggetti contenuti della classe prendono quegli attributi??
    public void setnomeCorso (String nome){
       
       nomeCorso=nome;
       }
    non ho capito per niente questa parte di codice.

    scusami tu e gli altri se sembrano dubbi sciocchi ma non ho mai fatto vera informatica.
  • Re: Aiuto su variabili di istanza, set e get.

    federico992 ha scritto:


    perché davvero non ho capito come e quando usarle.
    Nell'esempio del libro la variabile è data come private String. Quindi se non sbaglio in questo caso l'unico modo per modificare il loro valore è utilizzare setnomeCorso e leggerle con getnomeCorso.
    (correggimi se sbaglio)
    Sì, esatto. Se è private è accessibile solo dall'interno della classe (e se non andiamo a tirare in ballo truschini fatti con la "reflection").

    federico992 ha scritto:


    In ogni caso non ci sono sullo static e non static....se sono static tutti gli oggetti contenuti della classe prendono quegli attributi??
    Se una variabile membro è static, allora è "di classe", appartiene cioè alla classe che è una sola. La variabile non è distinta per ciascun oggetto.
    Le variabili di classe si usano più raramente e per certi design particolari.

    federico992 ha scritto:


    public void setnomeCorso (String nome){
       
       nomeCorso=nome;
       }
    non ho capito per niente questa parte di codice.
    "nome" (il parametro) è una variabile. nomeCorso è un'altra variabile, quella di istanza. Semplicemente la invocazione del metodo passa in "nome" una copia del valore (del reference dell'oggetto, in questo caso) e tu lo passi a sua volta nella variabile di istanza.
  • Re: Aiuto su variabili di istanza, set e get.

    Perché devo specificare (String nome) e poi assegnare nome a nomeCorso?
  • Re: Aiuto su variabili di istanza, set e get.

    federico992 ha scritto:


    Perché devo specificare (String nome) e poi assegnare nome a nomeCorso?
    Il String nome è un parametro (che alla fin fine è una variabile locale), che è ben distinto dalla variabile di istanza. Quindi prima invochi un metodo passando in argomento un valore che finisce nel parametro e poi il metodo .... ne fa quello che vuole. In questo caso lo assegna alla variabile di istanza, in modo che il valore faccia parte dell'oggetto, finché l'oggetto vive e finché non viene settato altro.
  • Re: Aiuto su variabili di istanza, set e get.

    Allora, ho capito teoricamente cosa sia la variabile di istanza, praticamente definisce il comportamento di un oggetto e che può essere legata al singolo oggetto cioè
    negli oggetti creati all'interno della classe automobili tutti hanno le variabili di istanza come "volante", "marce" e "ruote".
    Però posso legare un'altra variabile di istanza che può essere "diesel" o "benzina" a ogni singolo oggetto a mia scelta.

    (ci sono fino a qui?)

    non capisco ancora come scriverle,
    public class automobili
    {
    public static String Volante,marce,ruote; //Ogni oggetto creato avrà questi attributi..giusto?
    
    auto macchinaUno = new auto();
    auto macchinaDue = new auto();
    
    public void macchinaUno (String motore){
    diesel = motore; // solo macchinaUno avrà l'attributo diesel
    }
    
    public void macchinaDue (String motore){
    benzina=motore; // e questa avrà come attributo benzina...??
    }
    
    }fine classe automobili
    sono sicuro che c'è qualche errore. mi correggi questo codice per favore?

    Penso di essere vicino a capire
  • Re: Aiuto su variabili di istanza, set e get.

    federico992 ha scritto:


    Allora, ho capito teoricamente cosa sia la variabile di istanza, praticamente definisce il comportamento di un oggetto e che può essere legata al singolo oggetto
    Comportamento no, nel senso che il "comportamento" di un oggetto è dato dai metodi.
    Le variabili di istanza sono solo "dati" associati distintamente a ciascun oggetto. Se hai una classe Persona con variabili di istanza nome e cognome e crei 10 oggetti Persona, ciascuno di questi oggetti ha le sue variabili nome e cognome. Quindi un oggetto Persona può avere "Mario" "Rossi" e un altro "Roberto" "Bianchi".

    federico992 ha scritto:


    public class automobili
    {
    public static String Volante,marce,ruote; //Ogni oggetto creato avrà questi attributi..giusto?
    
    auto macchinaUno = new auto();
    auto macchinaDue = new auto();
    
    public void macchinaUno (String motore){
    diesel = motore; // solo macchinaUno avrà l'attributo diesel
    }
    
    public void macchinaDue (String motore){
    benzina=motore; // e questa avrà come attributo benzina...??
    }
    
    }fine classe automobili
    sono sicuro che c'è qualche errore.
    Sì, infatti "quadra" poco e non ha granché senso. Appena ho un po' di tempo ti faccio un esempio.
  • Re: Aiuto su variabili di istanza, set e get.

    Comportamento no, nel senso che il "comportamento" di un oggetto è dato dai metodi.
    Le variabili di istanza sono solo "dati" associati distintamente a ciascun oggetto. Se hai una classe Persona con variabili di istanza nome e cognome e crei 10 oggetti Persona, ciascuno di questi oggetti ha le sue variabili nome e cognome. Quindi un oggetto Persona può avere "Mario" "Rossi" e un altro "Roberto" "Bianchi".
    Ah ok quindi la variabile di istanza nel mio caso poteva essere anche "motore" che avrebbe avuto la sua variabile: diesel o benzina.

    mi puoi fare l'esempio correggendo il codice delle macchine che ho scritto? così mi è più chiaro.
  • Re: Aiuto su variabili di istanza, set e get.

    Questo è corretto e sensato:
    public class Automobile {
        private String costruttore;
        private String nome;
        private String modello;
        private Motore motore;
    
        public Automobile(String costruttore, String nome, String modello, Motore motore) {
            this.costruttore = costruttore;
            this.nome = nome;
            this.modello = modello;
            this.motore = motore;
        }
    
        public String getCostruttore() {
            return costruttore;
        }
    
        public void setCostruttore(String costruttore) {
            this.costruttore = costruttore;
        }
    
        public String getNome() {
            return nome;
        }
    
        public void setNome(String nome) {
            this.nome = nome;
        }
    
        public String getModello() {
            return modello;
        }
    
        public void setModello(String modello) {
            this.modello = modello;
        }
    
        public Motore getMotore() {
            return motore;
        }
    
        public void setMotore(Motore motore) {
            this.motore = motore;
        }
    
        // altro .....
    }
    public class Motore {
        private final int cilindrata;
        private final TipoAlimentazione tipoAlimentazione;
    
        public Motore(int cilindrata, TipoAlimentazione tipoAlimentazione) {
            this.cilindrata = cilindrata;
            this.tipoAlimentazione = tipoAlimentazione;
        }
    
        public int getCilindrata() {
            return cilindrata;
        }
    
        public TipoAlimentazione getTipoAlimentazione() {
            return tipoAlimentazione;
        }
    
        // altro .....
    }
    public enum TipoAlimentazione {
        BENZINA,
        DIESEL,
        BENZINA_GPL,
        BENZINA_METANO
    }
    Poi es.
    Motore motore1242Benzina = new Motore(1242, TipoAlimentazione.BENZINA);
    
    Automobile fiatPanda12Fire = new Automobile("Fiat", "Panda", "1.2 Fire", motore1242Benzina);
  • Re: Aiuto su variabili di istanza, set e get.

    Ti ringrazio davvero per l'impegno che ci hai messo per aiutarmi ora mi è molto più chiaro
Devi accedere o registrarti per scrivere nel forum
10 risposte