Introduzione a Java ed Eclipse - 1

Package e jar

  • Tutti i sorgenti (.java) e tutti i compilati (.class) le classi che appartengono ad un package devono risiedere in una directory con il nome dle package.
  • Le classi Java possono essere raggruppate in packages.
  • Ognuna delle clasi che appartiene al package dovrà riportare il package cui appartiene, tramite la parala chiave package (Eclipse lo fa per noi).
  • E' possibile tramite un'utility raggruppare tutti i file compilati di un package, di più package o di un intero progetto in un unico archivio denominato jar.

Package e jar

  • Java sarà in grado di eseguire le classi contentue in un file .jar senza bisogno di decomprimerlo.
  • Un package è un gruppo di classi in qualche modo correlate, che per questo hanno una particlare classe di visibilità
  • Un programma eseguibile Java sarà sempre composto da una serie di file compilati di classi (.class) raggruppate nelle directory relative ai riepettivi package

Avvio di Eclipse

Immagine slide

Abilita Workspace di Default

Immagine slide

Differenze tra Java e C++

  • Le classi di visibiltà vanno indicate per ogni attributo/metodo e non ci sono sezioni
  • C'è una nuova classe di visivilità: package che corrisponde a tutte le classi nel package. Se non si indica classe di visibilità si intende package
  • Su usa la parola chiave extends al posto dei : per indicare la classe padre
  • Ogni classe ha un solo file .java invece di un .h ed un .cc o .c++
  • Non esistono funzioni o variabili globali, ma esistono attributi e metodi statici

Differenze tra Java e C++

  • Il tipo char è a 16 bit (Unicode) e non è un tipo intero; il tipo booleano si chiama boolean; int è a 32 bit e long a 64
  • L'ordine di dichiarazione di attributi e metodi è ininfluente, quindi non servono dichiarazioni forward
  • L'ereditarietà è solo singola e la classe padre è sempre public.

Conferma Workspace

Immagine slide

Differenze tra Java e C++ 2

  • Per sfruttare il polimorfismo al posto dell'ereditarietà multipla si usano le interface
  • Per riferirsi all'unica classe padre si utilizza l'attributo implicito super, che corrisponde a this, ma nel contesto della classe padre
  • Tutti i metodi sono virtual
  • Per indicare una costante si usa pa parola chiave final.
  • Per indicare metodi virtuali puri si usa la parola chiave abstract. Anche la classe va dichiarata abstract in questo caso

Differenze tra Java e C++ 2

  • ...
  • Tutti gli attributi e le variabili strutturate sono in realtà solo dei riferimenti, quindi occorre istanziarle con una new, prima di utilizzarle
  • Non è necessario eliminare le istanze inutilizzata con la delete (che non esiste) perché se ne occupa in maniera automatica il garbage collector (gc)

Apri il menù contestuale del package (click destro)

Immagine slide

Dai il nome al nuovo package e conferma

Immagine slide

Installazione di Java ed Eclipse

Installazione di Java ed Eclipse

  • Selezionare la sola voce eclipse, con descrizione IDE Java e piattaforma di strumenti estensibili.
  • In Linux l'installazione è immediata: basta utilizzare Aggiungi/Rimuovi software o Gestore pacchetti e selezionare eclipse.
  • Si può scaricare un PDF con alcune semplici istruzioni all'indirizzo http://dsg.ce.unipr.it/People/amoretti/FI/istruzioniEclipse.pdf, anche se sono per una versione precedente.

Crea Nuovo progetto

Immagine slide

Crea un nuovo package

Immagine slide

File in Java

  • Per convenzione, i nomi delle classi cominciano con la lettra maiuscola e, se sono la concatenazione di più parole, hanno maiuscola anche l'iniziale di ogni parola successiva. (camel-case)
  • Il sorgente di una classe Java va scritto in un file con lo stesso nome della classe (con le stesse maiuscole e minuscole) e l'estensione .java
  • Occorre scrivere file diversi per classi diverse
  • Quando una classe java viene compilata, il compilatore produce un file con lo stesso nome e l'estensione .class.

