You are on page 1of 12

Fundamentos de Programacin II Semestre 2016

Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:


2IF111

CLASES
INTRODUCCIN
Hasta este momento hemos utilizado las clases como forma de realizar
nuestros programas Java. Tambin se han examinado mtodos que sirven para
realizar acciones determinadas a las que se les asigna un nombre. Ahora
trataremos las clases como un nuevo tipo de dato cuyas variables sern
referencias a objetos. Una clase es un tipo de dato que contiene cdigo
(mtodos) y datos. Una clase permite encapsular todo el cdigo y los datos
necesarios para gestionar un tipo especfico de un elemento de programa.
Qu son las clases?
Las clases son estructuras o plantillas que sirven para definir un objeto. En una
clase Java, se pueden utilizar datos para describir propiedades y mtodos
que definen su comportamiento. Una clase de un objeto contiene una
coleccin de mtodos y definiciones de datos. Si se disea una clase que
representa a un cliente, no se ha creado un objeto. Un objeto es una
instancia de la clase Cliente y, por consiguiente, puede, naturalmente, haber
muchos objetos de la clase Cliente. La creacin de una variable especfica de
un tipo particular de clase se conoce como instanciacin (creacin de
instancias) de esa clase.
Una clase describe la constitucin de un objeto y sirve como plantilla para
construir objetos, especificando la interfaz pblica de un objeto. Una clase
tiene un nombre y especifica los miembros que pertenecen a la clase, que
pueden ser campos (datos) y mtodos (procedimientos). Una vez que se
define una clase, el nombre de la clase se convierte en un nuevo tipo de dato y
se utiliza para:
Declarar variables de ese tipo
Crear objetos de ese tipo

DEFINICIN DE UNA CLASE


Antes de que un programa pueda crear objetos de cualquier clase, la clase
debe ser definida. La definicin de una clase significa que se debe dar a la
misma un nombre, darle nombre a los elementos que almacenan sus datos y
describir los mtodos que realizarn las acciones consideradas en los objetos.
Las definiciones o especificaciones no son cdigo de programa ejecutable.
Se utilizan para asignar almacenamiento a los valores de los atributos usados
por el programa y reconocer los mtodos que utilizar el programa.

Cecilia G. de Beitia

Pgina 25

Fundamentos de Programacin II Semestre 2016


Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:
2IF111

Formato

Los elementos que estn encerrados entre corchetes son opcionales y se


describen as:
public: significa que puede ser usada por cualquier clase en cualquier
paquete. Si no lo es, solamente puede ser utilizada por clases del mismo
paquete.
final: es aquella que no puede tener clases que la hereden. Esto se utiliza
bsicamente por razones de seguridad (para que una clase no pueda ser
reemplazada por otra que la herede), o por diseo de la aplicacin.
abstract: es una clase que puede tener herederas, pero no puede ser
instanciada.
Es, literalmente, abstracta (como la clase Number definida en
java.lang). Para qu sirve? Para modelar conceptos. Por ejemplo, la clase
Number es una clase abstracta que representa cualquier tipo de nmeros (y
sus mtodos no estn implementados: son abstractos); las clases
descendientes de sta, como Integer o Float, s implementan los mtodos de la
madre Number, y se pueden instanciar.
Por lo dicho, una clase no puede ser final y abstract a la vez (ya que la clase
abstract requiere descendientes) extends
La instruccin extends indica de qu clase desciende la nuestra. Si se omite,
Java asume que desciende de la superclase Object.
Cuando una clase desciende de otra, esto significa que hereda sus atributos y
sus mtodos (es decir que, a menos que los redefinamos, sus mtodos son los
mismos que los de la clase madre y pueden utilizarse en forma transparente, a
menos que sean privados en la clase madre o, para subclases de otros
paquetes, protegidos o propios del paquete).
Cecilia G. de Beitia

Pgina 26

Fundamentos de Programacin II Semestre 2016


Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:
2IF111

