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.
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:
Las palabras private, protected y public son atributos de un campo o un método y su significado es el siguiente: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() { ... } }
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 } }
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.
Podemos hacer un resumen de los atributos que pueden tener campos, métodos o clases:public class Box extends GraphObj { ... }