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.
38
Embed
Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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); }}
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)
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.