Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti...

38
Modificatori: static Variabili e metodi associati ad una Classe anziche’ ad un Oggetto sono definiti “static”. Le variabili statiche servono come singola variabile condivisa tra le varie istanze I metodi possono essere richiamati senza creare una istanza.

Transcript of Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti...

Page 1: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Modificatori: static

Variabili e metodi associati ad una

Classe anziche’ ad un Oggetto

sono definiti “static”.

Le variabili statiche servono come

singola variabile condivisa tra le varie istanze

I metodi possono essere richiamati senza creare una istanza.

Page 2: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Variabili “static”: esempio 1class S { static int instanceCount = 0; //variabile “di classe” S() {instanceCount++;}

}public class A { public static void main(String a[]) { new A(); } A() { for (int i = 0; i < 10; ++i) { S instance=new S(); } System.out.println("# of instances: "+S.instanceCount); }}

Output:# of instances: 10

Page 3: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Variabili “static”: esempio 2class S { static int instanceCount = 0; //variabile “di classe” S() {instanceCount++;} public void finalize() {instanceCount--;}}public class A { public static void main(String a[]) { new A();}

A() { for (int i = 0; i < 10; ++i) { S instance=new S(); } System.out.println("# of instances: "+S.instanceCount); System.gc(); System.runFinalization(); System.out.println("# of instances: "+S.instanceCount); }}

Output:# of instances: 10# of instances: 0

