next up previous contents
Siguiente: 9 Gestión de excepciones Subir: Introducción a Java y Anterior: 7 Herencia   Índice General

Subsecciones

8 Paquetes e Interfaces

1 Paquetes

Un paquete es un contenedor de clases, que se usa para mantener el espacio de nombres de clase, dividido en compartimentos.

1 Definición de un paquete

Incluiremos la siguiente sentencia como primera sentencia del archivo fuente .java
package nombre-paquete

2 La variable de entorno CLASSPATH

Supongamos que construimos la clase PaquetePrueba perteneciente al paquete prueba, dentro del fichero PaquetePrueba.java (directorio prueba)

3 Ejemplo de paquete: P25/MyPack

package MyPack;

class Balance {
  String name;
  double bal;

  Balance(String n, double b) {
    name = n;
    bal = b;
  }
  void show() {
    if(bal<0)
      System.out.print("-->> ");
    System.out.println(name + ": $" + bal);
  }
}

class AccountBalance {
  public static void main(String args[]) {
    Balance current[] = new Balance[3];

    current[0] = new Balance("K. J. Fielding", 123.23);
    current[1] = new Balance("Will Tell", 157.02);
    current[2] = new Balance("Tom Jackson", -12.33);
    for(int i=0; i<3; i++) current[i].show();
  }
}

2 Protección de acceso

Las clases y los paquetes son dos medios de encapsular y contener el espacio de nombres y el ámbito de las variables y métodos.

1 Tipos de acceso a miembros de una clase

Desde método en ... private sin modif. protected public
misma clase
subclase del mismo paquete no
no subclase del mismo paquete no
subclase de diferente paquete no no
no subclase de diferente paquete no no no

2 Tipos de acceso para una clase

Ejemplo: P26 Ejemplo: P26

package p1;
public class Protection {
  int n = 1;
  private int n_pri = 2;
  protected int n_pro = 3;
  public int n_pub = 4;
  public Protection() {
    System.out.println("constructor base ");
    System.out.println("n = " + n);
    System.out.println("n_pri = " + n_pri);
    System.out.println("n_pro = " + n_pro);
    System.out.println("n_pub = " + n_pub);
  }
}
class Derived extends Protection {
  Derived() {
    System.out.println("constructor de Derived");
    System.out.println("n = " + n);
//  System.out.println("n_pri = " + n_pri);
    System.out.println("n_pro = " + n_pro);
    System.out.println("n_pub = " + n_pub);
  }
}
class SamePackage {
  SamePackage() {
    Protection p = new Protection();
    System.out.println("constructor de SamePackage");
    System.out.println("n = " + p.n);
//  System.out.println("n_pri = " + p.n_pri);
    System.out.println("n_pro = " + p.n_pro);
    System.out.println("n_pub = " + p.n_pub);
  }
}
package p2;

class Protection2 extends p1.Protection {
  Protection2() {
    System.out.println("constructor de Protection2");
//  System.out.println("n = " + n);
//  System.out.println("n_pri = " + n_pri);
    System.out.println("n_pro = " + n_pro);
    System.out.println("n_pub = " + n_pub);
  }
}
class OtherPackage {
  OtherPackage() {
    p1.Protection p = new p1.Protection();
    System.out.println("other package constructor");
//  System.out.println("n = " + p.n);
//  System.out.println("n_pri = " + p.n_pri);
//  System.out.println("n_pro = " + p.n_pro);
    System.out.println("n_pub = " + p.n_pub);
  }
}

3 Importar paquetes

Todas las clases estándar de Java están almacenadas en algún paquete con nombre. Para usar una de esas clases debemos usar su nombre completo. Por ejemplo para la clase Date usaríamos java.util.Date. Otra posibilidad es usar la sentencia import.

Ejemplo: P27
MyPack/Balance.java

package MyPack;
/* La clase Balance, su constructor, y su metodo show()
   deben ser públicos. Esto significa que pueden ser utilizados por
   código que no sea una subclase y esté fuera de su paquete.
*/
public class Balance {
  String name;
  double bal;
  public Balance(String n, double b) {
    name = n;
    bal = b;
  }

  public void show() {
    if(bal<0)
      System.out.print("-->> ");
    System.out.println(name + ": $" + bal);
  }
}