implements
Una interface es una clase que declara sus mtodos pero no los implementa;
cuando una clase implementa una o ms interfaces, debe contener la
implementacin de todos los mtodos (con las mismas listas de parmetros) de
dichas interfaces.
Esto sirve para dar un ascendiente comn a varias clases, obligndolas a
implementar los mismos mtodos y, por lo tanto, a comportarse de forma
similar en cuanto a su interface con otras clases y subclases. interface
Una interface, como se dijo, es una clase que no implementa sus mtodos sino
que deja a cargo la implementacin a otras clases. Las interfaces pueden,
asimismo, descender de otras interfaces pero no de otras clases.
Todos sus mtodos son por definicin abstractos y sus atributos son finales
(aunque esto no se indica en el cuerpo de la interface).
Son tiles para generar relaciones entre clases que de otro modo no estn
relacionadas (haciendo que implementen los mismos mtodos), o para
distribuir paquetes de clases indicando la estructura de la interface pero no las
clases individuales (objetos annimos).
Si bien diferentes clases pueden implementar las mismas interfaces, y a la vez
descender de otras clases, esto no es en realidad herencia mltiple ya que una
clase no puede heredar atributos ni mtodos de una interface; y las clases que
implementan una interface pueden no estar ni siquiera relacionadas entre s.
Ejemplo: Definicin de una clase llamada Punto que contiene las coordenadas
x, y de un punto en un plano.
class Punto
{
private int x;
// coordenada x
private int y;
// coordenada y
public Punto(int x_, int y_) // constructor
{
x=
x_;
y=
y_;
}
public Punto()
{
x = y = 0;
}
public int leerX()
{
Cecilia G. de Beitia

// Constructor sin argumentos

// devuelve el valor de x
Pgina 27

Fundamentos de Programacin II Semestre 2016


Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:
2IF111
return x;
}
public int leerY()
{
return y;
}

// devuelve el valor de y

void fijarX(int valorX)


{
x= valorX;
}

// establece el valor de x

void fijary(int valorY)


{
y= valorY;
}
}

// establece el valor de y

La definicin de una clase no reserva espacio de memoria. El almacenamiento


se asigna cuando se crea un objeto de una clase (instancia de una clase).

Objetos de clases
Una vez que una clase ha sido definida, un programa puede contener una
instancia de la clase, denominada un objeto de la clase. Un objeto se crea
con el operador new aplicado a un constructor de la clase. As, un objeto de la
clase Punto: new Punto(2,1);
se ha creado un objeto inicializando a las
coordenadas (2,1).
El operador new crea el objeto y devuelve una referencia al objeto creado.Esta
referencia se asigna a una variable del tipo de la clase. El objeto permanecer
vivo siempre que est referenciado por una variable de la clase que es
instancia. Por ejemplo: Punto p = new Punto(2,1);

Formato para definir una referencia:


NombreClase varReferencia;
Formato
para
crear
un
objeto:
NombreClase([argumentos_constructor]);

varReferencia

new

Toda clase tiene uno o ms mtodos para inicializar el objeto cuando es creado,
son los constructores; stos tienen el mismo nombre que el de la clase, no
tienen tipo de retorno y pueden estar sobrecargados.
El operador de acceso a un miembro (.) selecciona un miembro individual de
un objeto de la clase. Las siguientes sentencias, por ejemplo, crean un objeto
Punto, asignan su referencia a p, que fija su coordenada x adems visualiza su
coordenada x.
Cecilia G. de Beitia

Pgina 28

Fundamentos de Programacin II Semestre 2016


Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:
2IF111
Punto p; p=
new Punto();
p.fijarX(100)
;
System.out.println(Coordenada x es +
p.leerX());
El operador de acceso (.), se utiliza con los nombres de los mtodos y
variables instancia para especificar que son miembros de un objeto.
En Java, es posible crear dos o ms referencias a objetos con la misma clase.
Por ejemplo: el siguiente cdigo crea dos objetos Punto y sus referencias se
asignan a p y p1, respectivamente; a continuacin, la referencia p es asignada
a p1, con lo que tanto p como p1 referencian al mismo objeto, y el objeto
originalmente apuntado por o referenciado por p1 se libera:
Punto p = new Punto(1,
-1);
// . . .
Punto p1 = new Punto(2,
-3); p1 = p;

