Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: Interfacce

  1. #1

    Interfacce

    Salve ragazzi ho creato una interfaccia "Tassabile" e voglio implementarla in tre classi: Persona, Studente, Lavoratore. Dove le ultime due sono figlie della prima cioè Persona è abstract. Poi voglio creare un metodo statico "StampaTasse" che stampa a video le tasse di ogni Persona, Studente, Lavoratore usando ovviamente l'interfaccia Tassabile definita ogni volta opportunamente. Java mi da errore nel programma stampa tasse. Adesso vi allego il tutto. GRAZIE!!!


    codice:
    package J10;
    
    
    public abstract class Persona implements Tassabile {
    	private String nome;
    	private int eta;
    	
    	public String getNome() {
    		return nome; }
    	public String setNome(String nome) {
    		return this.nome = nome; }
    	public int getEta() {
    		return eta;	}
    	public void setEta(int eta) {
    		this.eta = eta;	}
    	public String toString() { //override perchè riscrivo toString che è gia definito
    							   //nella classe padre Object	
    		return "Persona [nome=" + nome + ", eta=" + eta + "]"; }
    	public Persona(String nome, int eta) {
    		super(); // perchè è astratta e quindi eredita dalla classe object
    		this.nome = nome;
    		this.eta = eta;	}
    	
    		public String codiceFiscale() {
    			return getNome()+getEta();
    		}
    		public double aliquotaFiscale() {
    			return 0.5;
    		}
    		public double detrazioni() {
    			return 0.2;
    		}
    		
    }

    codice:
    package J10;
    
    
    public class Studente extends Persona { 
    	private String matricola;
    
    
    	public Studente(String nome, int eta, String matricola) {
    		super(nome,eta);
    		this.matricola = matricola;	}
    	public String getMatricola() {
    		return matricola; }
    	public void setMatricola(String matricola) {
    		this.matricola = matricola;	}
    	public String toString() {
    		return super.toString()+"Studente [matricola=" + matricola + "]"; }
    	
    		public String codiceFiscale() {return super.getNome()+super.getEta();}
    		public double aliquotaFiscale() {return 0.05;}
    		public double detrazioni() {return 0.02;}
    }

    codice:
    package J10;
    
    
    public class Lavoratore extends Persona { 
    	private String professione;
    
    
    	public Lavoratore(String nome, int eta, String professione) {
    		super(nome,eta);
    		this.professione = professione;	}
    	public String getProfessione() {
    		return professione; }
    	public void setProfessione(String professione) {
    		this.professione = professione;	}
    	public String toString() {
    		return super.toString()+"Lavoratore [professione=" + professione + "]"; }
    	
    		public String codiceFiscale() {return super.getNome()+super.getEta();}
    		public double aliquotaFiscale() {return 0.005;}
    		public double detrazioni() {return 0.002;}
    }

    codice:
    package J10;
    
    
    public interface Tassabile {
    
    
    	String codiceFiscale();
    	double aliquotaFiscale();
    	double detrazioni();
    }

    codice:
    package J10;
    
    
    public class StampaTasse {
    
    
    	public static void main(String[] args) {
    	Persona[] arrayPersona;
    	Studente[] arrayStudente;
    	int i;
    	
    	i=0;
    	arrayPersona=new Persona[2];
    	arrayStudente=new Studente[2];
    		
    	arrayPersona[0].setNome("Antonio");
    	arrayPersona[0].setEta(27);
    	arrayPersona[1].setNome("Luca");
    	arrayPersona[1].setEta(40);
    	arrayStudente[0].setNome("Michele");
    	arrayStudente[0].setEta(20);
    	arrayStudente[0].setMatricola("123456");
    	arrayStudente[1].setNome("Andrea");
    	arrayStudente[1].setEta(25);
    	arrayStudente[1].setMatricola("987654");	
    	
    		for(i=1;i<3;i++){
    		System.out.println(arrayPersona[i].codiceFiscale());
    		System.out.println(arrayPersona[i].aliquotaFiscale());
    		System.out.println(arrayPersona[i].detrazioni());
    		}
        }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da anto_dina Visualizza il messaggio
    codice:
    	arrayPersona=new Persona[2];
    	arrayStudente=new Studente[2];
    		
    	arrayPersona[0].setNome("Antonio");
    	arrayPersona[0].setEta(27);
            ......
    La cosa più evidente e lampante è qui: hai creato degli array che possono tenere riferimenti a oggetti Persona e Studente ma i vari oggetti Persona e Studente non li hai istanziati. Istanziare un array non porta automaticamente alla istanziazione degli oggetti contenuti nell'array!

    Per il resto non ho verificato a fondo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Innanzitutto grazie per la risposta!
    Ho modificato così:
    codice:
    package J10;
    
    
    public class StampaTasse {
    
    
    	public static void main(String[] args) {
    	Persona[] arrayPersona;
    	Studente[] arrayStudente;
    	int i;
    
    	arrayPersona = new Persona[2];
    	arrayStudente = new Studente[2];
    
    	arrayPersona[0].setNome("Antonio");   // <---- Linea 13 dove mi da errore
    	arrayPersona[0].setEta(27);
    	arrayPersona[1].setNome("Luca");
    	arrayPersona[1].setEta(40);
    	arrayStudente[0].setNome("Michele");
    	arrayStudente[0].setEta(20);
    	arrayStudente[0].setMatricola("123456");
    	arrayStudente[1].setNome("Andrea");
    	arrayStudente[1].setEta(25);
    	arrayStudente[1].setMatricola("987654");	
    
    		for(i=1;i<2;i++){
    		System.out.println(arrayPersona[i].codiceFiscale());
    		System.out.println(arrayPersona[i].aliquotaFiscale());
    		System.out.println(arrayPersona[i].detrazioni());
    		System.out.println(arrayStudente[i].codiceFiscale());
    		System.out.println(arrayStudente[i].aliquotaFiscale());
    		System.out.println(arrayStudente[i].detrazioni());
    		}
        }
    } 


    Ma adesso l'errore è il seguente:

    Exception in thread "main" java.lang.NullPointerException
    at J10.StampaTasse.main(StampaTasse.java:13)

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Lo ripeto meglio:

    Persona[] arrayPersona = new Persona[2];

    hai istanziato un array che può tenere riferimenti a 2 oggetti Persona. Ma gli oggetti Persona non sono istanziati automaticamente. Li devi istanziare tu.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Sarà che sono alle prime armi con JAVA, sarà che so de coccio. Ma io ancora non ho capito...
    Mi è chiaro che facendo Persona[] arrayPersona = new Persona[2]; alloco spazio per un array di 2 persone ma tu dici che gli oggetti Persona non sono istanziati. Allora mi chiedo: questo non vuol dire istanziare?? arrayPersona[0].setNome("Antonio");

    Forse vuol dire usare il costruttore per istanziare, ma il costruttore sta nella classe astratta persona... Come lo richiamo? Grazie infinite!
    Ultima modifica di anto_dina; 30-08-2014 a 16:35

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    arrayPersona[0] = new Studente();
    arrayPersona[1] = new QuelCheè();
    ecc ecc
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    arrayPersona[0] = new Studente();
    arrayPersona[1] = new QuelCheè();
    ecc ecc
    Grazie anche a te per la risposta.
    Ho fatto come dici in questo modo:
    codice:
    package J10;
    
    
    public class StampaTasse {
    
    
    	public static void main(String[] args) {
    	Persona[] arrayPersona = new Persona[2];
    	Studente[] arrayStudente = new Studente[2];
    	int i;
    
    	arrayPersona[0] = new Persona();
    	arrayPersona[1] = new Persona();
    	arrayStudente[0] = new Studente();
    	arrayStudente[1] = new Studente();
    
    
    	arrayPersona[0].setNome("Antonio");
    	arrayPersona[0].setEta(27);
    	arrayPersona[1].setNome("Luca");
    	arrayPersona[1].setEta(40);
    	arrayStudente[0].setNome("Michele");
    	arrayStudente[0].setEta(20);
    	arrayStudente[0].setMatricola("123456");
    	arrayStudente[1].setNome("Andrea");
    	arrayStudente[1].setEta(25);
    	arrayStudente[1].setMatricola("987654");	
    
    		for(i=1;i<2;i++){
    		System.out.println(arrayPersona[i].codiceFiscale());
    		System.out.println(arrayPersona[i].aliquotaFiscale());
    		System.out.println(arrayPersona[i].detrazioni());
    		System.out.println(arrayStudente[i].codiceFiscale());
    		System.out.println(arrayStudente[i].aliquotaFiscale());
    		System.out.println(arrayStudente[i].detrazioni());
    		}
        }
    }
    Adesso però mi da due errori, per la precisione:

    1. Cannot instantiate the type Persona
    2. The constructor Studente() is undefined

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da anto_dina Visualizza il messaggio
    1. Cannot instantiate the type Persona
    La classe Persona è abstract, quindi non è istanziabile.
    Istanziare un array di tipo X[] dove X è una classe astratta o una interfaccia invece è assolutamente lecito. Infatti può contenere riferimenti a classi "concrete".

    Quote Originariamente inviata da anto_dina Visualizza il messaggio
    2. The constructor Studente() is undefined
    Studente ha un costruttore ... ma ha argomenti. Tu stai tentando di usare un costruttore senza argomenti ... che non esiste in Studente.

    Domanda: stai studiando Java su un qualche libro (e quale), oppure no?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Quote Originariamente inviata da andbin Visualizza il messaggio
    La classe Persona è abstract, quindi non è istanziabile.
    Istanziare un array di tipo X[] dove X è una classe astratta o una interfaccia invece è assolutamente lecito. Infatti può contenere riferimenti a classi "concrete".


    Studente ha un costruttore ... ma ha argomenti. Tu stai tentando di usare un costruttore senza argomenti ... che non esiste in Studente.

    Domanda: stai studiando Java su un qualche libro (e quale), oppure no?
    Ok adesso sto capendo
    L'ho modificato in questo modo:
    codice:
    package J10;
    
    
    public class StampaTasse {
    
    
        public static void main(String[] args) {
        Studente[] arrayStudente = new Studente[2];
        int i;
    
        arrayStudente[0] = new Studente("",0,"0");
        arrayStudente[1] = new Studente("",0,"0");
    
    
        arrayStudente[0].setNome("Michele");
        arrayStudente[0].setEta(20);
        arrayStudente[0].setMatricola("123456");
        arrayStudente[1].setNome("Andrea");
        arrayStudente[1].setEta(25);
        arrayStudente[1].setMatricola("987654");    
    
            for(i=0;i<2;i++){
            System.out.println(arrayStudente[i].codiceFiscale());
            System.out.println(arrayStudente[i].aliquotaFiscale());
            System.out.println(arrayStudente[i].detrazioni());
            }
        }
    }
    La classe Persona è abstract, quindi
    non è istanziabile.
    Istanziare un array di tipo X[] dove X è una classe astratta o una interfaccia invece è assolutamente lecito. Infatti può contenere riferimenti a classi "concrete".
    Dunque da quello che mi hai spiegato (se ho capito bene) è inutile utilizzare un array di Persone, anzi è impossibile siccome Persona è una "generalizzazione" delle classi Persona e Lavoratore. Giusto???

    Ho iniziato adesso l'esame che dovrei fare tra un mese circa. Il problema e che sono un elettronico e con l'informatica faccio a cazzotti. Grazie per la pazienza ragazzi...

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da anto_dina Visualizza il messaggio
    Dunque da quello che mi hai spiegato (se ho capito bene) è inutile utilizzare un array di Persone, anzi è impossibile siccome Persona è una "generalizzazione" delle classi Persona e Lavoratore. Giusto???
    No, non è inutile. Avere un array di tipo Persona[] (indipendentemente dal fatto che Persona sia abstract o no) permette di sfruttare il polimorfismo, ma anche addirittura un array di tipo Tassabile[] sarebbe corretto se l'intenzione è quella di "vedere" gli oggetti solo come "tassabili" cioè solo per usare i metodi di Tassabile.

    codice:
    Persona[] persone = new Persona[3];
    persone[0] = new Studente( ..... );
    persone[1] = new Lavoratore( ..... );
    persone[2] = new Studente( ..... );

    Questo è perfettamente lecito. Se invochi un persone[indice].aliquotaFiscale(), verrà eseguito il "giusto" metodo aliquotaFiscale per l'oggetto realmente istanziato che si trova a quell'indice dell'array.

    E il fatto che Persona abbia un comportamento (i metodi) tutto "concreto" rende l'uso di abstract poco sensato.

    Quote Originariamente inviata da anto_dina Visualizza il messaggio
    Ho iniziato adesso l'esame che dovrei fare tra un mese circa.
    Sì ma ripeto: stai usando un qualche libro o stai andando un po' a "tentativi" ?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.