SCJP Luis Loor Verónica Carrasco

Post on 24-Jan-2016

53 views 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 of SCJP Luis Loor Verónica Carrasco

SCJPLuis 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.

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; }

}

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>.

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; }

}

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

Herencia

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

“has-a”

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.

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

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

Herencia

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

Herencia

Polimorfismo

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

clase general de la cual se extiende.• Ejemplo:

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.

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.

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”

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

Herencia

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

Herencia

Más complejidad…

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

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.

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

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).

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.

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; } }

• 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}

• 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)

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??

Objetivo

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

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.

Overriding methods

• Ejemplo de sobre escritura de un método.

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

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.

Overriding methods

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é?

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)

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.

Overriding methods

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

Overriding methods

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

Para esto se utiliza la palabra super.

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.

Overloading methods

Llamada a métodos sobrecargados

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

Overloading methods

Overloading methods

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

Examinemos el siguiente código.

Overloading methods

• Cual es la salida en consola?

Overloading methods

Y ahora? Cuál es la salida?

Overloading methods

Polimorfismo en métodos sobrescritos y sobrecargados

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

Overloading methods

• Dar los resultados en cada caso

Overriding/Overloading

Puntos claves

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

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.

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.

Casting

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

Para el examen

Objetivo

Poder escribir código implementando interfaces.

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.

Interface

• Ejemplo: La clase Ball implementa la interface Bounceable

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.

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.

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.

Interface

• Ejemplo:

Interface

• Ejercicio

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.

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;}}

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.

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

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.

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.

Para el Examen

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.

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.

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.

Constructors and Instantiation

• Cadena de eventos.

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.

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.

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.

Constructors and InstantiationDeterminar si el constructor default es creado

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.

Constructors and InstantiationOverloaded Constructors

• Tener mulitples versiones del constructor

Constructors and Instantiation

• Ofrecer varias maneras de crear un objeto.

• Ejemplo

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.

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.

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.

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).

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.

Para el examen

Para el examen

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.

Accediendo a métodos y variables estáticas

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().

Objetivo

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

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.

Constructors and Instantiation

Constructors and Instantiation

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

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

Constructors and Instantiation

• Examinemos este código. (Buena cohesion)