Unidad II. Clases y Objetos
Programación Orientada a Objetos
II. Clases y Objetos. 2.1 Declaración de Clases La declaración de una clase consta de dos partes claramente diferenciadas: cabecera y cuerpo. La cabecera nos dará cuenta de los distintos aspectos que deberán ser tenidos en cuenta para el manejo de esta clase, mientras que el cuerpo de la clase se reserva para la declaración de los atributos y métodos que serán capaces de ejecutar los objetos generados a partir de esa clase. cl ase. Clase { Atributos Métodos }
Cabecera Cuerpo de clase
La sintaxis general de la declaración de una clase es la siguiente: [modificador] class NombreClase [extends NombreSuperclase][implements listaDeInterfaces]¨ { }
Todo lo que en la sintaxis de la declaración se ha especificado dentro de corchetes, es opcional. Por lo t anto la declaración mínima para una clase es : class NombreClase { } Los atributos de una clase sirven para almacenar datos de los objetos que se instancian a partir de esa clase. La sintaxis general es la siguiente: [ModificadorDeAtributo] [ModificadorDeAtribu to] tipo nombreAtributo; Modificadores de atributo: Un atributo puede tener más de un modificador y en caso de ser así, estos se especificarán uno detrás de otro, separados mediante un espacio en blanco. • static : Los Atributos pueden ser ser de instancia/objeto instancia/objeto o de clase. Los atributos de objeto son variables u objetos que almacenan valores distintos para objetos instanciados a partir de esa clase. Los atributos de clase son variables u objetos que almacenan el mismo valor para todos los objetos instanciados a partir de esa clase. Estos de definen con la palabra static. • final: La palabra reservada final , calificando a un atributo o variable sirve para declarar
static, se puede acceder a dicha constante simplemente anteponiendo el nombre constantes. Si además es static, de la clase, sin necesidad de instanciar la clase creando un objeto de la misma.
El valor de un atributo final debe ser asignado en la declaración del mismo.
Ejemplo: class Circulo { static final double PI=3.14159265;
1 Instituto Tecnológico de Toluca
Lic. Alma Patricia Vásquez Glez.
Unidad II. Clases y Objetos
Programación Orientada a Objetos
private double radio; /* Declaración de Método*/ }
2.2 Instanciación de una clase Un objeto es una instancia de una clase, por lo que los términos objeto o instancia, son indistintos. Un objeto se declara al definir su tipo de dato (Clase) y se crea o instancia, al reservar su espacio en memoria (new). Declaración de objeto:
Nombre_de_clase Nombre_de_objeto;
Creación de objeto:
Nombre_de_objeto = new Nombre_de_clase();
Declaración y Creación:
Nombre_de_clase Nombre_de_objeto = new Nombre_de_clase();
2.3 Referencia al Objeto actual o Auto referencia this Para que un método conozca la identidad del objeto particular para el que ha sido invocado Java proporciona una referencia al objeto denominada this. La referencia al objeto puede ser explícita o implícita.
Referencia al objeto con this de manera implícita public void asigna (int valor) { v=valor; }
Referencia al objeto con this de forma explícita public void asigna (int valor) { this.v=valor; } Un uso común de this es cuando se usa el mismo nombre para un atributo y un parámetro, como ejemplo:
public void asigna (int v) { this.v=v; }
2.4 Métodos Los métodos son funciones que determinan el comportamiento de los objetos. Se declaran y definen dentro de una clase por lo que cualquier objeto de esa clase tendrá disponibles a esos métodos. Los métodos se pueden clasificar en tres grupos:
2 Instituto Tecnológico de Toluca
Lic. Alma Patricia Vásquez Glez.
Unidad II. Clases y Objetos
Programación Orientada a Objetos
a) Métodos de consulta: Sirven para extraer información de los objetos. b) Métodos modificadores: Sirven para cambiar uno o varios valores de los atributos de los objetos. c) Métodos de cálculo: Son los que manipulan los atributos de los objetos.
Definición y declaración de métodos Un método está compuesto por dos partes que forman su definición; la cabecera y el cuerpo. Sintaxis de definición: // Cabecera Modificador_de_Acceso tipo_de_dato nombre _método (lista de parámetros) Excepciones { //Cuerpo del método Sentencias; } La cabecera está definida por: 1) Modificador de acceso al método. 2) Tipo de dato del valor de retorno, cuando el método regresa un resultado, dentro de su cuerpo se ocupa la palabra reservada return seguida del valor a devolver, siendo esta la última sentencia en ejecutarse en el método, si el método no requiere devolver un resultado se ocupa la palabra reservada void. 3) Nombre del método, es el identificador que se invocará y se recomienda que sea descriptivo. 4) Parámetros formales: Son los valores que el método recibe del exterior y que requiere para su función, cada uno precedido de su tipo de dato, se escriben entre paréntesis. 5) Excepciones: Si el método puede lanzar excepciones se indica al final de la cabecera. El cuerpo del método se encuentra encerrado entre llaves y contiene el grupo de sentencias que indican su funcionamiento. Ejemplo de definición de método: o
I
o
Sin acceso definido, con retorno de resultado y lista de parámetros: int sumar (int a, int b) { return a+b; } Con acceso público, sin retorno y sin parámetros public void sumar () { c=a+b; /* En este caso las variables están declaradas como atributos }
Llamada a un método (Mensaje)
3 Instituto Tecnológico de Toluca
Lic. Alma Patricia Vásquez Glez.
Unidad II. Clases y Objetos
Programación Orientada a Objetos
La llamada o la invocación a un método son conocidas co mo “mensaje”. El Mensaje es la forma en que un programa se comunica con un objeto, ejecutando un método específico. Existen 3 tipos de mecanismos para enviar mensajes: 1) Fuera de la clase donde se define el método por medio de un mensaje compuesto por el objeto, el método y los parámetros actuales o argumentos. Sintaxis:
Objeto.Método(Argumentos)
Ejemplos:
obj_persona.leer() ob.sumar(a,b)
2) Si es un método estático o de clase la llamada indica el nombre de la clase del método y los argumentos. Sintaxis: Ejemplo:
NombreClase.Método(Argumentos) persona.metodo_estático()
3) Cuando el método es utilizado en la misma clase que lo define, sólo se escribe el nombre del método. Ejemplo:
public void desplegar() { leer(); }
Atributos y Métodos de tipo static Un atributo o método definido como static no es atributo o método de un objeto, sino que es un miembro de la clase, es decir en el caso del atributo, si existen objetos creados solo hay una copia que comparten todos los objetos de la clase. Un atributo o método static existe y puede ser utilizado aunque no exista ningún objeto de la clase.
Modificadores de Acceso Para controlar el acceso a los miembros de una clase, Java provee las palabras reservadas private, protected, public, aunque también se pueden omitir convirtiendo el ac ceso en “predeterminado” o “de paquete”. Los modificadores de acceso son utilizados para indicar el tipo de acceso permitido a cada miembro de la clase, es decir el ámbito desde el cual se podrá acceder a él. Los modificadores son los siguientes: o
o
Acceso Predeterminado (de paquete).- Cuando no se especifica ningún tipo de modificador de acceso, el miembro de la clase puede ser accedido por cualquier clase que pertenezca al mismo paquete, ninguna otra clase o subclase, fuera de ese paquete tendrá acceso a los miembros. Acceso público (public).- Un miembro declarado public, esta accesible para cualquier otra clase o subclase que necesita utilizarlo. La interfaz de una clase está formada por todos los miembros públicos de la misma. Los atributos static generalmente son declarados públicos.
4 Instituto Tecnológico de Toluca
Lic. Alma Patricia Vásquez Glez.
Unidad II. Clases y Objetos o
o
Programación Orientada a Objetos
Acceso Privado (private).- Un miembro declarado private es accesible solamente por los métodos de su propia clase. Esto significa que no puede ser accedido por los métodos de cualquier otra clase, ni por subclases. Acceso Protegido (protected).- El modificador protected permite que la propia clase, las subclases y las clases del mismo paquete accedan a los miembros.
Modificador
Clase
Predeterminado Public
* *
Prívate Protected
Método
Atributo
* * * *
* * * *
Descripción Visibles en todo paquete. Visibles en todos los paquetes. Visibles en la propia clase. Visibles en el paquete y en subclases de esta clase en otro paquete.
Paso de parámetros y Devolución de valores desde métodos Un método puede devolver un resultado al ámbito donde fue llamado si así es necesario. Para hacerlo se ocupa la palabra reservada return seguida del valor a regresar. El tipo de dato de ese valor debe coincidir con el tipo indicado en la cabecera del método. Ejemplo:
public float suma( float x, int y) { float z= x+y; return z; } La llamada será: Int A, B; float res; A=5; B=10; res = Ob.suma (A, B);
La cabecera de un método especifica el número y tipo de los parámetros requeridos, existen dos formas de pasar parámetros desde el mensaje, por valor y por referencia.
Parámetros por valor Todos los tipos de datos primitivos se pasan a los métodos por valor, es decir sus valores se copian a nuevas posiciones de memoria, por lo que si un argumento se cambia dentro del método, éste no cambiará en el ámbito donde fue llamado. Ejemplo: // En la clase
// En la llamada
5 Instituto Tecnológico de Toluca
Lic. Alma Patricia Vásquez Glez.
Unidad II. Clases y Objetos
Programación Orientada a Objetos
public int suma (int A, int B) { A= A+B; return A; }
int A=10; int B=20; C=ob.suma(A,B);
Aunque en el método cambió el valor de A con el resultado de 10 +20, en el ámbito de la llamada A sigue teniendo el valor de 10.
Paso de parámetros por referencia Todos los objetos incluyendo a los arreglos se llaman tipos referencia. El paso de un objeto significa que la referencia de éste es decir su dirección de memoria se pasa a un parámetro. Por lo tanto cualquier cambio al objeto local que suceda dentro del método afectará al objeto original. Ejemplo:
public void suma(circulo ob) { ob.radio=ob.radio+radio;
} La llamada CIRCULO1.suma (CIRCULO2) causará que el radio del objeto CIRCULO2, se modifique con la suma del radio del objeto CIRCULO1.
2.5 Constructores y Destructores Un constructor es un tipo especial de método que inicializa el objeto con valores definidos. El constructor es llamado automáticamente siempre que se crea un objeto. Cuando se crea un objeto sucede lo siguiente: a) Se asigna memoria para el objeto por medio del operador new. b) Se inicializan los atributos del objeto con los valores predeterminados por el sistema, los atributos numéricos con ceros y los alfanuméricos y las referencias con nulos. c) Se llama al constructor de la clase que puede ser uno entre varios y se encarga de inicializar los atributos con los valores indicados en este. Así como existe un método que se ejecuta automáticamente cada vez que se construye un objeto, existe un método que se invoca automáticamente cada vez que se destruye. Este método recibe el nombre genérico de destructor y en java corresponde al método finalize(). Cuando un objeto es destruido ocurren varias cosas: a) Se llama al método finalize. b) El recolector de basura de java se encarga de eliminar al objeto, lo que conlleva a: c) Que se liberen los recursos que el objeto tuviera adjudicados (su espacio en memoria). Un objeto es destruido automáticamente cuando se eliminan todas las referencias al mismo. Una referencia a un objeto puede ser eliminada: 1) Porque el flujo de la ejecución salga fuera del ámbito donde la referencia fue declarada 2) Porque de manera explícita se le asigne a la referencia un valor nulo.
6 Instituto Tecnológico de Toluca
Lic. Alma Patricia Vásquez Glez.
Unidad II. Clases y Objetos
Programación Orientada a Objetos
Declaración de métodos Constructor y Destructor El constructor es un método de acceso público, que no tiene valor de retorno y que lleva el mismo nombre de la clase, seguido de la lista de parámetros si son requeridos. Su declaración tiene la siguiente sintaxis. Declaración de un constructor: public nombre_clase(Parámetros) { sentencias } Ejemplo: public circulo() { Radio = 10 } Un destructor se ejecuta antes de que un objeto sea eliminado físicamente de la memoria. Si una clase no proporciona la definición de un destructor el compilador proporciona uno a través de la clase object con la siguiente sintaxis: protected void finalize()throws Throwable { //Sin código. }
Si se desea declarar un destructor en una clase se reescribe el método anterior. En una clase solo se puede definir un método destructor a diferencia del constructor para el que puede haber varias definiciones. Para forzar la completa recolección de basura se llama al método gc ( garbaje collector) de la clase system, escribiendo el siguiente segmento de codigo: Ob_A=null Runtime runtime=Runtime.getruntime(): runtime.gc(); runtime.runFinalization();
Tipos de constructores Existen diversos tipos de constructores entre los que se distinguen: a) Constructores por omisión o por defecto: Es un constructor sin parámetros que inicializa los atributos del objeto con los valores predeterminados del sistema (ceros y nulos). Si una clase no especifica ningún constructor el compilador agrega automáticamente un constructor por defecto. Ejemplo: public circulo () { radio=0; } 7 Instituto Tecnológico de Toluca
Lic. Alma Patricia Vásquez Glez.
Unidad II. Clases y Objetos
Programación Orientada a Objetos
b) Constructor por parámetros: Este requiere del paso de un argumento que será utilizado para inicializar los atributos del objeto. Puede existir más de un constructor con paso de parámetros siempre y cuando sean diferentes en el tipo o la cantidad de parámetros utilizados. Ejemplo: public arreglo (int L) { A=new int[L] } La ejecución del constructor es cuando se crea el objeto: arreglo ARREGLO1 = new arreglo(10); c)
Constructor por copia: Es el que asigna otro objeto de su misma clase en el momento de la creación. Acepta como argumento una referencia al objeto que se va a copiar para después asignar elemento por elemento al objeto construido. Ejemplo: public fecha (fecha Ob) { This.d=Ob.d; This.m=Ob.m; This.a=Ob.a; } La ejecución del constructor es: fecha FECHA2=new fecha(FECHA1); Con lo que se crea una copia del objeto FECHA1, en el objeto FECHA2.
2.6 Sobrecarga de Métodos La sobrecarga es la característica de permitir que existan varios métodos con el mismo nombre, pero con diferente cantidad y tipo de parámetros. La función de la sobrecarga es la de eliminar la necesidad de definir métodos deferentes que en esencia hacen lo mismo. La definición de varios constructores es un ejemplo de Sobrecarga. Ejemplo. Escribir la clase Fecha, con dia, mes y año como atributos con un método sobrecargado para la
asignación de datos. class fecha { int dd, mm, aa; public fecha() { //Constructor por defecto dd=0; mm=0; aa=0; } public void setFecha(int dd,int mm,int aa) { 8 Instituto Tecnológico de Toluca
Lic. Alma Patricia Vásquez Glez.
Unidad II. Clases y Objetos
Programación Orientada a Objetos
// metodo sobrecargado this.dd=dd; this.mm=mm; this.aa=aa; } public void setFecha(int dd,int mm) { //metodo sobrecargado this.dd=dd; this.mm=mm; } . . . }
La forma en que se invoque el método indica cual se ejecutará, los llamados pueden ser de la manera siguiente: int di=9, me=6, an=2006; fecha ob1=new fecha(); fecha ob2=new fecha(); ob1.setFecha(di,me,an); ob2.setFecha(di,me);
2.7 Sobrecarga de Operadores El término operador sobrecargado se refiere a un operador que es capaz de desarrollar su función en varios contextos sin necesidad de otras operaciones adicionales. La sobrecarga de operadores permite dar un nuevo significado al símbolo de un operador. En algunos lenguajes existen formas para la sobre carga de operadores. El lenguaje Java, a diferencia de C++, no soporta la sobrecarga de operadores, esto significa que no es posible predefinir el entorno en el que actúa un operador con respecto a los objetos de un tipo que el programador haya definido como propio. Sin embargo, Java sobrecarga internamente el operador “+”, ya que se puede utilizar para realizar una suma aritmética, o para concatenar (juntar) elementos, es decir, su función depende del entorno exterior. Ejemplo de la Sobrecarga de operador ++ en lenguaje c++, que define un método llamado operator,
seguido del símbolo del operador a sobrecargar: class coordenada { int x,y; void operator ++()
9 Instituto Tecnológico de Toluca
Lic. Alma Patricia Vásquez Glez.
Unidad II. Clases y Objetos
Programación Orientada a Objetos
{ x++; y++; } … }
El objeto se puede incrementar ahora de la siguiente forma: ob1++; Ejemplo de la Sobrecarga interna en Java: A=B+C; System.out.println( “El resultado es ”+ A);
10 Instituto Tecnológico de Toluca
Lic. Alma Patricia Vásquez Glez.