Encapsulamiento de Clases

Definición previa: un paquete es una colección de clases que se encuentran en el mismo directorio.

Las clases permiten implementar tipos de datos abstractos. El problema que se presenta es que desde cualquier clase se puede accesar los campos de un objeto perteneciente a otra clase. Esto es una violación al principio de abstracción que dice que un tipo de datos abstracto sólo puede ser manipulado a través de las operaciones que se definen para éste.

Visibilidad de Campos y Métodos

En java al definir una clase se puede controlar la visibilidad que tendrán sus campos y métodos al exterior de la clase. Este control se efectúa de la siguiente forma:

class A
{
  private int privx;
  protected int protb;
  public int pubc;
  int paqd;

  private void MetPriv() { ... }
  protected void MetProt() { ... }
  public void MetPub(A a)
  {
  // Un campo siempre es visible
  // en la clase en donde se define
    ... privx ... a.privx ...
    ... protb ... a.protb ...
    ... pubc  ... a.pubc ...
  // Un método siempre es visible
  // en la clase en donde se define
    MetPriv(); a.MetPriv();
  }
  void MetPaq() { ... }
}
Las palabras private, protected y public son atributos de un campo o un método y su significado es el siguiente: Ejemplo:
class B
{
  public void MetB()
  {
    A a= new A();
    a.pubc= 1;   // Ok
    a.priva= 2;  // error, privado
    a.protb= 3;  // error, B no es
                 // subclase de A

    a.MetPub();  // Ok
    a.MetPriv(); // error, privado
  }
}

Visibilidad de Clases

Al declarar una clase se puede especificar que es pública usando el atributo public. De este modo la clase podrá ser usada por cualquier otra clase. Si la clase no es pública entonces la clase sólo puede ser usada dentro del paquete que la contiene.

public class Box extends GraphObj { ... }
Podemos hacer un resumen de los atributos que pueden tener campos, métodos o clases: Sólo se puede especificar uno de los atributos puestos en la misma llave.


El nombre de archivo

Un archivo puede contener a lo más una clase pública, en cuyo caso el nombre del archivo debe ser el mismo de la clase pública, más la extensión .java. El resto de las clases del archivo sólo serán visibles dentro del paquete. Es usual que los archivos contengan una sola clase, pero también a veces se agregan otras clases al archivo cuando éstas son usadas sólo dentro de ese mismo archivo.