scjp luis loor verónica carrasco

91
SCJP Luis Loor Verónica Carrasco

Upload: delano

Post on 24-Jan-2016

58 views

Category:

Documents


0 download

DESCRIPTION

SCJP Luis Loor Verónica Carrasco. Encapsulación Objetivo. 5.1 Desarrollar código que implementa la encapsulación, acoplamiento, y gran cohesión en las clases, y describir los beneficios. Encapsulación. La Encapsulación hace sencillo el mantenimiento y la modificación del código. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: SCJP Luis Loor Verónica Carrasco

SCJPLuis Loor

Verónica Carrasco

Page 2: SCJP Luis Loor Verónica Carrasco

Encapsulación Objetivo5.1 Desarrollar código que implementa la encapsulación, acoplamiento, y gran cohesión en las clases, y describir los beneficios.

Page 3: SCJP Luis Loor Verónica Carrasco

Encapsulación

La Encapsulación hace sencillo el mantenimiento y la modificación del código.

public class BadOO{ public int size; public int weight; ...}

public class ExploitBadOO { public static void main (String [] args) { BadOO b = new BadOO(); b.size = -5; }

}

Page 4: SCJP Luis Loor Verónica Carrasco

Como Encapsular?

• Mantener las variables de las instancias protegidas a través de modificadores de acceso Ej: private.

• Crear metodos con identificadores de acceso público, y obligar a invocar a estos métodos para acceder a las instancias de las variables.

• Para los métodos, aplicar la convención de los Java Beans set<someProperty> and get<someProperty>.

Page 5: SCJP Luis Loor Verónica Carrasco

public class Box { // protect the instance variable; only an instance // of Box can access it " d " "dfdf" private int size; // Provide public getters and setters public int getSize() { return size; } public void setSize(int newSize) { size = newSize; }

}

Page 6: SCJP Luis Loor Verónica Carrasco

