package microsoft; class Point { Point(int x, int y) { ... } .... }e un'altra della sun:
package sun; class Point { Point(int x, int y) { ... } .... }Adesso si possono usare i due tipi di Point nello stesso programma:
microsoft.Point pt1 = new microsoft.Point(3,4); sun.Point pt2 = new sun.Point(4,5);I package possono essere più strutturati usando i .
package microsoft.geometry; class Point { Point(int x, int y) { ... } .... }
package sun.geometry; class Point { Point(int x, int y) { ... } .... }e adesso abbiamo:
microsoft.geometry.Point pt1 = new microsoft.geometry.Point(3,4); sun.geometry.Point pt2 = new sun.geometry.Point(4,5);
una class senza package appartiene
al package anonimo.
class Line { sun.geometry.Point pt1,pt2; Line (sun.geometry.Point p, sun.geometry.Point q) { pt1=p; pt2=q; } }La parola chiave import permette di usarlo di maniera trasparente:
import sun.geometry.Point; class Line { Point pt1,pt2; Line (Point p, Point q) { pt1=p; pt2=q; } }Si può usare la notazione * per importare tutte le class di un package:
import sun.geometry.*; class Line { Point pt1,pt2; Line (Point p, Point q) { pt1=p; pt2=q; } }
non si può fare import sun.*.*;
package foo; class A { ... } public class B { ... }La class B è pubblica, dunque questo è valido:
package bar; import foo.*; class C { B x; }La class A non è pubblica, dunque questo non è valido:
package bar; import foo.*; class C { A x; }
package foo; public class A { int x; }Questo è valido:
package foo; class B extends A { B(int x) { this.x = x; } }Questo non lo è:
package bar; import foo.*; class B extends A { B(int x) { this.x = x; } }
package foo; public class A { public int x; }Adesso, questo va bene:
package bar; import foo.*; class B extends A { B(int x) { this.x = x; } }
package foo; public class A { private int x; A(int x) { this.x = x; } }Adesso questo non è valido:
package foo; public class B extends A { B(int x) { this.x = x; } }
package foo; class A { private int x; int method(A a) { return a.x; } }
Con
package foo; public class A { protected int x; }Questo va bene:
package bar; import foo.*; class B extends A { B(int x) { this.x = x; } }Ma questo non va bene:
package bar; import foo.*; class B { int method(A a) { return a.x; } }Ma questo va bene:
package bar; import foo.*; class B extends A { B(int x) { this.x = x; } int method (B a) { return a.x; } }
package foo; import bar.*; class A { int method (B a) { return a.x; } }
package bar; import foo.*; class B extends A { protected int x; }
Con:
class A { protected int method() { return 1; } }Questo è valido:
class B extends A { public int method() { return 2; } }Questo non lo è:
class B extends A { private int method() { return 2; } }
class A { int x; } class B extends A { int x; }Un oggetto di tipo B risulterà con due campi diversi this.x e ((A)this).x.
Per questo è sempre meglio dichiarare i campi privati e creare metodi per accedervi:
class A { private int x; void setX(int x) { this.x = x ; } int getX() { return x ; } }
E2*. Riscrivere List, Cons, Nil dall'esercizio D6 in tale mode che queste classi appartengo al package util e che di fuori del package si possono creare solamente liste ordinate, i.e. liste costruite usando solamente i metodi makeEmpty e add.