







Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Appunti del corso di ALGORITMI E PROGRAMMAZIONE del prof. Fabio Sartori. Classi e istanze in java
Tipologia: Appunti
1 / 13
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!








Abbiamo introdotto il mondo degli oggetti come una classificazione che parte dal mondo che ci circonda e per astrazione, a partire dagli oggetti concreti, ci porta a definire il concetto di classe. La classe è proprio quell’entità che ci permette di definire la rappresentazione di qualsiasi oggetto Chi chiediamo quindi come il continuo scambio fra entità astratta e concreta viene realizzato. DEFINIZIONE DI CLASSE IN JAVA Finora abbiamo usato le classi come definizione di programma, snaturando quindi il costrutto di classe. In realtà la classe, nel mondo del linguaggio ad oggetti, serve come modello per creare quelli che sono gli oggetti, tramite l’istanziazione. A meno che non si usino classi già scritte da altri, prima di poter creare un qualsiasi oggetto devo creare la sua rappresentazione: cioè la classe. Si ricorda che un programma ad oggetti consiste di oggetti creati a partire da classi diverse che interagiscono fra loro public [altri modificatori] class NomeClasse{ // Definizione Attributi di istanza e/o di classe // Implementazione Costruttori // Implementazione Metodi di istanza e/o di classe } Ognuno dei commenti andrà successivamente implementato. RAPPRESENTAZIONE IN UML La classe Punto in un diagramma delle classi di design è rappresentata come in figura Sintassi: Modificatore_di_visibilità Identificatore_Dell’attributo: tipo Modificatore_di_visibilità:
Definisco la classe e il nome della classe. Gli attributi sono chiamati attributi di istanza perchè caratterizzano ciascuna istanza della classe punto: si rappresentano con variabili definite all’interno della classe (diverso dalle variabili locali, non definite all’interno del main). Gli attributi di istanza caratterizzano in maniera specifica l’oggetto creato a partire dalla classe. Le variabili cambiano la propria funzione a seconda di dove vengono dichiarate, anche se dal punto di vista logico rimangono variabili. Il modificatore di visibilità viene definito prima della dichiarazione del tipo. Gli attributi della classe x e y appartengono all’interfaccia pubblica della classe: visibili pubblicamente nel sistema. COME SI CREA UN OGGETTO? Abbiamo già creato oggetti: esempio della scanner o degli array. Infatti gli array, tipi non primitivi, si implementano come degli oggetti. Gli oggetti si creano con l’operatore new : il principio di base è simile alla creazione e implementazione di variabili di tipo primitivo. Quando si creano oggetti si passa attraverso la creazione di un reference. L’istruzione NomeClasse nomeReference dichiara, ma non crea l’oggetto: non ho allocazione di memoria. Sto quindi indicando il fatto che voglio creare un oggetto che fisicamente non esiste ancora: esisterà nel momento in cui a runtime (dando il comando Java) il new NomeClasse verrà effettivamente istanziato, con tutte le caratteristiche proprie definite dalla classe. A questo punto si usa la “dot notation” per avere accesso all’interfaccia pubblica: tutti gli accessi all’interfaccia pubblica dell’oggetto definita dalla classe derivano dalla dot notation (stringhe). Tutto ciò che appartiene all’interfaccia pubblica dell’oggetto può essere interrogato tramite la dot notation. Quest’anno scriveremo classi in maniera indipendente come nomeReference.Comandi() I comandi saranno quindi implementati come metodi, mentre gli attributi conterranno variabili.
Punto p2 = new Punto(); //int k; //v = k; int k = 3; boolean esito; esito = (v == k); System.out.println(esito); esito = (p1 == p2); confronta gli oggetti System.out.println(esito); p1.x = 1; 1 p1.y = 2; 2 p2.x = 2; 1 p2.y = 3; 2 System.out.println(p2.y); System.out.println(p2); } } Il codice crea due punti e li confronta. Il primo output che verrà stampato sarà true perchè v è uguale a k (han lo stesso valore). Nel momento in cui confronto p1 e p2, il risultato del confronto sarà false perchè p1 e p2 sono due entità diverse, hanno diversi indirizzi di memoria; con il comando new ho creato i due oggetti ma non so ancora che valore assumono (assegno il loro valore successivamente). In ogni caso, anche provando ad assegnare alle coordinate di x e y gli stessi valori (in grassetto ), l’esito dell’operazione rimarrà false, appunto perché il comando usato confronta gli indirizzi di memoria. Due oggetti con stesso stato e comportamento, sono diversi: l’identità dei due oggetti sarà diversa a meno che non costruisca un alias (quando assegno un reference ad un altro reference). Quindi se creassi un punto p3 = p2 e li confrontassi, l’esito dell’operazione sarebbe true. ESEMPIO: UTILIZZO DELLA CLASSE PUNTO Ogni attributo di istanza possiede un tipo!
Creare due punti e assegnare i valori per x e y 3 e 4 e 50 e 90. Stampare a video quale punto ha x maggiore. p1.x = 3 : assegna il valore 3 all’ascissa x del punto p1. Posso fare ciò perchè x appartiene all'interfaccia pubblica del punto p1. Quando vado ad estrarre il valore, quei valori sono a tutti gli effetti dei valori interi. Nel momento in cui creo p1, quello è un reference. Se avessi due attributi, l’estrazione della variabile di x e y, estrae due variabili di tipo primitivo che si comportano come variabili di tipo primitivo dell’anno scorso. Ho quindi x e y, valori interi, su cui posso applicare gli stessi operatori. OGGETTI E REFERENCE Variabili di tipo classe (tipo p1 o p2 dell’esempio precedente) sono molto differenti rispetto a variabili di tipo primitivo (come int o char) Quando creo un alias, da quel momento in avanti, tutte le modifiche che faccio su un oggetto, verranno viste anche dall’altro oggetto. Quindi se in un flusso come questo trovassi un’istruzione del tipo p2 = p1 (che unifica l’identità), le istruzioni andranno di pari passo (meccanismo del garbage collector): la memoria di p2 verrà cancellata e sostituita da quella di p1. p1 e p2 saranno due reference che andranno a vedere la stessa area di memoria.
Vediamo bene cosa succede in memoria: Esempi informali di “cosa succede” quando
Se rappresentiamo la memoria come un tutt’uno, dobbiamo ricordarci che non tutte le variabili sono uguali: avremo variabili differenti a seconda del loro ciclo di vita. Alcune variabili saranno in vita per tutta la durata del programma (dichiarate nel main) e altre che avranno una vita temporanea (dichiarate in un blocco di istruzioni). Dal punto di vista della classificazione, posso avere
Si indica con null la costante utilizzata per inizializzare un reference ad un valore di default
La prima stampa false, la seconda true LA KEYWORD INSTANCEOF Permette di verificare se un oggetto è stato istanziato a partire dalla classe specificata: quando non so se un oggetto è istanza di una certa classe lo posso chiedere esplicitamente. Ritorna true se un oggetto è istanza di una determinata classe. Sintassi: reference instanceof NomeClasse Esempio: Punto p1; p1 = new Punto (); if (p1 instanceof Punto) System.out.println (“p1 referenzia un oggetto” + “di tipo Punto”);