Acceso a miembros de la clase: Encapsulamiento


Un principio fundamental en programacin orientada a objetos es la
ocultacin de la informacin, que significa que a determinados datos del
interior de una clase no se puede acceder por mtodos externos a la clase. El
mecanismo principal para ocultar datos es ponerlos en una clase y hacerlos
privados. A los datos o mtodos privados slo se puede acceder desde dentro
de la clase.
Por el contrario, los datos o mtodos pblicos son accesibles desde el exterior
de la clase.

Se utilizan diferentes especificadores de acceso para controlar el acceso a


los miembros de la clase, son public, private y protected. Cada miembro de
la clase est precedido del especificador de acceso que le corresponde. Se
utiliza el formato general siguiente en definiciones de la clase, situando
Cecilia G. de Beitia

Pgina 29

Fundamentos de Programacin II Semestre 2016


Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:
2IF111
primero las variables instancia, seguidas por los mtodos (este orden no es
obligatorio).

Formato
class NombreClase
{
private declaracin miembro privado;
// miembros
privados
protected declaracin miembro protegido; //
miembros protegidos
public declaracin miembro pblico;
// miembros pblicos
}
Modificadores de acceso
Modificado
r

Clase

Mtod
o

Datos

Comentario

(por
defecto)

Una clase, mtodo o dato es visible en este


paquete

public

Una clase, mtodo o dato es visible a todos


los programas de cualquier paquete

private

Un mtodo o dato es slo visible en esta


clase

protected

Un mtodo o dato es visible en este


paquete y en las subclases de esta clase

Notas:
1. Un modificador que se puede aplicar a una clase se llama modificador de
clase. Un modificador que se aplica a un mtodo se llama modificador de
mtodo. Un modificador que se puede aplicar a un campo dato se llama
modificador de datos.
2. El modificador private slo se aplica a variables o a mtodos. Si public o
private no se utilizar, por defecto, las clases, mtodos y datos son accesibles
por cualquier clase del mismo paquete.

Private
El nivel de acceso ms restrictivo es private. Un miembro privado slo es
accesible en la clase en que est definido. Se utiliza este nivel de acceso para
declarar los miembros que se deben utilizar slo en la clase. En realidad
define los mtodos y los datos a los que slo se puede acceder dentro de la
clase en que estn definidos, pero no por las subclases.
Cecilia G. de Beitia

Pgina 30

Fundamentos de Programacin II Semestre 2016


Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:
2IF111
El objetivo de private es proteger la informacin contenida en variables para
evitar que al ser accedido por un extrao pongan al objeto en estado
inconsistente o bien para proteger a mtodos que si se invocan desde el
exterior puedan cambiar el estado del objeto o el programa en que se est
ejecutando. De hecho, los miembros privados son como secretos que no se
difunden a extraos.
Para declarar un miembro privado, se utiliza la palabra reservada private en
su declaracin. La clase DemoPrivado contiene dos miembros privados: una
variable y un mtodo.
class DemoPrivado
{
private int datoPrivado;
private void
metodoPrivado()
{
System.out.println ("Es un mtodo privado");
}
}

Funcionamiento
1. El cdigo del interior de la clase DemoPrivado puede inspeccionar o modificar
la variable datoPrivado y puede invocar al mtodo metodoPrivado, pero no
lo puede hacer ningn cdigo perteneciente a otra clase.
2. Otra clase externa, ExternaDemo, no puede acceder a los miembros de
DemoPrivado.
class ExternaDemo
{
void metodoAcceso()
{
DemoPrivado d = new DemoPrivado();
d.datoPrivado = 100;
// No legal
d.metodoPrivado();
// No legal
}
}

3. Cuando una clase intenta acceder a una variable a la que no tiene acceso el
compilador imprime un mensaje de error similar al siguiente:
D:\IISemestre2011\JAVA\ExternaDemo.java:6: datoPrivado has private access in
DemoPrivado
d.datoPrivado = 100; // No legal
^
D:\IISemestre2011\JAVA\ ExternaDemo.java:7: metodoPrivado() has private access in
DemoPrivado
d.metodoPrivado();
// No legal
^
2 errors

