Repaso de conceptos de clases Preparado por Eduardo

  • Slides: 36
Download presentation
Repaso de conceptos de clases Preparado por Eduardo Olivares.

Repaso de conceptos de clases Preparado por Eduardo Olivares.

Definiendo un objeto. Las siguientes son opciones válidas para definir un objeto de una

Definiendo un objeto. Las siguientes son opciones válidas para definir un objeto de una clase: public Persona persona 1; //con acceso para otras clases private Persona persona 1; //para uso exclusivo de la clase Un arreglo: public Persona[] personas; Para asignar el objeto a la variable: persona 1 = new Persona(); personas = new Persona[100]; personas = new Persona[max. Personas]; Se puede hacer al mismo tiempo private Persona personas = new Persona(); private Persona[] personas = new Persona[max. Persona];

Creando un constructor n Es posible crear varios constructores para una misma clase, que

Creando un constructor n Es posible crear varios constructores para una misma clase, que hagan algo dependiendo del tipo de parámetros que reciben. Esto se llama polimorfismo. public Vagon() { peso = 0; } Recordar: *NO lleva definición Tipo de dato de entrada. *El nombre del constructor es el mismo que el de la clase. *Los constructores accesan directamente las variables de instancia. No se usan métodos para asignar los valores.

Cambiando los valores de las variables de instancia. Normalmente los valores de las variables

Cambiando los valores de las variables de instancia. Normalmente los valores de las variables de instancia los declararemos como private. n Para cambiar el valor de una variable de instancia se usan metodos mutadores: public void set. Edad(int edad) { n this. edad = edad; } ó public void set. Edad(int e) { edad = e; } Si la variable local que se recibe se llama igual que la variable de instancia se usa el this. Por convención los métodos Se inician con minúscula y cada palabra que define el método va con mayúscula. No olvidar el void.

Regresando el valor de una variable de instancia Los métodos que regresan un valor

Regresando el valor de una variable de instancia Los métodos que regresan un valor de variable de instancia se declaran usando el valor de retorno. Y de denominan métodos accesores. public int get. Num. Maq() { No recibe parámetros return num. Maq; }

Creando métodos de la clase n Asegúrate de reflejar el valor de retorno en

Creando métodos de la clase n Asegúrate de reflejar el valor de retorno en la definición del método y recibir los parámetros. private boolean set. Autores(int num. Autores) { if (num. Autores <= max. Autores) { this. num. Autores = num. Autores; return true; } else { return false; } } public boolean agrega. Autor(String nombre) { autores[num. Autores] = new Autor(nombre); return set. Autores(num. Autores + 1); }

Regresando un objeto. n El siguiente código muestra un ejemplo de retorno con un

Regresando un objeto. n El siguiente código muestra un ejemplo de retorno con un objeto. public Persona mas. Edad() { int pos. Max = 0; for (int i = 0; i <= num. Personas; ++i) { If (personas[i]. get. Edad() > personas[pos. Max]. get. Edad()) { pos. Max=i; } } return personas[pos. Max]; }

Mandando llamar a los métodos de una clase. int i = 0; String titulo;

Mandando llamar a los métodos de una clase. int i = 0; String titulo; String nombre; do { std. Out. print("Dame el título del libro"); std. Out. flush(); libro[i]. set. Titulo(std. In. read. Line()); std. Out. print("Dame el número de páginas"); std. Out. flush(); libro[i]. set. Pagina(Integer. parse. Int(std. In. read. Line())); do { std. Out. print("Dame el nombre del autor"); std. Out. flush(); libro[i]. agrega. Autor(std. In. read. Line()); std. Out. print("Deseas ingresar otro autor s/n? "); std. Out. flush(); cont = std. In. read. Line(); } while (cont. equals("s")); std. Out. print("Deseas ingresar otro libro s/n? "); std. Out. flush(); cont = std. In. read. Line(); ++i; } while (cont. equals("s"));

