Programación Orientada a Objetos con Java M.C. Jorge Eduardo Ibarra Esquer jorgeeie@uabc.mx Sobrecarga de métodos Java permite la definición de dos o más métodos que tengan el mismo nombre, dentro de la misma clase. La restricción para esto es que sus parámetros sean diferentes En estos casos se dice que hay una sobrecarga de métodos, la cual es una de las formas en las que Java implementa el polimorfismo Cuando Java encuentra una llamada a un método sobrecargado, se ejecuta la versión que corresponde a los argumentos utilizados al llamarlo 1 Sobrecarga de métodos El método escribir() de nuestra clase Pizarron puede servir para ejemplificar la sobrecarga public void escribir(String texto) { this.texto=texto; } public void escribir(String texto, boolean agrega) { if(agrega) this.texto+=texto; else this.texto=texto; } Sobrecarga de constructores Una clase puede tener más de un constructor, siempre y cuando cada uno de ellos tenga diferentes argumentos: Pizarron( ) { color=“Verde”; material=“Madera”; ancho=3.0; alto=1.5; texto=“”; } Pizarron(String texto) { color=“Verde”; material=“Madera”; ancho=3.0; alto=1.5; this.texto=texto; } 2 Utilizar objetos como parámetros de los métodos Definir un método copiar(Pizarron p) que copie el texto de un pizarrón a otro Paso de argumentos por valor Consiste en copiar el valor en el parámetro del método Los cambios que el método realice en el parámetro recibido, no tienen efecto sobre el argumento original Cuando se utiliza como parámetro un tipo de dato primitivo, se pasa por valor: byte, short, int, long, float, double, char, boolean 3 Paso de parámetros por referencia Se pasa una referencia a un parámetro, no su valor Los cambios que se realicen en el método, afectarán al argumento original Cuando se pasa un objeto a un método, se hace por referencia Especificadores de acceso A través de estas palabras clave, se puede controlar el acceso a los miembros de una clase desde las diferentes partes de un programa Los especificadores de acceso de Java son: public private protected 4 Acceso público Cuando se utiliza la palabra public, cualquier parte de un programa puede tener acceso a ese miembro de la clase: public int a; public void borra( ){… } Acceso privado Cuando a un miembro de una clase se le especifica este acceso mediante la palabra private, únicamente se tendrá acceso a él desde otros miembros de su misma clase: private int a; private void guarda( ) {…} 5 Acceso protegido Sólo se tiene acceso a los miembros de la clase desde subclases de la misma, es decir, clases que hereden sus características. Para indicar este modo de acceso, se utiliza la palabra protected: protected int a; protected void metodo(); Acceso por default Si no se utiliza ninguno de los modificadores de acceso, entonces se tendrá acceso por defecto En este caso, se tendrá acceso a los miembros de la clase desde cualquier otra clase que se encuentre en el mismo paquete 6 Resumen de modificadores de acceso public protected default private Misma clase 3 3 3 3 Subclase en el mismo paquete Otra clase en el mismo paquete Subclase en otro paquete Otra clase en otro paquete 3 3 3 2 3 3 3 2 3 3 2 2 3 2 2 2 La palabra clave static Existen miembros de una clase que se pueden utilizar independientemente de cualquier objeto de esa clase Para crearlos, es necesario que en su declaración se incluya la palabra static static double pi=3.14159; static int suma(int a, int b) 7 La palabra clave final Cuando una variable se declara como final, su valor no puede ser modificado Una variable de este tipo debe ser inicializada al momento que se define final double PI=3.14159; final int ABRIR=1; final int CERRAR=2; Generalmente este tipo de variables se especifican utilizando sólo mayúsculas Clases internas Estas son clases que se definen dentro de otra clase. También reciben el nombre de clases anidadas. Las clases internas pueden tener una definición completa o ser una clase anónima, es decir, una clase sin nombre Su aplicación principal es en el manejo de eventos 8 Herencia Para indicar que una clase hereda sus atributos y métodos de otra, en Java se utiliza la palabra clave extends public class Vocal extends Letra Herencia Por medio de la herencia, se puede modificar el comportamiento de algunos de los métodos de una clase, así como agregar nuevos atributos y métodos Un objeto de una subclase, puede utilizarse como parámetro cuando se requiera un objeto de su superclase 9 Herencia public class PizarronCuadrado extends Pizarron{ … … … } … public void copiar(Pizarron p){ … } public class Pizarrones { … … PizarronCuadrado pc1,pc2; … … pc1.copiar(pc2); … … … } Un objeto de la clase PizarronCuadrado será también un objeto de la clase Pizarron La palabra clave super Esta palabra se utiliza para que una clase se refiera a su superclase inmediata Un uso común es el de llamar a uno de los constructores de la superclase super(lista de parámetros); La llamada a super() debe ser la primer sentencia que se ejecute en un constructor 10 La palabra clave super También se puede utilizar para llamar a un miembro específico de la superclase, de manera similar a this super.miembro; Un miembro de una clase es un método o atributo Clases abstractas Son clases en las que se declara la estructura de la misma, pero no se implementa alguno o algunos de los métodos Definen una forma general que será compartida por todas las subclases, permitiendo que éstas definan el comportamiento específico para cada una de ellas 11 Clases abstractas Cuando una clase tenga al menos un método declarado como abstracto, deberá también declararse como clase abstracta Para declarar clases y métodos abstractos, se utiliza la palabra clave abstract public abstract class Clase public abstract void método(parámetros); No pueden crearse objetos de clases abstractas Evitando la herencia En algunos casos, se tendrán métodos que no es conveniente que se sobreescriban al ser heredados Para evitar esta sobreescritura, se utiliza la palabra clave final public final void método(atributos){…} De la misma forma, se puede evitar que una clase sea heredada public final class Clase 12 Paquetes Los paquetes son contenedores de clases que permite delimitar el espacio en el cual una clase existe Los paquetes permiten que exista más de una clase con el mismo nombre Para indicar que una clase pertenece a un cierto paquete, se utiliza la palabra clave package Paquetes La declaración del paquete debe colocarse como la primera sentencia de la clase La sentencia package define un espacio de nombres en el que se almacenan las clases La forma de esta sentencia es: package nombrePaquete; 13 Paquetes Cualquier clase que se declare como parte de un paquete, debe estar contenida dentro de un directorio con el nombre de dicho paquete Los paquetes pueden organizarse como una jerarquía. Para esto, se separa el nombre de cada paquete por medio de un punto: package paq1.paq2.paq3; La palabra clave import Cuando se requiera utilizar una clase en un programa escrito en Java, ésta debe referenciarse, cada vez que sea utilizada, con el nombre completo del paquete en el que se encuentra. Por ejemplo: java.io.BufferedReader java.lang.Integer 14 La palabra clave import La sentencia import nos permite referenciar las clases utilizando únicamente su nombre Al importar una clase o las clases que se encuentran en un paquete se vuelven visibles para el compilador La forma de utilizar la sentencia import es la siguiente: import java.io.BufferedReader; import java.io.*; La palabra clave import La sentencia import se debe colocar después de la declaración del paquete y antes de la declaración de la clase package paquete; import paquete1.*; import paquete2.*; … import paqueteN.*; public class Clase{ … } 15 Interfaces Por medio de una interfaz, se puede especificar lo que una clase debe hacer, pero no cómo debe hacerlo Las interfaces son similares a las clases, pero no contienen variables de instancia y los métodos solamente se declaran Para crear una interfaz, se utiliza la palabra clave interface en lugar de class Interfaces public interface UnaInterfaz{ public void metodo1(); public String metodo2(); public double metodo3(double a, double b); public void metodo4(); } 16 Interfaces El acceso a una interfaz puede ser public o por default Se pueden declarar variables en una interfaz, pero estas, de manera implícita, tendrán los modificadores static y final Si una interfaz se declara como public, todos sus métodos y variables también lo serán Implementación de interfaces Una vez que se tiene una interfaz, una o más clases pueden implementarla La implementación de una interfaz se indica mediante la palabra implements public class Clase implements Interfaz Cuando una clase implementa a una interfaz, debe declarar todos los métodos de dicha interfaz o declararse como clase abstracta 17 Implementación de interfaces Una clase puede implementar más de una interfaz, separando los nombres de las interfaces por medio de comas public class Clase implements Interfaz1,Interfaz2 Se puede tener acceso a una clase a través de una referencia a una interfaz que ésta implemente Implementación de interfaces public interface Leible{ Public class Biblioteca{ public String leer(); …. …. } public class Libro implements Leible{ … public String leer(){ return texto; } } Libro lib=new Libro(); leePagina(lib); … … public String leePagina(Leible l){ return l.leer(); } …. } 18 Implementación de interfaces Cuando una clase implementa una interfaz, otras clases pueden comunicarse con ella a través de los métodos definidos en la interfaz Las interfaces son una manera indirecta en la cual Java implementa la herencia múltiple Variables en interfaces Una interfaz se puede utilizar para declarar un grupo de constantes que serán utilizadas por otras clases public interface Constantes{ public interface Comandos{ String bienvenida=“Hola”; int SALIR=0; String despedida=“Hasta luego”; int ABRIR=1; String saludo=“¿Cómo has estado?”; int GUARDAR=2; } int BORRAR=3; } 19