TestBalance.java

import MyPack.*;
class TestBalance {
  public static void main(String args[]) {
    /* Como Balance es pública, se puede utilizar la
       clase Balance y llamar a su constructor. */
    Balance test = new Balance("J. J. Jaspers", 99.88);
    test.show(); // también se puede llamar al metodo show()
  }
}

4 Interfaces

Son sintácticamente como las clases, pero no tienen variables de instancia y los métodos declarados no contienen cuerpo.

1 Definición de una interfaz

Una interfaz se define casi igual que una clase:

acceso interface nombre {
  tipo_devuelto método1(lista_de_parámetros);
  tipo_devuelto método2(lista_de_parámetros);
  tipo var_final1=valor;
  tipo var_final2=valor;
// ...
  tipo_devuelto métodoN(lista_de_parámetros);
  tipo var_finalN=valor;
}

Ejemplo definición de interfaz

interface Callback {
  void callback(int param);
}

2 Implementación de una interfaz

Ejemplo de uso de interfaces: P28

class Client implements Callback {
  public void callback(int p) {
    System.out.println("callback llamado con " + p);
  }
  void nonIfaceMeth() {
    System.out.println("Las clases que implementan interfaces " +
                       "además pueden definir otros miembros.");
  }
}
class TestIface {
  public static void main(String args[]) {
    Callback c = new Client();
    c.callback(42);
  }
}

3 Acceso a implementaciones a través de referencias de la interfaz

Ejemplo

class TestIface {
  public static void main(String args[]) {
    Callback c = new Client();
    c.callback(42);
  }
}

Otro ejemplo: P29

// Otra implementación de  Callback.
class AnotherClient implements Callback {
  public void callback(int p) {
    System.out.println("Otra versión de callback");
    System.out.println("El cuadrado de p es " + (p*p));
  }
}

class TestIface2 {
  public static void main(String args[]) {
    Callback c = new Client();
    AnotherClient ob = new AnotherClient();
    c.callback(42);
    c = ob; // c hace referencia a un objeto AnotherClient
    c.callback(42);
  }
}

4 Implementación parcial

5 Variables en interfaces

Ejemplo: P30/AskMe.java

import java.util.Random;
interface SharedConstants {
  int NO = 0;
  int YES = 1;
  int MAYBE = 2;
  int LATER = 3;
  int SOON = 4;
  int NEVER = 5;
}
class Question implements SharedConstants {
  Random rand = new Random();
  int ask() {
    int prob = (int) (100 * rand.nextDouble());
    if (prob < 30) return NO;         // 30%
    else if (prob < 60) return YES;   // 30%
    else if (prob < 75) return LATER; // 15%
    else if (prob < 98) return SOON;  // 13%
    else return NEVER;                // 2%
  }
}

class AskMe implements SharedConstants {
  static void answer(int result) {
    switch(result) {
      case NO:
        System.out.println("No"); break;
      case YES:
        System.out.println("Si"); break;
      case MAYBE:
        System.out.println("Puede ser"); break;
      case LATER:
        System.out.println("Mas tarde"); break;
      case SOON:
        System.out.println("Pronto"); break;
      case NEVER:
        System.out.println("Nunca"); break;
    }
  }
  public static void main(String args[]) {
    Question q = new Question();
    answer(q.ask());
    answer(q.ask());
    answer(q.ask());
    answer(q.ask());
  }
}

6 Las interfaces se pueden extender

Ejemplo: P31/IFExtend.java

interface A {
  void meth1();
  void meth2();
}
interface B extends A {
  void meth3();
}
class MyClass implements B {
  public void meth1() {
    System.out.println("Implemento meth1().");
  }
  public void meth2() {
    System.out.println("Implemento meth2().");
  }
  public void meth3() {
    System.out.println("Implemento meth3().");
  }
}
class IFExtend {
  public static void main(String arg[]) {
    MyClass ob = new MyClass();
    ob.meth1();
    ob.meth2();
    ob.meth3();
  }
}


next up previous contents
Siguiente: 9 Gestión de excepciones Subir: Introducción a Java y Anterior: 7 Herencia   Índice General
Andres Cano Utrera 2006-09-23