Trabajando con valores de retorno. std. Out. print. Ln(“La persona de mayor edad, tiene”

Trabajando con valores de retorno. std. Out. print. Ln(“La persona de mayor edad, tiene” +persona 1. mas. Peso(). get. Peso()); El método mas. Edad() regresa un objeto de tipo Persona El objeto Pesona tiene un método get. Edad(); Separando la instrucción: Persona p 1 = persona 1. mas. Peso(); int edad = p 1. get. Peso(); std. Out. print. Ln(“La persona de mayor edad, tiene” +edad);

Convenciones y documentación. n n n Seguir la convención para nombrar Clases: Primera letra

Convenciones y documentación. n n n Seguir la convención para nombrar Clases: Primera letra mayúscula y cada palabra seguida iniciando con mayúscula. - Mi. Clase. Es. La. Mejor Cada variable se declara en una sóla línea. El nombre de la variable debe ser representativo, ej. Usar vector 1 en vez de v. Después del tipo de dato se usa tabulador int String Objeto n uno; dos; tres; La indentación es debe ser correcta, la clase va en el primer nivel, las variables y clases se definen en un nivel más adentro: public class Clase { public Clase () { } public void metodo() { } } n n Las llaves abiertas van en la misma linea del estatuto, las llaves cerradas van a la altura del estatuto que cierran. Un estatuto por línea.

Convenciones y documentación. n Formato del if: if (condición) { estatutos; } else {

Convenciones y documentación. n Formato del if: if (condición) { estatutos; } else { estatutos; } n Debe haber un espacio entre las palabras reservadas y el paréntesis. while( while ( n Linea en blanco entre métodos, después de los encabezados de métodos, entre las variables y el primer estatuto del método. public void espera() { int i; for (i = 0; i< 1000; i++) ; return true; }

Convenciones. Continua. n Espacios en blanco: después de las comas de parámetros, entre cada

Convenciones. Continua. n Espacios en blanco: después de las comas de parámetros, entre cada operador (exceptuando el punto, ++, --), después de una palabra clave (keyword) y el paréntesis. Ejemplos: public int mi. Metodo (Buffered. Reader br, double inicio) { double acum = inicio; while (br. ready()) { String. Tokenizer st = new String. Tokenizer(br. read. Line()); a = Integer. parse. Int(st. next. Token()) b = Integer. parse. Int(st. next. Token()) c = Integer. parse. Int(st. next. Token()) acum += ((double) a + (double) b) / ((double) c * (double) a); } return acum; }

Documentación. n n Lo primero en la clase son los paquetes. Después de una

Documentación. n n Lo primero en la clase son los paquetes. Después de una línea en blanco se ponen los imports. Después de los imports va una linea en blanco. La clase está documentada. /** * Descripción Línea de espacio * * @author Nombre */ public class Mi. Clase { } n Después de cada método hay una línea en blanco. n Cada método viene comentado según el siguiente formato: /** * Descripción * * @param parámetro descripción * @throws excepción * @return descripción */ n Los elementos a resaltar como tipo de dato están entre etiquetas <code></code>

Herencia. Para definir una clase que hereda a otra, se utiliza la palabra extends:

Herencia. Para definir una clase que hereda a otra, se utiliza la palabra extends: public class Child. Class extends Parent. Class En el caso anterior la clase Child. Class se dice que es extendida de la clase Parent. Class. En Java, una clase puede extender solamente una clase, esto es, no se permite la herencia múltiple. Si una clase se declara como final no puede tener descendencia: public final class Cannot. Be. AParent Todas las clases de java al instanciarlas se convierten en objetos, esto es, son hijas de java. lang. Object. n

Hidden vs Overriding Campos ocultos. Un campo o variable de instancia se dice que

Hidden vs Overriding Campos ocultos. Un campo o variable de instancia se dice que está oculta “hidden” si el hijo la vuelve a definir. No es necesario que los tipos de datos coincidan. Padre: Hijo: public static int x; public double x; Método oculto. Un método definido como estático en el padre se dice que está oculto “hidden” si lo vuelve a definir el hijo. La firma y valor de retorno debe coincidir o la compilación fallará. Padre: Hijo: public static void cling() {} Para accesar un método oculto del padre se utiliza la palabra super(). Métodos sobreescritos. Un método de instancia (no estático) en el padre se dice que está sobreescrito “Overriding” y consecuentemente no heredado, si el hijo define su propio método de instancia con la misma firma y tipo de dato. Si el hijo sobreescribe un método de instancia y lo hace estático la compilación falla. Padre: Hijo: public void print() {} Un método de tipo final no se puede sobreescribir.

Overriding vs Overloading La sobreescritura “overriding” de un método significa definir un método que

Overriding vs Overloading La sobreescritura “overriding” de un método significa definir un método que fue heredado con la misma firma y valor de retorno. En cambio la sobrecarga se relaciona más con el concepto de polimorfismo que con el concepto de herencia. Y significa que un método comparte diferentes implementaciones. Esto es un mismo método tiene diferentes firmas. Por ejemplo: public boolean equals(Account acc) { return get. Name() == acc. get. Name() && get. Balance() == acc. get. Balance(); } public boolean equals(Range r) { return get. Lo() == r. get. Lo() && get. Hi() == r. get. Hi(); } El método equals va a funcionar diferente dependiendo del tipo de dato que se envie. Esto es el mismo método se comportará diferente dependiendo del tipo de dato. Para hacer overloading es necesario compartir los identificadores por los métodos de la clase donde se desea este comportamiento.

Clases abstractas Una clase abstracta contiene al menos un método abstracto, el cual debe

Clases abstractas Una clase abstracta contiene al menos un método abstracto, el cual debe ser implementado por quien lo hereda. Una clase que tenga al menos un método abastracto debe ser declarada abstracta. Una clase abstracta se denota con el modificador abstract, como se muestra en el ejemplo: public abstract class Animal { private int age; private int energy; . . . public void increase. Energy(int amount) { energy += amount; } . . . public abstract void eat(int amount); public abstract void sleep(int hours); . . . } Una clase abstracta no puede ser instanciada: Animal my. Animal = new Animal(); // incorrecto! Una clase abstracta, a diferencia de una interfaz, sí incluye comportamiento (métodos contenido) además de los métodos abstractos.

Concepto de: Interface Una interfaz es como una clase abstract en el sentido de

Concepto de: Interface Una interfaz es como una clase abstract en el sentido de que puede tener métodos que no están implementados (métodos abstract). Sin embargo, y a diferencia de las clases abstract, todos los métodos de la interfaz deben ser public y abstract. Por cuestiones de estilo, estos modificadores no se mencionan explícitamente en los métodos. De la misma manera que las clases, las interfaces también pueden tener campos de datos. Todos los campos de datos de una interfaz son implícitamente public, static, y final. Para definir una interfaz se usa el interface: public interface mi. Interfaz { Para utilizar una interfaz se usa el implements: public class Mi. Clase implements mi. Interfaz {

Paquetes Un paquete es un conjunto de clases relacionadas. Normalmente, cada clase reside en

Paquetes Un paquete es un conjunto de clases relacionadas. Normalmente, cada clase reside en su propio archivo. Por lo tanto, un paquete es análogo a un directorio en el sentido de que es un conjunto de archivos relacionados. A fin de tener acceso por default a una clase estas deben estar en el mismo paquete. La forma de definir un paquete es la siguiente: package mi. Paquete; Para utilizar un paquete se debe incuir un import: import mi. Paquete. *;

Modificadores Java Modificadores para Campos: n modificadores de acceso n n n modificadores de

Modificadores Java Modificadores para Campos: n modificadores de acceso n n n modificadores de existencia n n public – se puede tener acceso a él desde cualquier parte desde donde la clase que lo contiene pueda accesarse protected – puede accesarse solamente desde adentro de su clase, desde clases del mismo paquete donde está su clase y por subclases de su clase default (no se especifica el acceso) – puede accesarse solamente desde adentro de su clase y por clases del mismo paquete de su clase private – pueden accesarse solamente desde adentro de su clase static – existe uno para toda la clase, en lugar de uno para cada objeto de su clase modificadores de uso n final – no puede modificarse (i. e. , constante o de sólo lectura)

Modificadores Java Modificadores para Métodos: n modificadores de acceso n n n modificadores de

Modificadores Java Modificadores para Métodos: n modificadores de acceso n n n modificadores de existencia n n public – se puede tener acceso a él desde cualquier parte desde donde la clase que lo contiene pueda accesarse protected – puede accesarse solamente desde adentro de su clase, desde clases del mismo paquete donde está su clase y por subclases de su clase default (no se especifica el acceso) – puede accesarse solamente desde adentro de su clase y por clases del mismo paquete de su clase private – pueden accesarse solamente desde adentro de su clase static – existen para servir a su clase y no para servir a objetos individuales de su clase; como consecuencia, los métodos static no tienen acceso a variables de instancia ya que éstas pertenecen a los objetos individuales, aún más, estos métodos no tienen acceso a this ni a super. modificadores de uso n n final – no puede sobreescribirse abstract – debe sobreescribirse para que sea útil

Modificadores Java Modificadores para Clases: n modificadores de acceso n n n public –

Modificadores Java Modificadores para Clases: n modificadores de acceso n n n public – se puede tener acceso a ella desde cualquier clase default (no se especifica su acceso) – puede accesarse desde adentro de cualquier clase de su mismo paquete, esto es, A fin de tener acceso por default a una clase, estas deben estar en el mismo paquete. modificadores de uso n n final – no puede extenderse(heredada) abstract – debe extenderse (heredada) para que sea útil

If (condición) { } else { } n Formato: Por convención se colocan los

If (condición) { } else { } n Formato: Por convención se colocan los corchetes aún y cuando java acepte su omisión en caso de ser una sola línea if (variable > 5) { //Código que se ejecuta } else { //Aquí va lo que se debe hacer cuando la no fue mayor que 5 } n Donde usarse: n n Para validar que condición se cumpla antes de hacer algo. . El ELSE (si no) puede omitirse En la toma de decisiones, por ejemplo, para realizar algo ede acuerdo al botón que haya sido presionado en un programa. El único típo de dato válido para una condición de un if, es el boolean. Formato alterno: n n (condición) ? Valor que toma la expresión si es verdadero : Valor que toma la expresión si es falso Ej. return (a < 0) ? – 1 : 0; //regresa – 1 si el número es negativo, 0 en otro caso.

While (condición) {} n Formato: Los corchetes no son necesarios si solo se va

While (condición) {} n Formato: Los corchetes no son necesarios si solo se va a ejecutar una instrucción while (varible > 5) { // Aqui se pone todas las instrucciones que se requieren ejecutar mientras expresión regrese TRUE (que la condición se cumpla) } n Caso especial: while (true) { // Instrucciones a ejecutar if (Variable > 5) break; } n break es palabra reservada. Sirve para indicarle al programa que termine el ciclo Donde usarse: n n Cuando se requiere repetir las instrucciones de un programa hasta que ocurra algo (que expresión retorne FALSE) Donde no se sabe cuantas veces se ejecutará cierto código (que incluso puede no ejecutarse)

For (inicialización, condición, modificador) {} Formato: for usado comúnmente como for (int i =

For (inicialización, condición, modificador) {} Formato: for usado comúnmente como for (int i = 0; i < 5; ++i) { retardador (delayer). El tiempo // Instrucciones a ejecutar de retardo depende de la } computadora en que se ejecute n Casos especiales: for (int i = 0; i < 5000000; ++i) ; for ( ; i < 5; ) { for con la funcionalidad de un // Instrucciones a ejecutar while. Mejor usa el while } n n Donde usarse: n n n Cuando se requiere repetir las instrucciones de un programa hasta que ocurra algo (que expresión retorne FALSE) Se conoce de antemano el número de veces que se ejecutará por la naturaleza de la condición Recuerda que el for se puede ejecutar desde cero veces hasta un número infinito (se cicla si la condición nunca se cumple). Recuerda que la variable que se define en el ciclo (ej. i) sólo es accesible al ciclo y no al resto del cuerpo del programa Nota: n Muchas veces el while y for pueden ser usados indistintamente. Elije la que más convenga recordando que el for tiene capacidad para manerar una variable contadora más cómodamente.

Do { } while (condición); Formato: do { //Instrucciones a ejecutar } while (variable

Do { } while (condición); Formato: do { //Instrucciones a ejecutar } while (variable > 5); //No olvides el punto y coma; n Caso especial: do { if (variable > 5) n break; } while (true); n Donde usarlo: n Donde se requiere que un ciclo se ejecute al menos una vez sin importar lo que regrese la condición.

Switch Si no se pone el break el switch n Formato: se sigue y

Switch Si no se pone el break el switch n Formato: se sigue y prueba los demas switch (variable) { casos case 3: { //Codigo para cuando la variable vale 3 break; } case 5: { //Codigo para cuando fue 5 break; } default: { //Codigo cuando la variable no fue ni 3 ni 5 } } No requiere break por ser el último n Donde usarlo: n n Donde se requieren de varios ifs anidados. Por ejemplo, en programas con muchos botones y widgets con Action. Listener para identificar el elemento presionado. La variable del switch es entera.

Excepciones n n Una de las mayores ventajas es el manejo de excepciones. Se

Excepciones n n Una de las mayores ventajas es el manejo de excepciones. Se generan o lanzan (throw) comúnmente cuando el usuario introduce datos no esperados por el programa o el propio programa a fin de evitar problemas mayores. Las excepciones pueden ser manejadas por el programador (catch) o por el compilador. Ejemplo de excepciones manejadas por el programador: Metodo cualquiera que pide un número • EJEMPLO 1 y lo guarda en la variable. La public void metodo () { excepción se lanza si no se introduce try { algún número convertible a entero std. Out. println(“Escribe un número: ”); int n = std. In. readln(); } catch (Number. Format. Exception nfe) { status. set. Text(“Se genero error “+nfe. to. String()) } }

Excepciones • EJEMPLO 2 public void action. Performed(Action. Event e) try { String. Tokenizer

Excepciones • EJEMPLO 2 public void action. Performed(Action. Event e) try { String. Tokenizer st = new String. Tokenizer(tf 1. get. Text(), “_”) String nombre = st. next. Token(); while (st. has. More. Tokens()){ calificaciones. add((int) (st. next. Token())) //calificaciones es un vector } } catch (No. Such. Element. Exception nsee) { //Introducir código para cuando no se introdujeron elementos } catch (Number. Format. Exception nfe) { //Instrucciones para cuando no se tienen enteros donde deben } } tf 1 es un textfield que al ocurrir algún Action. Event, debe tener algo con formato: Nombre_86_75_90

Excepciones • EJEMPLO 3 public void metodo (int n) throws Mi. Excepcion { if

Excepciones • EJEMPLO 3 public void metodo (int n) throws Mi. Excepcion { if (n < 0) { throw new Mi. Excepcion(); } private void action. Performed(Action. Event e) { Public class Mi. Excepcion extends Exception{ try { metodo(Integer. parse. Int(tf 1. get. Text())); } catch (Mi. Excepcion me) { status. set. Text(me. to. String()); } } metodo falla cuando n es negativo. El action. Performed captura ese error y despliega en status. public Mi. Excepcion() { super(); } String to. String() { return “Se recibió un número negativo”; } }

Diseño de Objetos n n n Al crear clases instanciables en Java, es necesario

Diseño de Objetos n n n Al crear clases instanciables en Java, es necesario definir ciertos métodos que son comunes y que están contemplados implementarse por ser clases hijas de Object. Tal necesidad no solo se debe a cuestiones de estándar, sino a que ciertas clases contenedoras (como Vector) hacen uso de estos métodos de los objetos. Tales métodos son: n n public boolean equals(Object obj) public String to. String() Nota: Se pueden definir más métodos (como el notify u otros) según convenga. Para ver los métodos comunes a todos los objetos, verifica la información de la clase java. lang. Object.

Diseño de Objetos: equals() y to. String() import java. io. *; public class Alumno

Diseño de Objetos: equals() y to. String() import java. io. *; public class Alumno { public class Prueba { String nombre; private static Print. Writer std. Out = new Print. Writer(System. out, true); public Alumno(String dato) { nombre = dato; public static void main(String args[]) throws IOException { } mi. Objeto m = new mi. Objeto(“Casa”); mi. Objeto n = new m. Objeto(“Plato”); std. Out. println(“El Objeto m es “ + m. to. String()); std. Out. print(“ El Objeto m “); if (m. equals(n)) { std. Out. print(“Los objetos son iguales “); } else { std. Out. print(“Los objetos son diferentes”); std. Out. flush(); } } El criterio de igualdad es que los Strings nombre sean iguales public String to. String() { return nombre; } public boolean equals(Object obj) { if (obj instanceof Alumno) { Alumno alumno = (alumno) obj return to. String(). equals(alumno. to. String()); } else { return false; }

Diseño de Objetos: equals() y to. String() import java. io. *; public class Lista.

Diseño de Objetos: equals() y to. String() import java. io. *; public class Lista. Alumnos extends Linked. List { public class Prueba { public String to. String() { private static Print. Writer std. Out = new Print. Writer(System. out, true); private Lista mi. Lista; String acum = “”; List. Iterator li = list. Iterator(0); while (li. has. Next()) { acum += li. Next(). to. String() + “n”; } public static void main(String args[]) throws IOException { mi. Lista. add(new Alumno(“Juan”)); mi. Lista. add(new Alumno(“Pedro”)); std. Out. println(Lista. Alumnos. to. String()); } return acum; } } } RESULTADO: Juan Pedro Regresa el string acumulado.

Buffered. Reader Ejemplos de manejo de Buffered. Reader, para archivo y para un String:

Buffered. Reader Ejemplos de manejo de Buffered. Reader, para archivo y para un String: Buffered. Reader br = new Buffered. Reader(new File. Reader("nombrearchivo. dat"); while (br. ready()) { //hace algo con br. read. Line(); } Buffered. Reader br = new Buffered. Reader(new String. Reader(mi. Clase. to. String()); String linea = br. read. Line(); while (linea != null) { //hace algo con linea = br. read. Line(); }

String. Tokenizer Es importante tener en cuenta que si se desea usar un String.

String. Tokenizer Es importante tener en cuenta que si se desea usar un String. Tokenizer en una aplicación que está usando interfaz gráfica, se indique directamente la librería a la que pertence: java. util. String. Tokenizer st = new java. util. String. Tokenizer(mi. Objeto. String(), "n"); while (st. has. More. Tokens()) { //hace algo con st. next. Token() } n Uso del Stream. Tokenizer: Recordar que a diferencia del String. Tokenizer, regresa el dato con el casting, ya sea double o String.

Otros temas n n Repasa la tarea 9 de Dow. Jones. Repasa el examen

Otros temas n n Repasa la tarea 9 de Dow. Jones. Repasa el examen práctico de la unidad 3 Uso de la clase Nodo y Linked. List. Uso de la clase Linked. List del java. util. * n n Uso de la clase Vector del java. util. * n n Ver ejercicio en: http: //henry. carnegietech. org/~veerasam/ssd 3/Linked. List/in dex. html Ver ejercicio en: http: //henry. carnegietech. org/~veerasam/ssd 3/Vector/index. html Realiza el examen de práctica de certificación: https: //henry. carnegietech. org/~bufano/ssl/cert-examsamples/ssd 3/