Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti...
-
Upload
crocifisso-orlando -
Category
Documents
-
view
219 -
download
0
Transcript of Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti...
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.
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
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
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
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
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
Sezione: Packages
Packages
package
Una collezione di classi correlate
package myclasses;
class A {...};
class B {...};
import myclasses.A;
import myclasses.*;
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)
Annidamento di package
I packages si riflettono in una struttura di directories
myclasses
A.class B.class veryUsefulClasses
C.class
Sezione: Costruttori
Costruttori
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();
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) { ...}
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); }
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); }
Sezione: Modificatori
Abstract e Controllo di accesso
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
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”:
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
Sezione: Upcast - downcast
Upcast & downcast
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)
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)
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
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
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];...
}
Input/Output, EccezioniInput da tastiera
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() }
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 {...}
throw
Le eccezioni possono essere generate dall’istruzione throw.
throw(new SomeException());
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
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
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"
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
Fondamenti di Java
Introduzione alla costruzione di GUI Pluggable Look & Feel
Pluggable Look&Feel
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.
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”.
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.