class Foo {public int left = 9;public int right = 3;public void setLeft(int leftNum) {left = leftNum;right = leftNum/3;}// lots of complex test code here}

Cambiar a modificador de Acceso PRIVATE

Page 7: SCJP Luis Loor Verónica Carrasco

Herencia

• Objetivo:o Implementar código que tenga relaciones “is-a” y/o

“has-a”

Page 8: SCJP Luis Loor Verónica Carrasco

Herencia

• Capacidad que tienen los objetos Java de heredar propiedades y características de otros objetos

• Toda clase en Java es un subclase de Object por lo tanto siempre cualquier clase hereda todos los métodos de la clase Object. Metodos: equals, clone, notify, wait, etc.

• La herencia es importante para reusar código y uso del polimorfismo.

Page 9: SCJP Luis Loor Verónica Carrasco

HerenciaReuso de código• Crear clases generales y clases mas

especializadas. Las clases especializadas deben heredar de las clases generales.

Page 10: SCJP Luis Loor Verónica Carrasco

Herencia

• Las clases mas especializadas heredan los atributos y métodos de las clases mas generales.

Page 11: SCJP Luis Loor Verónica Carrasco

Herencia

Polimorfismo

• Muchas formas.• Toda subclase puede ser ubicada en base a la

clase general de la cual se extiende.• Ejemplo:

Page 12: SCJP Luis Loor Verónica Carrasco

Herencia

• Otra clase con un método que reciba un argumento de tipo GameShape, puede resolver cualquier tipo de objeto que sea de tipo GameShape o cualquier subclase de esta.

Page 13: SCJP Luis Loor Verónica Carrasco

Herencia

• En polimorfismo, cuando se invoca a los argumentos de una clase general, no importa si se lo hace desde un subtipo, solo se pueden invocar los métodos de la clase general así el subtipo tenga implementado mas métodos.

Page 14: SCJP Luis Loor Verónica Carrasco

Herencia

Relaciones “IS-A” y/o “HAS-A”

• Objetivo:o Ver código y determinar si se muestran relaciones

“IS-A” y/o “HAS-A”

Page 15: SCJP Luis Loor Verónica Carrasco

Herencia

“IS-A”

• Basado en la herencia o implementación de interfaces

• “IS-A” -> this thing is a type of that thing (esta cosa es de tipo esa cosa)

• “IS-A” se expresa a través de extends y a través de implements

Page 16: SCJP Luis Loor Verónica Carrasco

Herencia

Ejemplo:• Que podríamos decir de la clase Subaru y Car?

Page 17: SCJP Luis Loor Verónica Carrasco

Herencia

Más complejidad…

Subaru “is a” CarSubaru “is a” VehicleCar “is a” Vehicle

Page 18: SCJP Luis Loor Verónica Carrasco

Herencia

“HAS-A”

• Se basan en el uso mas que en la herencia• A “HAS-A” C si A tiene una referencia a una

instancia de la clase C.

Page 19: SCJP Luis Loor Verónica Carrasco

Polimorfismo

Objetivo:5.2 Determinar que un codigo implementa polimorfismo. Determinar cuando sería necesario hacer un casting y reconocer los errores de compilacion y de ejecución

Page 20: SCJP Luis Loor Verónica Carrasco

Polimorfismo

• Cualquier objeto Java que puede pasar mas de un prueba IS-A puede ser considerado polimorfico.

• Entonces a excepción del objeto tipo Object, todos los objetos de java poseen polimorfismo o son polimorficos (pasan la prueba para el tipo Objeto y para su propio tipo).

Page 21: SCJP Luis Loor Verónica Carrasco

Polimorfismo

• La única manera de acceder a un objeto es a través de una referencia:

• Recordar• Una referencia puede ser de un solo tipo y declarada

una sola vez, ese tipo no puede ser cambiado (Sin embargo el objeto al cual hace referencia si puede cambiar).

• Una referencia es una variable, entonces puede ser asinganda a otros objetos(a menos que la referencia sea declarada como FINAL)

• Un tipo de referencia variable determina los métodos que pueden ser invocados en el objeto al cual la variable hace referencia.

Page 22: SCJP Luis Loor Verónica Carrasco

Polimorfismo• Una variable de referencia se puede referir a cualquier objeto del mismo tipo, o se puede

referir a cualquier subtipo del tipo declarado.

public class SuperClase { public int metodoSuperClase(){ int numero = 2; return numero; } }

public class ExtiendoSuperClase extends SuperClase{ int numero = metodoSuperClase(); }

public class pruebasCap1 { SuperClase mySuperClase = new SuperClase(); ExtiendoSuperClase myExtSuperClase = new ExtiendoSuperClase();

public void metodo(){ mySuperClase = myExtSuperClase; } }

Page 23: SCJP Luis Loor Verónica Carrasco

• Una variable de referencia puede ser de tipo clase o de tipo interfaz. Si es de tipo interfaz, entonces puede hacer referencia a cualquier objeto o clase que implemente dicha interfaz.

• Una clase solo puede tener una inmediata súper clase:

class PlayerPiece extends GameShape, Animatable { // Incorrecto!// aquí va el código}

• Usar interfaces:

public interface Animatable {public void animate();}

class PlayerPiece extends GameShape implements Animatable {public void movePiece() {System.out.println("moving game piece");}public void animate() {System.out.println("animating...");}// more code}

Page 24: SCJP Luis Loor Verónica Carrasco

• PlayerPiece pasa la prueba IS-A para GameShape y para Animatable, entonces puede ser tratada polimorficamente como una de cuatro cosas en un instante de tiempo, dependiendo del tipo declarado y la variable de referencia.o Un objeto (todo objeto hereda de Object)o Un GameShape (PlayerPiece hereda de

GameShape)o Un PlayerPiece (lo que realmente es)o Un Animatable (PlayerPiece implementa Animatable)

Page 25: SCJP Luis Loor Verónica Carrasco

class GameShape {public void displayShape() {System.out.println("displaying shape");}}class PlayerPiece extends GameShape{ }

• Declaraciones legales:o PlayerPiece player = new PlayerPiece();o Object o = player;o GameShape shape = player;o Animatable mover = player;

• Cual de estas variables puede invocar al método displayShape() ??• La variable mover, que métodos puede invocar??

Page 26: SCJP Luis Loor Verónica Carrasco

Objetivo

Determinar correctamente si un método es sobre escrito o sobre cargado.

Page 27: SCJP Luis Loor Verónica Carrasco

Overriding methods

• Cuando se hereda un método desde una clase padre, éste método puede ser sobrescrito (a menos que sea marcado como final).

• Beneficio: Definir el comportamiento específico para un subclase.

Page 28: SCJP Luis Loor Verónica Carrasco

Overriding methods

• Ejemplo de sobre escritura de un método.

• Para clases abstractas la sobre escritura es “casi una obligación”

Page 29: SCJP Luis Loor Verónica Carrasco

Overriding methods

Un caso más complejo (Polimorfismo incluido)Con el polimorfismo hay que tener cuidado a la hora de saber qué métodos sobre escritos se invocan al momento de referenciar objetos.

Analicemos el siguiente código.

Page 30: SCJP Luis Loor Verónica Carrasco

Overriding methods

Page 31: SCJP Luis Loor Verónica Carrasco

Overriding methods

a.eat() // qué método se invoca?

b.eat() // qué método se invoca?

b.buck() // es código válido? Porqué?

Horse horse = new Animal() // es código válido? Porqué?

Page 32: SCJP Luis Loor Verónica Carrasco

Overriding methods

Reglas para sobre escribir métodos.• La lista de argumentos deben ser iguales.• Mismo tipo de retorno.• El nivel de acceso no puede ser más restrictivo que el

declarado en el método a sobrescribir.• El nivel de acceso puede ser menos restrictivo.• Sólo se puede hacer sobrescribir métodos de instancia

a través de una subclase que los herede.• Se puede sobrescribir métodos de una super clase no

marcados como final o private (dentro del mismo paquete)

Page 33: SCJP Luis Loor Verónica Carrasco

Overriding methods

• En paquetes diferentes, sólo aquellos marcados como public o protected.

• No se pueden sobrescribir métodos marcados como final.

• No se pueden sobrescribir métodos marcados como static.

Page 34: SCJP Luis Loor Verónica Carrasco

Overriding methods

• Analicemos el siguiente método.• Compila o no compila?

Page 35: SCJP Luis Loor Verónica Carrasco

Overriding methods

Invocando la versión del método sobrescrito definido en la superclase.

Para esto se utiliza la palabra super.

Page 36: SCJP Luis Loor Verónica Carrasco

Overloading methods

• La sobrecarga de métodos permite usar el mismo nombre de un método de una clase pero con diferentes lista de argumentos y opcionalmente diferente tipo de retorno.

• Reglas.o Se debe cambiar la lista de argumentos.o Se puede cambiar el tipo de retorno.o Se puede cambiar el nivel de acceso.o Se puede declarar checked exceptions.

Page 37: SCJP Luis Loor Verónica Carrasco

Overloading methods

Llamada a métodos sobrecargados

La invocación de los métodos sobrecargados depende de los argumentos que reciba cada método.

Page 38: SCJP Luis Loor Verónica Carrasco

Overloading methods

Page 39: SCJP Luis Loor Verónica Carrasco

Overloading methods

Invocación de métodos sobrecargados (mas complejo)

Examinemos el siguiente código.

Page 40: SCJP Luis Loor Verónica Carrasco

Overloading methods

• Cual es la salida en consola?

Page 41: SCJP Luis Loor Verónica Carrasco

Overloading methods

Y ahora? Cuál es la salida?

Page 42: SCJP Luis Loor Verónica Carrasco

Overloading methods

Polimorfismo en métodos sobrescritos y sobrecargados

Cuidado en ocasiones un método está sobrecargado y sobrescrito a la vez.

Page 43: SCJP Luis Loor Verónica Carrasco

Overloading methods

• Dar los resultados en cada caso

Page 44: SCJP Luis Loor Verónica Carrasco

Overriding/Overloading

Puntos claves

• Sobrecarga se detecta en el tiempo de complicación• Sobrescritura se detecta en tiempo de ejecución.

Page 45: SCJP Luis Loor Verónica Carrasco

Casting

Cast conocido como downcast porque hacemos el casting hacia abajo en el árbol de herencia hacia una clase más especifica. En este caso es correcto porque antes nos aseguramos (con instanceof) que sea de tipo Dog.

Page 46: SCJP Luis Loor Verónica Carrasco

Casting

El compilador no se da cuenta del error porque todo lo que puede hacer es verificar que los dos tipos estén en el mismo árbol de herencia.

Page 47: SCJP Luis Loor Verónica Carrasco

Casting

Page 48: SCJP Luis Loor Verónica Carrasco

Casting

El otro tipo de casting, el upcasting (casting hacia arriba del árbol de jerarquía, hacia una clase más general), trabaja implícitamente

Page 49: SCJP Luis Loor Verónica Carrasco

Para el examen

Page 50: SCJP Luis Loor Verónica Carrasco

Objetivo

Poder escribir código implementando interfaces.

Page 51: SCJP Luis Loor Verónica Carrasco

Interface

• Al implementar una interface se garantiza que se provee una implementación para cada método definido en la interface.

• Para implementar una interface se necesita anteponer la palabra “implements” seguido del nombre de la interface que se va a implementar.

Page 52: SCJP Luis Loor Verónica Carrasco

Interface

• Ejemplo: La clase Ball implementa la interface Bounceable

Page 53: SCJP Luis Loor Verónica Carrasco

Interface

• Reglas: Una clase (no abstracta) que implementa una interfaz debe hacer lo siguiente.o Proveer una implementación para todos los métodos

declarados en la interfaz.o Seguir todas las reglas para la sobrescritura.o Declarar sólo excepciones declaradas (o subclases)

en la interfaz.o Mantener el misma la firma del método de la interfaz

así como el tipo de retorno. No es necesario declarar las excepciones que están en el método de la interfaz.

Page 54: SCJP Luis Loor Verónica Carrasco

Interface

• Si una clase es abstracta no necesita implementar los métodos de la interfaz. Lo hará la primera clase que herede de la clase abstracta.

Page 55: SCJP Luis Loor Verónica Carrasco

Interface

• Una clase puede implementar varias interfaces.

• Una interface puede extender de otras interfaces, mas no puede implementar otra interfaz.

• Esto significa que la primera clase que implemente la interface Bounceable deberá no solo implementar los métodos definidos en Bounceable sino aquellos tambien definidos en Moveable.

Page 56: SCJP Luis Loor Verónica Carrasco

Interface

• Ejemplo:

Page 57: SCJP Luis Loor Verónica Carrasco

Interface

• Ejercicio

Page 58: SCJP Luis Loor Verónica Carrasco

Tipos de retornos legales

• Lo que está permitido declarar como tipo de retorno, depende principalmente si se está sobreescribiendo, sobrecargando o declarando un nuevo método.

Page 59: SCJP Luis Loor Verónica Carrasco

Tipos de Retorno en métodos Sobrecargados

• Los métodos sobrecargados no es mas que reutilizar nombres de los métodos.

• Un método sobrecargados es un método completamente diferente de cualquier otro con el mismo nombre, es decir, el tipo de retorno puede cambiar (pero debe cambiar también la lista de argumentos)

public class Foo{void go() { }}public class Bar extends Foo {String go(int x) {return null;}}

Page 60: SCJP Luis Loor Verónica Carrasco

Sobreescritura y Tipos de Retorno y Retornos Covariantes

Desde Java 5 podemos cambiar el tipo de retorno al sobreescribir un método, siempre y cuando, el nuevo tipo de retorno sea un subtipo del anterior.

Page 61: SCJP Luis Loor Verónica Carrasco

Retornando un Valor

• Se deben recordar 6 reglas para el retorno de un valor

1.Se puede retornar nulo si se declaro la referencia a un objeto como tipo de retorno.

• Es legal que un array sea un tipo de retorno

Page 62: SCJP Luis Loor Verónica Carrasco

Retornando un Valor(Cont..)1. En un método con un tipo de retorno primitivo, se puede

retornar cualquier valor o variable que pueda ser convertido implícitamente al tipo de retorno declarado.

2. En un método con un tipo de retorno primitivo, se puede retornar cualquier valor o variable al cual se le pueda hacer un cast explicito hacia el tipo de retorno declarado.

Page 63: SCJP Luis Loor Verónica Carrasco

Retornando un Valor(Cont…)

1. No se debe retornar nada si se declara un tipo de retorno void.

2. En un método cuyo retorno es una referencia a un objeto, se puede retornar cualquier tipo de objeto al cual se le pueda hacer un cast implícito hacia el tipo de retorno declarado.

Page 64: SCJP Luis Loor Verónica Carrasco

Para el Examen

Page 65: SCJP Luis Loor Verónica Carrasco

Objetivo

Dado un conjunto clases, determinar que constructor es creado.

Desarrollar codigo que implemente metodos sobrecargados y sobrescritos y que asi mismo se declaren constructores con las mismas carateristicas.

Page 66: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

• Para crear un objeto hay que llamar a su constructor (incluyendo los constructores de las super clases).

• Se tiene al menos un constructor. Constructor default no se necesita escribirlo.

• No tienen tipo de retorno y el nombre debe ser el mismo que el de la clase.

Page 67: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

• Para inicializar variables

• Al escribir un codigo para el constructor, el constructor default no puede ser invocado a menos que sea tambien declarado.

Page 68: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

• Cadena de eventos.

Page 69: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

• Reglas para los constructores

• Pueden tener cualquier tipo de modificador de acceso, incluido private.

• Deben tener el mismo nombre de la clase• No deben retornar nada• Si no se escribe ningun constructor, el compilador crea

el default.

Page 70: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

• Cosntructor default no tiene argumentos• Si se sobrecarga el constructor, el compilador no provee

el constructor default/• Cada constructor tiene como primera sentencia una

llamada a un constructor sobrecargado o una llamada al constructor de una super clase. De todas maneras esto lo hace el compilador.

• La llamada a super puede a un constructor con o sin argumentos.

Page 71: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

• Un constructor sin argumentos, no es necesariamente el default.

• No se pueden hacer llamadas a metodos de instancia ni accesar a variables de instancia sino hasta que se ejecute el super constructor.

• Las clases abstractas tambien tienen constructor y este es llamado por una subclase.

• Las interfaces no tienen constructor.

Page 72: SCJP Luis Loor Verónica Carrasco

Constructors and InstantiationDeterminar si el constructor default es creado

Page 73: SCJP Luis Loor Verónica Carrasco

Constructors and InstantiationHay que tener mucho cuidado con la herencia.

• A la hora de la llamada a super(), la superclase debe proveer un constructor que no tome argumentos.

Page 74: SCJP Luis Loor Verónica Carrasco

Constructors and InstantiationOverloaded Constructors

• Tener mulitples versiones del constructor

Page 75: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

• Ofrecer varias maneras de crear un objeto.

• Ejemplo

Page 76: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

• Punto importante: La primera línea de un constructor debe ser una llamada al método super() o al método this().

• Esta llamada puede ser implícita por parte del compilador.

Page 77: SCJP Luis Loor Verónica Carrasco

Statics

• Variables y métodos marcados como static pertenecen a la clase y no a una instancia en particular, es decir, se los puede usar sin tener una instancia de la clase, solo es necesario que la clase este disponible.

• Variables y métodos static se comportan siempre de misma manera, es decir, no dependen del estado (valores de la variable de instancia) del objeto.

• Una variable static va a ser compartida por todas las instancias de la clase, sólo hay una copia.

Page 78: SCJP Luis Loor Verónica Carrasco

Statics

Esto da como resultado: La cuenta de Frog es ahora: 3

Si la variable frogCount no fuera static su valor se inicializaría al valor default en cada nueva instancia.

Page 79: SCJP Luis Loor Verónica Carrasco

Statics

Si la variable no hubiese sido static, nos daría un error de compilación (error: no se pude hacer una referencia estática a un campo no estático).

Page 80: SCJP Luis Loor Verónica Carrasco

Statics

• Piense, static = class, no static = instancia. Que la JVM llame a un método static significa que la JVM no tiene que crear una instancia de la clase para correr el código, por esto se da el error (el compilador no sabe que variable frogCount del objeto Frog se esta tratando de imprimir). Lo mismo aplica en los métodos, un método static no puede invocar directamente a un método no static.

Page 81: SCJP Luis Loor Verónica Carrasco

Para el examen

Page 82: SCJP Luis Loor Verónica Carrasco

Para el examen

Page 83: SCJP Luis Loor Verónica Carrasco

Accediendo a métodos y variables estáticas

• Para acceder a un método o variable static debemos usar el nombre de clase en lugar de usar una referencia a una instancia.

Page 84: SCJP Luis Loor Verónica Carrasco

Accediendo a métodos y variables estáticas

Page 85: SCJP Luis Loor Verónica Carrasco

Accediendo a métodos y variables estáticas

• Las variables estáticas no pueden ser sobreescritas. Esto no quiere decir que no se puedan redefinir, pero redefinir y sobrescribir no es lo mismo.

• El resultado de esto es: a a a

• Recordar que a[x].doStuff() es un truco sintáctico, el compilador lo sustituira por algo asi como Animal.doStuff().

Page 86: SCJP Luis Loor Verónica Carrasco

Objetivo

Determinar correctamente si un método es sobre escrito o sobre cargado.

Page 87: SCJP Luis Loor Verónica Carrasco

Coupling/ Cohesion

• Coupling es el grado en que una clase conoce acerca de otra clase.

• Si una clase A conoce solo aquello que la clase B expone a través de su interface, entonces el Coupling es bueno.

• Por el contrario Si A conoce más de lo que la interface de B expone, entonces el Coupling es malo.

Page 88: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

Page 89: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

• La clase DoTaxes conoce la variable salesRate• La clase SalesTaxRates conoce la variable rate

Page 90: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

• Cohesion es como una clase es diseñada.

• Una buena cohesion significa clases bien diseñadas y centradas en un propósito específico.

• Ejemplo: Mala Cohesion

Page 91: SCJP Luis Loor Verónica Carrasco

Constructors and Instantiation

• Examinemos este código. (Buena cohesion)