Cecilia G. de Beitia

Pgina 31

Fundamentos de Programacin II Semestre 2016


Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:
2IF111

protected
El especificador protected permite que la propia clase, las subclases y las
clases del mismo paquete, accedan a los miembros. Los miembros protegidos
son como los secretos familiares compartidos por familiares, e incluso por
amigos, pero no por extraos. Los miembros protegidos se declaran con la
palabra reservada protected. Consideremos la clase DemoProtegido que se
declara dentro de un paquete denominado Demo y que tiene una variable y un
mtodo protegidos.
package demo;
public class DemoProtegido
{
protected int datoProtegido;
protected void metodoProtegido()
{
System.out.println ("Es un mtodo protegido");
}
}

Funcionamiento
1. La clase OtraDemo es del paquete demo, pero no es subclase de
DemoProtegido. La clase OtraDemo puede acceder legalmente a
la variable datoProtegido e invocar al mtodo metodoProtegido:
package demo;
public class
OtraDemo
{
void metodoAcceso()
{
DemoProtegido d = new DemoProtegido();
d.datoProtegido = 100;
// legal
d.metodoProtegido();
// legal
}
}

No se producen errores en la compilacin.


2. Si OtraDemo fuera una subclase de DemoProtegido este cdigo sera
tambin legal, ya que la clase est en el mismo paquete que DemoProtegido.
3. Las subclases externas del paquete de la superclase tambin tienen acceso a
los miembros protegidos pero a travs de una referencia al objeto:
package demoBis; import
demo.DemoProtegido; class
Nueva extends
DemoProtegido
{
Cecilia G. de Beitia

Pgina 32

Fundamentos de Programacin II Semestre 2016


Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:
2IF111
void metodoAcceso (DemoProtegido d, Nueva n)
{
d.datoProtegido = 100; // no legal
n.datoProtegido = 100; // legal
d.metodoProtegido(); // no legal
n.metodoProtegido(); // legal
}
}

Se puede acceder a los miembros protegidos a travs de un objeto de la


clase Nueva, pero no a travs de un objeto de la clase DemoProtegido
que no sera vlido. Al compilar el programa se producen los siguientes
errores:
D:\IISemestre2011\JAVA\Nueva.java:7: datoProtegido has
access in demo.DemoProtegido
d.datoProtegido = 100; // no legal
^
D:\IISemestre2011\JAVA\Nueva.java:9: metodoProtegido()
protected
access in demo.DemoProtegido
d.metodoProtegido(); // no legal
^
2 errors

protected

has

public
El especificador de acceso public es aquel que define las clases, mtodos y
datos de modo tal que todos los programas pueden acceder a ellos. Los
miembros se declaran pblicos slo si este acceso no puede producir
resultados no deseables si un extrao a ellos lo utiliza. Se declara a un
miembro pblico utilizando la palabra reservada public. Por ejemplo:
package Negocios;
public class ENegocios
{
public int cantidad;
void operar()
{
System.out.println ("Es un mtodo pblico");
}
}

CONSTRUCTORES
Un constructor es un mtodo miembro de propsito especfico que s ejecuta
automticamente cuando se crea un objeto de una clase. Un constructor sirve
para inicializar los miembros dato o variables instancia de una clase.

Cecilia G. de Beitia

Pgina 33

Fundamentos de Programacin II Semestre 2016


Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:
2IF111

Reglas
1. El constructor tiene el mismo nombre de la clase
2. Puede tener cero o ms parmetros
3. Cuando se define un constructor no se puede especificar un valor de retorno, ni
incluso void (un constructor nunca devuelve un valor).
La clase Rectangulo tiene un constructor con cuatro (4) parmetros:
public class Rectangulo
{
private int izdo;
private int superior;
private int dcha;
private int inferior;
// Constructor
public Rectangulo(int iz, int sr, int d, int inf)
{
izdo = iz;
superior = sr;
dcha = d;
inferior = inf;
}
// Definiciones de otros mtodos miembro
}