File in Java

  • Per contro, metodi ed attributi hanno per convenzione l'iniziale minuscola, mentre le parole successive concantenate hanno ancora l'iniziale maiuscola.

Apri il menù contestuale del progetto (click destro)

Immagine slide

Chiudi la Welcome Page

Immagine slide

Riaprire i pannelli laterali - 1

Immagine slide

Inserisci Nome e Conferma

Immagine slide

La classe è creata, siamo pronti per scrivere il codice

Immagine slide

Dai il nome alla nuova classe e conferma

Immagine slide

Aggiungi una nuova classe

Immagine slide

Visualizzazione/modifica del workspace - 1

Immagine slide

Riaprire i pannelli laterali - 4

Immagine slide

Visualizzazione/modifica del workspace - 3

Immagine slide

Riaprire i pannelli laterali - 3

Immagine slide

Primo programma - Hello World in Java

  • Inserire all'interno della clsse creata il seguente codice:
        public static void main (String[] args) {
    System.out.println("Ciao Java");
    }

Scrollo la console per vedere il risultato

Immagine slide

Visualizzazione/modifica del workspace - 2

Immagine slide

Salvo il programma

Immagine slide

Riaprire i pannelli laterali - 2

Immagine slide

Lancio l'esecuzione

Immagine slide

Riapertura Panneli Laterali

Immagine slide

Riaprire i pannelli laterali - 5

Immagine slide

Primo programma - videata

Immagine slide

Chiusura Pannelli Laterali

Immagine slide

Faccio Doppio Click sulla prima versione del metodo

Immagine slide

Lanciamo l'esecuzione

Immagine slide

Messaggio in grafica

  • Per inviare un messagio all'utente con un pannello grafico possiamo utilizzare i metodi statici della classe JOptionPane
  • Per usare questa classe possimao cominciare a scrivere JOp e poi premente Ctrl+Spazio. Eclipse farà due azioni:
    1. Completerà la parola con JOptionPane, unica possibilità disponibile
    2. Aggiungerà la riga import javax.swing.JOptionPane; per caricare il package che contiene la nostra classe

Messaggio in grafica

  • Ora potremo aggiungere .showM - ci verrà mostrata la lista dei metodi statici che cominciano con showM, con una spiegazione ed i relativi parametri.

Inseriamo la stringa, premiamo a-capo e digitiamo il ;

Immagine slide

Primo programma - Commenti

  • A differenza del C, main non ritorna valori, quindi main è void.
  • Dovendo essere chiamato dal sistema, al di fuori dal nostro package, main dovrà essere public (come lo dovrà essere la classe che lo contiene).
  • L'attributo out è un PrintStream che per stampare possiede i metodi print, println e printf.
  • I metodi print e prinln sono sovraccaricati per tutti i tipi previsti in Java, quindi possono essere utilizzati per stampare qualsiasi tipo di dato.

Primo programma - Commenti

  • Dato che non esistono le funzioni, main deve essere un metodo. Dovendo essere chiamato all'inizio, non avrà un'istanza e quindi dovrà essere static.
  • Venendo al codice interno alla main, sappiamo che non esistono variabili globali, quindi cout viene sostituito dal un attributo static della classe System: System.out
  • I paramtri di main in C definiscono un array di stringhe con la realtiva dimesione. In Java per le stringhe esiste al classe String, quindi il parametro di main sarà un vettore di stringhe: String[] args

Seleziono null come parametro, dato che non ho una finestra cui agganciarmi

Immagine slide

Salviamo il programma

Immagine slide

Ci vengono proposte le opzioni per il secondo parametro

Immagine slide

E questo è il risultato

Immagine slide

Richiesta stringa in grafica

  • Per richiedere una stringa all'utente in grafica possiamo utilizzare il metodo showInputDialog che ci ritorna una stringa.
  • Questo metodo richiese solo una stringa di prompt.
  • Per utilizzare poi la stringa restituita, possiamo sfruttare l'operatore + della classe stringa (unico esempio di sovraccarico degli operatori), che concatena la stringa con la conversione in stringa di qualunque tipo di dato.