Page 4: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Metodi “static”: esempio 1class S { static int instanceCount = 0; //variabile “di classe” S() {instanceCount++;} static void azzeraContatore() {instanceCount=0;}}public class A { public static void main(String a[]) { new A(); } A() { for (int i = 0; i < 10; ++i) { if (i%4==0) S.azzeraContatore(); S instance=new S(); } System.out.println("instanceCount: "+S.instanceCount); }}

Output:instanceCount: 2

Può agire solo su variabili statiche!

Ruolo: Metodi che agiscono suvariabili statiche

Page 5: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

metodi “static”: esempio 2

Math.sqrt(double x);System.gc();System.arrayCopy(...);System.exit();Integer.parseInt(String s);Float.parseFloat(String s);

Notare la maiuscola!

(per convenzione)

Che cos’e’:System.out.println() ?

Ruolo:analogo alle librerie del C

Page 6: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Perchè il main è “static”?public class A { String s="hello"; public static void main(String a[]) { System.out.println(s); }}

Non static variable s cannot be referenced from static context

public class A { String s="hello"; public static void main(String a[]) { new A; } A() { System.out.println(s); }}

hello

Page 7: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Sezione: Packages

Packages

Page 8: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

package

Una collezione di classi correlate

package myclasses;

class A {...};

class B {...};

import myclasses.A;

import myclasses.*;

Page 9: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Annidamento di package

package myclasses;

class A {...};

package myclasses;

class B {...};

package myclasses.veryUsefulClasses;

class C {...};

import myclasses.*; // NON importa C!

Definizione suggerita di un nome univoco per i packages:È basata sul nome internet (es.: it.unitn.science.mypackage)

Page 10: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Annidamento di package

I packages si riflettono in una struttura di directories

myclasses

A.class B.class veryUsefulClasses

C.class

Page 11: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Sezione: Costruttori

Costruttori

Page 12: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Definizione dei costruttori

Se per una classe A non scrivo nessun costruttore, il sistema automaticamente crea il costruttore A();

Se invece definisco almeno un costruttore non void, ad es. A(int s), il sistema non crea il costruttore A();

Page 13: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Definizione dei costruttori

Se B è figlia di A, il costruttore di B come prima cosa invoca A(), a meno che la prima istruzione non sia una super.

B(int k) { super(k)...}

A(int k) { ...}

A() { ...}

B(int k) { ...}

Page 14: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Invocazione dei costruttoripublic class A { public A() { System.out.println("Creo A"); }}public class B extends A { public B() { System.out.println("Creo B"); } public B(int k) { System.out.println("Creo B_int”); }}

Output:Creo ACreo B_int

public static void main(String [] a) { B b=new B(1); }

Page 15: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Invocazione dei costruttoripublic class A { public A(int k) { System.out.println("Creo A"); }}public class B extends A { public B() { System.out.println("Creo B"); } public B(int k) { System.out.println("Creo B_int”); }}

Output:ERRORE !

Perchè ?

public static void main(String [] a) { B b=new B(1); }

Page 16: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Sezione: Modificatori

Abstract e Controllo di accesso

Page 17: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Modificatori: abstract

Classi dichiarate abstract non possono essere istanziate, e devono essere subclassate.

Metodi dichiarati abstract devono essere sovrascritti

Una class non abstract non può contenere abstract metods

Page 18: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Modificatori: visibilità

public visibile da tutti(non def.)visibile da tutti nello stesso packageprotected visibile dalle sottoclassiprivate nascosta da tutti

public class ACorrectClass {

private String aUsefulString;

public String getAUsefulString() {

return aUsefulString; // "get" the value

}

private void setAUsefulString(String s) {

//protected void setAUsefulString(String s) {

aUsefulString = s; // "set" the value

}

}

Uso di metodi “di accesso”:

Page 19: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Matrice degli accessi

Access LevelsSpecifier Class Package Subclass World

private Y N N N

no specifier Y Y N N

protected Y Y Y N

public Y Y Y Y

Vedi anche http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

Page 20: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Sezione: Upcast - downcast

Upcast & downcast

Page 21: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Coercion

Una funzione può essere polimorfa senza essere stata disegnata tale intenzionalmente.

Sia f una funzione che prende un argomento di tipo T, e S sia un tipo che può essere automaticamente convertito in T. Allora f può essere detta polimorfa respetto a S e T.

float somma(float x, float y) accetta anche somma (3, 3.14)somma(2,3)(coercion di int a float)

Page 22: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

public class Test {

public static void main(String a[]) {

new Test();

} cast Test() {

A a;

B b = new B();

a=b;

a.f1();

a.f2();

}

}

OK: upcast implicito

class A { void f1()

{System.out.println("f1");} }

class B extends A { void f2()

{System.out.println("f2");} }

class C extends B { void f3()

{System.out.println("f3");} }

NO: "method f2 not found in class A"

(compiler)

Page 23: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

public class Test {

public static void main(String a[]) {

new Test();

} cast Test() {

A a;

B b = new B();

a=b;

a.f1();

((B)a).f2();

}

}

class A { void f1()

{System.out.println("f1");} }

class B extends A { void f2()

{System.out.println("f2");} }

class C extends B { void f3()

{System.out.println("f3");} }

OK: downcast corretto

OK: upcast implicito

Page 24: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

public class Test {

public static void main(String a[]) {

new Test();

} cast Test() {

A a;

B b = new B();

a=b;

a.f1();

((C)a).f3();

}

}

class A { void f1()

{System.out.println("f1");} }

class B extends A { void f2()

{System.out.println("f2");} }

class C extends B { void f3()

{System.out.println("f3");} }

NO: downcast illecito (runtime)java.lang.ClassCastException

OK: upcast implicito

Page 25: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Type conversion - cast

Si può applicare cast SOLO all’interno di unagerarchia di ereditarietà

È consigliabile usare l'operatore instanceof per verificare prima effettuare un downcast

if (staff[1] instanceof Manager) { Manager n = (Manager)staff[1];...

}

Page 26: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Input/Output, EccezioniInput da tastiera

Page 27: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Try – catch - finally try {

System.out.println("Dammi un intero");

i=Integer.parseInt(s.readLine());

System.out.println("Hai scritto "+i);

}

catch (Exception e) {e.printStackTrace();}

finally { doSomethingInEveryCase() }

Page 28: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

throws

Ogni frammento di codice che lancia una eccezione DEVE essere contenuto in un blocco try-catch

OPPURE

stare nel corpo di un metodo che “throws” una eccezione

do() throws SomeException {...}

Page 29: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

throw

Le eccezioni possono essere generate dall’istruzione throw.

throw(new SomeException());

Page 30: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Lettura di stringheimport java.io.*;

public class A {

public A() {

BufferedReader s = new BufferedReader(

new InputStreamReader(System.in));

try {

System.out.println("Dammi una stringa");

String str=s.readLine();

System.out.println("Hai scritto "+str);

}catch (IOException e){

e.printStackTrace();

}

}

public static void main(String [] ar) {

A a=new A(); }

}

Dammi una stringaabracadabraHai scritto abracadabra

Page 31: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Lettura di intpublic A() {

int i=0;

BufferedReader s = new BufferedReader(

new InputStreamReader(System.in));

try {

System.out.println("Dammi un intero");

i=Integer.parseInt(s.readLine());

System.out.println("Hai scritto "+i);

}catch (Exception e) {e.printStackTrace();}

}

Dammi un intero2Hai scritto 2

Page 32: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Lettura di intpublic A() {

int i=0;

BufferedReader s = new BufferedReader(

new InputStreamReader(System.in));

try {

System.out.println("Dammi un intero");

i=Integer.parseInt(s.readLine());

System.out.println("Hai scritto "+i);

}catch (IOException e) {e.printStackTrace();}

}Dammi un interopippojava.lang.NumberFormatException: For input string: "gh"at

java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)at java.lang.Integer.parseInt(Integer.java:426)at java.lang.Integer.valueOf(Integer.java:532)at pila.A.<init>(A.java:11)at pila.A.main(A.java:19)

Exception in thread "main"

Page 33: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Lettura di floatpublic A() {

float f=0; boolean error;

BufferedReader s = new BufferedReader(

new InputStreamReader(System.in));

try {

do {

System.out.println("Dammi un float");

try{

error=false;

f=Float.parseFloat(s.readLine());

} catch (NumberFormatException e) {

error=true;

System.out.println("Input non valido");

}

} while (error);

System.out.println("Hai scritto "+f);

}catch (IOException e) {e.printStackTrace();}

}

Dammi un floatpippoInput non validoDammi un float3Hai scritto 3.0

Page 34: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Fondamenti di Java

Introduzione alla costruzione di GUI Pluggable Look & Feel

Page 35: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Pluggable Look&Feel

Page 36: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Scelta del Look&Feelpublic static void main(String[] args) { try { UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception e) { } new SwingApplication(); //Create and show the GUI. }

UIManager.getCrossPlatformLookAndFeelClassName() Returns the Java look and feel.

UIManager.getSystemLookAndFeelClassName() Specifies the look and feel for the current platform.

Page 37: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Scelta del Look&Feelpublic static void main(String[] args) { try { UIManager.setLookAndFeel( "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); } catch (Exception e) { } new SwingApplication(); //Create and show the GUI. }

UIManager.getSystemLookAndFeelClassName(String s) Specifies the look and feel for the platform described by “s”.

Page 38: Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.

Available Look&Feel"com.sun.java.swing.plaf.gtk.GTKLookAndFeel"

Specifies the GTK+ look and feel. Introduced in release 1.4.2.

"javax.swing.plaf.metal.MetalLookAndFeel" Specifies the Java look and feel.

"com.sun.java.swing.plaf.windows.WindowsLookAndFeel" Specifies the Windows look and feel. Currently, you can use this look and feel only on Microsoft Windows systems.

"com.sun.java.swing.plaf.motif.MotifLookAndFeel" Specifies the CDE/Motif look and feel. This look and feel can be used on any platform.