Cuando se define un objeto, se aplica el operador new al constructor que se


desee, si tiene parmetros se pasan los valores de los parmetros al
constructor utilizando una sintaxis similar a una llamada normal del mtodo:
Rectangulo objRect = new Rectangulo(25,25,75,75);

Esta definicin crea una instancia del objeto Rectangulo, invoca al constructor
de la clase pasndole los parmetros con valores especificados para
inicializarlo y la referencia al objeto se asigna a objRect.

Constructor por defecto


Un constructor que no tiene parmetros se llama constructor por defecto.
Un constructor por defecto normalmente inicializa los miembros dato
asignndoles valores por defecto. En la clase Punto, se inicializa x,y en cero.
public class Punto
{
private int x;
private int y;
public Punto() // Constructor por defecto
{
x=0;
y=0;
}
}
Cecilia G. de Beitia

Pgina 34

Fundamentos de Programacin II Semestre 2016


Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:
2IF111
Cuando se crea un objeto Punto, sus miembros dato se inicializan a cero (0).
Punto p1 = new Punto(); // p1.x = 0, p1.y = 0

O bien dentro de un mtodo


void funcDemoConstructorD()
{
Punto pt;
pt = new Punto(); // Llamada al constructor
}

Regla: Java crea automticamente un constructor por defecto cuando no


existen otros constructores. Tal constructor inicializa las variables instancia de
tipo numrico (int, float . . .) a cero, las variables de tipo boolean a false y las
referencias a null.
En el siguiente ejemplo se define la clase Ventaja, no tiene definido un
constructor.
public class Ventaja
{
private int x;
private double r;
String h;
protected Punto p;
// mtodos de clase
}

al crear un objeto: Ventaja objV = new Ventaja(); las variables x, r se inicializan a


cero (0) y las referencias h, p a null.
Es importante sealar que se debe tener cuidado con la escritura de una clase
con slo un constructor con argumentos.
En ese caso si se omite un
constructor sin parmetros no ser posible utilizar el constructor por defecto.
Si recordamos la clase Rectangulo que slo tiene un constructor con cuatro
(4) parmetros, no sera posible crear: Rectangulo objetoRect = new Rectangulo();
Constructores sobrecargados
Al igual que se puede sobrecargar un mtodo de una clase, se puede tambin
sobrecargar el constructor de la clase, ya que es otro mtodo, aunque con
caractersticas especiales. De hecho los constructores sobrecargados son
bastante frecuentes; proporcionan medios alternativos para inicializar objetos
nuevos de una clase.
Un constructor se ejecuta slo cuando se crea un objeto, con independencia de
cuntos constructores hayan sido definidos.
En el siguiente ejemplo la clase EquipoSonido se define con tres
constructores; un constructor por defecto, otro con un argumento de tipo
cadena y el tercero con tres argumentos.
Cecilia G. de Beitia

Pgina 35

Fundamentos de Programacin II Semestre 2016


Carrera: Licenciatura en Ingeniera de Sistemas de Informacin - Grupo:
2IF111
public class EquipoSonido
{
private int potencia;
private int voltios;
private int numCd;
private String marca;
public EquipoSonido()
// Constructor por defecto
{
marca = "Sin marca";
System.out.println ("Constructor por defecto");
}
public EquipoSonido(String mt)
{
marca = mt;
System.out.println ("Constructor con argumento cadena");
}
public EquipoSonido(String mt, int p, int v)
{
marca = mt;
potencia = p;
voltios
= v;
numCd = 20;
System.out.println ("Constructor con tres argumentos");
}
public double factura()
{
...
}
}

La instanciacin o creacin de un objeto EquipoSonido puede hacerse


llamando a cualquier constructor:
EquipoSonido rt, gt, ht;
// define tres
referencias
rt = new EquipoSonido(); // Llamada al
constructor por defecto
gt = new
EquipoSonido("AAAAAAAA");
ht = new
EquipoSonido("BBBBBBBB", 35, 220);

Cecilia G. de Beitia

Pgina 36