Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50

    [JAVA]No ai metodi statici!

    Buongiorno a tutti. Ho un problema da risolvere :/
    Il fatto è che sono venuta a conoscenza da poco di alcuni dettagli che la professoressa esige all'esame, ovvero:

    NON una sola classe. Ma una classe per il costruttore e i get e i set, una per i metodi e una per il collaudo (io ho sempre fatto una per costruttore+metodi e una per il tester)

    campi di esemplare PRIVATI. E fin qui ok. Li ho sempre fatti privati. Ma quando li facevo privati riuscivo comunque a chiamarli perchè facevo costruttori e metodi in un'unica classe. Adesso che so di dover fare due classi separate, come cavolo faccio ad usare per esempio un "Dipendente.stipendio" nella classe dei metodi, se quello "stipendio" è dichiarato private nella classe dei costruttori?

    Terza e ultima cosa, quella più importante: NO AI METODI STATIC. Io praticamente vivevo di metodi static XD E' una cosa brutta da sapere pochi giorni prima dell'esame.
    Io ho sempre fatto per esempio:


    codice:
    public static void stampa(Palestra[]v)
    	{
    		for(int i=0;i<v.length;i++)
    		{
    			System.out.println(v[i].cognome+", "+v[i].nome+
    					", "+v[i].data+", "+v[i].tipo);
    		}

    E per usare il metodo "stampa" facevo semplicemente: Palestra.stampa(Palestra[] array)

    Se io invece tolgo quello "static", come faccio ad usare il metodo? Come funziona?
    Adesso cercherò di documentarmi meglio tra la differenza tra metodi static e non, però io l'ho sempre messo per comodità, non ho mai capito cosa significasse realmente.

    grazie a tutti per l'attenzione
    Ciao!




    _________________________________


    EDIT: Ho girato un po' e forse ho colto la differenza tra metodi static e non-static. Ditemi se sbaglio. Praticamente, a quanto ho capito, un metodo Static non ha bisogno diciamo di una propria "memoria", è solo un metodo a cui viene passato un oggetto di qualsiasi classe e che lo modifica. Mentre, un metodo non-statico, dovrebbe operare su un'istanza, su un oggetto della classe del metodo e modificarlo, immagazzinandolo nel metodo stesso... forse sono stata poco precisa ç_ç

  2. #2
    Ma quando li facevo privati riuscivo comunque a chiamarli perchè facevo costruttori e metodi in un'unica classe. Adesso che so di dover fare due classi separate, come cavolo faccio ad usare per esempio un "Dipendente.stipendio" nella classe dei metodi, se quello "stipendio" è dichiarato private nella classe dei costruttori?
    In questo caso avrai l'attributo stipendio dichiarato come provate e i rispettivi getter e setter che ti serviranno per accedere a stipendio da altre classi.

    Esempio;

    codice:
    public class Dipendente{
        private double stipendio;
    
        public double getStipendio(){
            return this.stipendio;
        }
    
        public setStipendio(double stipendio){
            this.stipendio = stipendio;
        }
    }
    
    
    public class ClasseDeiMetodi{
    
        public void metodoEsempio(){
            Dipendente dipendente = new Dipendente();
    
            //per accedere allo stipendio
            dipendente.getStipendio();
        }
    }
    In pratica l'oggetto dovrà essere istanziato e successivamente potrai accedere agli attributi (sia in lettura che scrittura) gazie ai metodi get e set.


    E per usare il metodo "stampa" facevo semplicemente: Palestra.stampa(Palestra[] array) Se io invece tolgo quello "static", come faccio ad usare il metodo? Come funziona? Adesso cercherò di documentarmi meglio tra la differenza tra metodi static e non, però io l'ho sempre messo per comodità, non ho mai capito cosa significasse realmente.
    Stessa cosa dell'esempio precedente, dovrai istanziare la classe Palestra tramite il suo costruttore.

    codice:
    Palestra palestra = new Palestra();
    palestra.stampa(Palestra[] array);

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50

    Stessa cosa dell'esempio precedente, dovrai istanziare la classe Palestra tramite il suo costruttore.

    codice:
    Palestra palestra = new Palestra();
    palestra.stampa(Palestra[] array);
    In che senso? "palestra.stampa(Palestra[] array);" non è la chiamata per un metodo static? Io chiedevo come usare quelli non-static. Con i metodi non-static posso usare solo oggetti della classe del metodo giusto?

  4. #4
    Ed io cosa ti avevo scritto nella mia risposta a questa discussione a cui non m'hai nemmeno risposto?

    http://forum.html.it/forum/showthrea...readid=1535051

    Cmq ti rifresco la memoria.

    P.S. Un'ultima cosa che esula dall'errore.
    Era meglio che ti creavi una classe Entity come Dipendente dove inserivi solo i metodi getter e setter dei vari attributi (nome, cognome, stipendio etc), e poi una classe control dove ti facevi tutti i tuoi controlli.
    anche perché in questo caso i metodi get e set a cosa ti servono?



    Togliendo questo piccolo escursus lo static si usa solamente quando si verificano particolari condizioni,
    ad esempio chiamare un metodo senza creare nuove istanze di quella classe.

    per la seconda domanda ti ripeto a cosa ti servono i metodi get e set?

    Basta chiamare Dipendenti.getStipendio() se l'hai precedentemente istanziato e riempito.

    Ciao
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  5. #5
    Originariamente inviato da ReaSanka
    In che senso? "palestra.stampa(Palestra[] array);" non è la chiamata per un metodo static? Io chiedevo come usare quelli non-static. Con i metodi non-static posso usare solo oggetti della classe del metodo giusto?
    No questa è una chiamata non-static, quando costruisci l'oggetto e poi utilizzi un suo metodo pubblico.

    Quando invece chiami l'oggetto senza istanziarlo (Palestra.stampa(..)) è una chiamata a un metodo statico.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    @schumy2000: Scusami se non ti ho risposto in quel topic. Solitamente quando chiedo qualcosa in questo forum rispondo sempre, anche solo per ringraziare, invece mi deve essere sfuggito perchè forse ero dal cellulare
    Comunque a parte questo, continua a non essermi molto chiara la differenza tra metodo statico e metodo non statico..


    Mi rimangono alcuni dubbi:
    - i campi di esemplare essendo privati, per funzionare in entrambe le classi, vanno dichiarate sia nella classe dei costruttori, sia in quella dei metodi giusto?

    - Per la questione dei get e dei set.. Dite che mi basta il metodo dei get? Perchè prima facevo solo i get, ma se non sbaglio quando per esempio volevo mettere in ordine per cognome i dipendenti di una classe, se facevo (dipendente1.getStipendio()).compareToIgnoreCase(d ipendente2.getStipendio()), non funzionava..ed ero costretta ad usare "dipendente1.stipendio", cosa che funzionava solo se definivo i metodi set..

    -Perchè nella classe "Palestra" riesco ad utilizzare per esempio "var.getName()" e non var.name? Nella classe Palestra1, ci sono sia i get che i set, uno funziona e l'altro no? :/

    - Se la classe dei costruttori si chiama "Palestra1", e quella dei metodi "Palestra", devo usare/manipolare solo oggetti di tipo Palestra1, giusto? Allora a che mi serve un' altra classe "Palestra" dove ci sono solo i metodi se quei metodi li utilizzo comunque su oggetti di tipo Palestra1?


    Adesso sto provando a modificare la classe Palestra,secondo le direttive richieste dalla professoressa.
    Eccola:
    CLASSE COSTRUTTORE
    codice:
    public class Palestra1 {
    
    	/**
    	 * contiene il costruttore, i get e i set
    	 */
    	
    
    	//costruttore oggetti della classe Palestra
    	public Palestra1(String cogn, String nom, String dat, String tip)
    	{
    		cognome=cogn;
    		nome=nom;
    		data=dat;
    		tipo=tip;
    	}
    	public String getSur()
    	{
    		return cognome;
    	}
    	public String getName()
    	{
    		return nome;
    	}
    	public String getDate()
    	{
    		return data;
    	}
    	public String getType()
    	{
    		return tipo;
    	}
    	public void setSur(String v)
    	{
    		cognome= v;
    	}
    	public void setName(String v)
    	{
    		nome= v;
    	}
    	public void setDate(String v)
    	{
    		data= v;
    	}
    	public void setType(String v)
    	{
    		tipo= v;
    	}
    	
    	
    	
    	
    	//campi esemplare
    		private String cognome;
    		private String nome;
    		private String data;
    		private String tipo;
    	
    	
    
    }

    CLASSE METODI
    codice:
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    
    public class Palestra {
    
    	//POPOLAMENTO AUTOMATICO DELL'ARRAY
    	public Palestra1[] datiCollaudo()
    	{
    		Palestra1[] collaudo = new Palestra1[5];
    		collaudo[0]= new Palestra1("Panucci","Luigi","15/10/2012","A");
    		collaudo[1]= new Palestra1("Biffi","Andrea","22/11/2012","B");
    		collaudo[2]= new Palestra1("Ambruoso","Ugo","18/12/2012","C");
    		collaudo[3]= new Palestra1("Diana","Elena","04/010/2013","C");
    		collaudo[4]= new Palestra1("Giacchi","Maria","07/01/2013","B");
    		
    		return(collaudo);
    		
    	}
    	//Visualizzazione dell'array in forma tabellare
    	public void stampaTabellare(Palestra1[]v)
    	{
    		for(int i=0;i<v.length;i++)
    		{
    			System.out.println(v[i].getSur()+", "+v[i].getName()+
    					", "+v[i].getDate()+", "+v[i].getType()+ "\t");
    		}
    	}
    	//STAMPA NORMALE
    	public void stampa(Palestra1[]v)
    	{
    		for(int i=0;i<v.length;i++)
    		{
    			System.out.println(v[i].getSur()+", "+v[i].getName()+
    					", "+v[i].getDate()+", "+v[i].getType());
    		}
    	}
    	//ORDINAMENTO DELL'ARRAY IN BASE AL COGNOME
    	public void ordSur(Palestra1[]v)
    	{
    		Palestra1 temp;
    		for(int i=1;i<v.length;i++)
    		{
    			for(int j=i;j>0;j--)
    			{
    				if((v[j].getSur()).compareToIgnoreCase(v[j-1].getSur())<0)
    				{
    					temp=v[j];
    					v[j]=v[j-1];
    					v[j-1]=temp;
    				}
    			}
    		}
    	}
    	//TRASFORMO LA DATA(STRING) IN UNA VERA DATA
    	private Date trasf(String data)
    	{
    		Date c=null;
    		try{
    		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    		c = sdf.parse(data);
    		}catch(ParseException ex){ex.printStackTrace();}
    		return (c);
    	}
    	
    
    	//VISUALIZZAZIONE DEI DATI DELL'ISCRITTO
    	//IL CUI ABBONAMENTO SCADE PER PRIMO
    	public void scadenza(Palestra1[]v)
    	{
    		//creo un array di date
    		Date[] array = new Date[v.length];
    		for(int i=0;i<v.length;i++)
    		{
    			array[i]=trasf(v[i].getDate());
    		}
    		//confronto
    		Palestra1 min=null;
    		for(int i=0;i<array.length-1;i++)
    		{
    			if(array[i].compareTo(array[i+1])<0)
    			{
    				min=v[i];
    			}
    			else min = v[i+1];
    		}
    		System.out.println(min.getSur()+", "+min.getName()+
    				", "+min.getDate()+", "+min.getType());
    		
    	}
    	//calcolo della percentuale dei diversi tipo di abbonamento
    	public void percAbbonamenti(Palestra1[]v)
    	{
    		int somma=0;
    		int contaA=0;
    		int contaB=0;
    		int contaC=0;
    		for(int i=0;i<v.length;i++)
    		{
    			if((v[i].getType()).equalsIgnoreCase("A"))
    			{
    				contaA++;
    			}
    		}
    		for(int i=0;i<v.length;i++)
    		{
    			if((v[i].getType()).equalsIgnoreCase("B"))
    			{
    				contaB++;
    			}
    		}
    		for(int i=0;i<v.length;i++)
    		{
    			if((v[i].getType()).equalsIgnoreCase("C"))
    			{
    				contaC++;
    			}
    		}
    		somma = contaA+contaB+contaC;
    		//calcolo la percentuale
    		double percentualeA = (100/somma)*contaA;
    		System.out.println("Abbonamenti A: "+percentualeA+"%");
    		double percentualeB = (100/somma)*contaB;
    		System.out.println("Abbonamenti B: "+percentualeB+"%");
    		double percentualeC = (100/somma)*contaC;
    		System.out.println("Abbonamenti C: "+percentualeC+"%");
    		
    	}
    	
    	
    	
    	
    	
    	//campi esemplare
    		private String cognome;
    		private String nome;
    		private String data;
    		private String tipo;
    
    }
    CLASSE COLLAUDO
    codice:
    import java.util.Scanner;
    
    
    public class Palestra_tester {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		Scanner in = new Scanner(System.in);
    		int scelta;
    		Palestra1[] iscritti=null;
    		do
    		{
    			System.out.println("Scegli tra le seguenti operazioni: "
    					+"\n1.Popolamento array con dati da tastiera"
    					+"\n2.Popolamento array con dati di collaudo"
    					+"\n3.Visualizzazione dell'array in forma tabellare"
    					+"\n4.Ordinamento dell'array in base al cognome"
    					+"\n5.Visualizzazione iscritto con scadenza abbonamento più vicina"
    					+"\n6.Calcolo della percentuale dei diversi tipi di abbonamento"
    					+"\n7.Termina programma");
    			
    			scelta=in.nextInt();
    			
    			switch(scelta)
    			{
    			case 1:
    				System.out.println("QUANTI ISCRITTI VUOI INSERIRE?");
    				int num = in.nextInt();
    				iscritti = new Palestra1[num];
    				for(int i=0;i<iscritti.length;i++)
    				{
    					System.out.println("Cognome iscritto "+(i+1)+": ");
    					String surname = in.next();
    					System.out.println("Nome iscritto "+(i+1)+": ");
    					String name = in.next();
    					System.out.println("Data iscrizione "+(i+1)+": ");
    					String data = in.next();
    					System.out.println("Tipo abbonamento "+(i+1)+": ");
    					String tipo = in.next();
    					
    					Palestra1 oggetto = new Palestra1(surname,name,data,tipo);
    					iscritti[i]=oggetto;
    				}
    				break;
    				
    			case 2:
    				System.out.println();
    				System.out.println("STAMPA DATI COLLAUDO");
    				iscritti= Palestra.datiCollaudo();
    				Palestra.stampa(iscritti);
    				break;
    				
    			case 3:
    				System.out.println();
    				System.out.println("VISUALIZZAZIONE ARRAY FORMA TABELLARE");
    				Palestra.stampaTabellare(iscritti);
    				break;
    				
    			case 4:
    				System.out.println();
    				System.out.println("ORDINAMENTO PER COGNOME");
    				Palestra.ordSur(iscritti);
    				Palestra.stampa(iscritti);
    				break;
    				
    			case 5:
    				System.out.println();
    				System.out.println("ABBONAMENTO CON SCADENZA PIU' VICINA");
    				Palestra.scadenza(iscritti);
    				break;
    				
    			case 6:
    				System.out.println();
    				System.out.println("PERCENTUALE DEGLI ABBONAMENTI");
    				Palestra.percAbbonamenti(iscritti);
    			
    			}
    	
    		}while(scelta!=7);
    		System.out.println("Programma terminato!");
    		
    		
    		
    		
    	}
    
    }


    Ovviamente la classe di collaudo contiene errori. Non riesco a capire come utilizzare i metodi creati.. Se ho "Palestra.ordSur(iscritti)" dovrei chiamarlo con "ordSur(iscritti)" o iscritti.ordSur(), ma non va :/

  7. #7
    dovrebbe funzionare con questa classe di collaudo.

    ovviamente per il case 3-4-5-6-7 prima devi inserire degli iscritti altrimenti il programma di darà un errore di NullPointerException

    Ciao.


    codice:
    import java.util.Scanner;
    
    
    public class Palestra_tester {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Palestra tmp=null;
    		Scanner in = new Scanner(System.in);
    		int scelta;
    		Palestra1[] iscritti=null;
    		do
    		{
    			System.out.println("Scegli tra le seguenti operazioni: "
    					+"\n1.Popolamento array con dati da tastiera"
    					+"\n2.Popolamento array con dati di collaudo"
    					+"\n3.Visualizzazione dell'array in forma tabellare"
    					+"\n4.Ordinamento dell'array in base al cognome"
    					+"\n5.Visualizzazione iscritto con scadenza abbonamento più vicina"
    					+"\n6.Calcolo della percentuale dei diversi tipi di abbonamento"
    					+"\n7.Termina programma");
    			
    			scelta=in.nextInt();
    			
    			switch(scelta)
    			{
    			case 1:
    				System.out.println("QUANTI ISCRITTI VUOI INSERIRE?");
    				int num = in.nextInt();
    				iscritti = new Palestra1[num];
    				for(int i=0;i<iscritti.length;i++)
    				{
    					System.out.println("Cognome iscritto "+(i+1)+": ");
    					String surname = in.next();
    					System.out.println("Nome iscritto "+(i+1)+": ");
    					String name = in.next();
    					System.out.println("Data iscrizione "+(i+1)+": ");
    					String data = in.next();
    					System.out.println("Tipo abbonamento "+(i+1)+": ");
    					String tipo = in.next();
    					
    					iscritti[i] = new Palestra1(surname,name,data,tipo);
    				
    				}
    				break;
    				
    			case 2:
    				System.out.println();
    				System.out.println("STAMPA DATI COLLAUDO");				
    				tmp=new Palestra();
    				iscritti=tmp.datiCollaudo();
    				tmp.stampa(iscritti);
    				break;
    				
    			case 3:
    				System.out.println();
    				System.out.println("VISUALIZZAZIONE ARRAY FORMA TABELLARE");
    				//Palestra.stampaTabellare(iscritti);
    				tmp=new Palestra();
    				tmp.stampaTabellare(iscritti);
    				
    				break;
    				
    			case 4:
    				System.out.println();
    				System.out.println("ORDINAMENTO PER COGNOME");
    				//Palestra.ordSur(iscritti);
    				//Palestra.stampa(iscritti);
    				tmp=new Palestra();
    				tmp.ordSur(iscritti);
    				tmp.stampa(iscritti);
    				break;
    				
    			case 5:
    				System.out.println();
    				System.out.println("ABBONAMENTO CON SCADENZA PIU' VICINA");
    				//Palestra.scadenza(iscritti);
    				tmp=new Palestra();
    				tmp.scadenza(iscritti);
    				break;
    				
    			case 6:
    				System.out.println();
    				System.out.println("PERCENTUALE DEGLI ABBONAMENTI");
    				//Palestra.percAbbonamenti(iscritti);
    				tmp=new Palestra();
    				tmp.percAbbonamenti(iscritti);
    			}
    	
    		}while(scelta!=7);
    		System.out.println("Programma terminato!");		
    		
    	}
    
    }
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    Grazie mille, adesso è perfetto!! Quindi in pratica devo crearmi nel tester un array di appoggio E in questo modo i metodi della classe Palestra operano su oggetti di tipo Palestra 1, ma per usarli nella classe di collaudo devo utilizzare un oggetto "temporaneo" del tipo della classe dei metodi, ovvero di tipo Palestra, anche se come output avrò oggetti di tipo Palestra1. E' corretto?

    Approfitto ancora del vostro aiuto, proverò a rispondermi da sola ai quesiti/dubbi che avevo posto sopra e ditemi se il ragionamento va bene ^^
    - i campi di esemplare essendo privati, per funzionare in entrambe le classi, vanno dichiarate sia nella classe dei costruttori, sia in quella dei metodi giusto?
    No. Basta che siano dichiarati nella classe dei costruttori, giusto?

    - Per la questione dei get e dei set.. Dite che mi basta il metodo dei get? Perchè prima facevo solo i get, ma se non sbaglio quando per esempio volevo mettere in ordine per cognome i dipendenti di una classe, se facevo (dipendente1.getStipendio()).compareToIgnoreCase(d ipendente2.getStipendio()), non funzionava..ed ero costretta ad usare "dipendente1.stipendio", cosa che funzionava solo se definivo i metodi set..
    Questo non mi è ancora chiarissimo... i set in pratica sono inutili? Bastano i get?

    -Perchè nella classe "Palestra" riesco ad utilizzare per esempio "var.getName()" e non var.name? Nella classe Palestra1, ci sono sia i get che i set, uno funziona e l'altro no? :/
    Domanda collegata a quella di sopra XD

    - Se la classe dei costruttori si chiama "Palestra1", e quella dei metodi "Palestra", devo usare/manipolare solo oggetti di tipo Palestra1, giusto? Allora a che mi serve un' altra classe "Palestra" dove ci sono solo i metodi se quei metodi li utilizzo comunque su oggetti di tipo Palestra1?
    A questo dovrei essermi risposta sopra: E in questo modo i metodi della classe Palestra operano su oggetti di tipo Palestra 1, ma per usarli nella classe di collaudo devo utilizzare un oggetto "temporaneo" del tipo della classe dei metodi, ovvero di tipo Palestra, anche se come output avrò oggetti di tipo Palestra1. E' corretto?


    Grazie mille per l'aiuto! Siete sempre molto esaurienti

  9. #9
    1)giusto infatti devi cancellare gli attributi esemplare dalla classe Palestra.

    2) metti che ad un certo punto vuoi creare un'altra gestione in cui di un iscritto devi modificare solo il cognome...cosa fai?
    le strade sono due:
    a) o cancelli e ricrei il record.
    b) con in metodo setCognome gli setti solo il cognome e lasci il resto invariato.


    3) vedi sopra


    4) più o meno è così...ma hai tanto ancora da imparare...
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    Originariamente inviato da schumy2000
    ..ma hai tanto ancora da imparare...
    Questo sicuramente!

    Grazie ancora per tutto! ^^

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.