La richiesta del nome

Immagine slide

Il programma...

Immagine slide

Il pannello di prima

Immagine slide

Conversione da stringa a numero

  • Siamo ora in grado di richiedere stringhe all'utente. E se ci servisse un numero?
  • Dovremmo trasformare la stringa letta in numero.
  • Ci viene in aiuto il metodo statico parseInt della classe Integer
  • L'unico problema con questo metodo è che la stringa deve conenere solamente il numero. Se la stringa non è valida, parseInt termina il porgramma con un'eccezione.

Il programma...

Immagine slide

La richiesta dell'età

Immagine slide

Creare ed istanziare una classe

  • Creare una classe Cerchio, con un solo attributo double raggio; ed i metodi:
    • costruttore di default Cerchio(); che crea un cerchio di raggio unitario
    • costruttore Cerchio(double r);
    • double getRaggio();
    • double area();
    • String toString();

Creare ed istanziare una classe

  • Creare una seconda classe Test che istanzi un Cerchio c1 con il costruttore di default ed un Cerchio c2 di raggio 3.0

Il pannello iniziale

Immagine slide

Codice delle calsse Cerchio

  • Quindi nel file Cerchio.java scriveremo:
    package secondoProgetto;
    public class Cerchio {
    private double raggio;
    public Cerchio() {
    raggio = 1.0;
    }
    public Cerchio(double r) {
    raggio = r;
    }
    public double getRaggio() {
    return raggio;
    }
    public double area() {
    return raggio * raggio * Math.PI;
    }
    public String toString() {
    return "Cerchio di raggio " + raggio;
    }
    }

Codice delle calsse Cerchio

  • Dovremo creare il progetto secondoProgetto con il package secondoProgetto.

Il nuovo dialog con le due stringhe sommate

Immagine slide

La richiesta del nome

Immagine slide

La stampa del risultato

Immagine slide

Derivare da una classe

  • Modificheremo poi il main dentro a Test per creare un Cilindro c1 di dimensioni unitarie ed un Cilindro c2 di raggio 3.0 ed altezza 4.0 e stamparne le caratteristiche

Derivare da una classe

  • Ora aggiungiamo al progetto una classe Cilindro, derivata da cerchio, con attributo double altezza e metodi:
    • coustruttore di default Cilindro(); che crea un cilindro con raggio di base ed altezza unitari
    • costruttore Cilindro(double r, double h);
    • metodo double volume();
    • metodo double superficie();
    • metodo String toString();

Codice della Classe Test

  • Nel file Test.java scriveremo:
    package secondoProgetto;
    class Test {
    public static void main (String[] args) {
    Cerchio c1 = new Cerchio();
    Cerchio c2 = new Cerchio(3.0);
    System.out.println(c1.toString() + " con area " + c1.area());
    System.out.println(c2.toString() + " con area " + c2.area());
    }
    }

Modifica del codice della classe Test

  • Nel file Test.java modificare:
    package secondoProgetto;
    class Test {
    public static void main (String[] args) {
    Cilindro c1 = new Cilindro();
    Cilindro c2 = new Cilindro(3.0);
    System.out.println(c1.toString() + " con volume " + c1.volume() + " e superficie " +
    c1.superficie());
    System.out.println(c2.toString() + " con volume " + c2.volume() + " e superficie " +
    c2.superficie());
    }
    }

Codice della classe Cilindro

  • Nel file Cilindro.java scriveremo:
    package secondoProgetto;
    public class Cilindro extends Cerchio {
    private double altezza;
    private Cilindro() {
    altezza = 1.0;
    }
    public cilindro(double r, double h) {
    super(r);
    altezza = h;
    }
    public double volume() {
    return area() * altezza;
    }
    public double superficie(){
    return 2 * getRaggio() * Math.PI * altezza + 2 * area();
    }
    public String toString() {
    return "Cilindro di raggio " + getRaggio() + " e altezza " + altezza;
    }
    }

Risultato del lancio

Immagine slide

Risultato finale del Cilindro

Immagine slide
[any material that should appear in print but not on the slide]