La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Curso de java básico (scjp)

Presentaciones similares


Presentación del tema: "Curso de java básico (scjp)"— Transcripción de la presentación:

1 Curso de java básico (scjp)

2 Características avanzadas
de clases

3 Objetivos generales Operador == Método: equals() Método: hashCode()
Método: toString() Palabra: static Atributos de clase Métodos de clase Palabra final Clases abstractas e Interfaces Nested e Inner Clases Ejemplos

4 Operador == Vs. equals El operador == determina si dos referencias son idénticas (Si hacen referencia al mismo objeto) El método equals determina si los objetos son “iguales”, pero no necesariamente idénticos. La implementación de equals en la clase Object utiliza el operador == Los usuarios pueden sobrescribir el método equals para implementar el testeo de igualdad específico de su lógica El operador ==, evalúa si la referencia de dos objetos es la misma. Es utilizado en condicionales, para igualar números primitivos. Ej: if(3==3) El método equals, puede ser sobre escrito, de manera de definir un propio criterio de comparación, sin tener en cuenta la referencia del objeto, sino los atributos de este. A continuación veremos un ejemplo.

5 Sobrescribiendo equals
public class MyDate { private int day; private int month; private int year; public MyDate(int day, int month, int year) { this.day = day; this.month = month; this.year = year; } En este ejemplo presentamos la clase Date, para el cual sobrescribiremos el método equals para compara objetos de tipo MyDate.

6 Sobrescribiendo equals
public boolean equals(Object o) { boolean result = false; if ( (o != null) && (o instanceof MyDate) ) { MyDate d = (MyDate) o; if ((day==d.day)&&(month==d.month)&&(year==d.year) ) { result = true; } return result; public int hashCode() { return (day ^ month ^ year); Al definir el método equals, estamos definiendo un criterio de comparación. En este caso, vemos que dos objetos de tipo MyDate, serán iguales si el valor de los atributos day, month e year, son los mismos. Ejemplo: MyDate d1 = new MyDate(1,1,2011); MyDate d2 = new MyDate(1,1,2011); if(d1.equals(d2)){ System.out.println(“Son iguales”);} else {System.out.println(“NO son iguales”);} d1 = new MyDate(1,1,2011); d2 = new MyDate(1,2,2011); Para el primer caso, d1 y d2 son iguales, por lo que se imprimirá: Son iguales. En el segundo caso, d1 y d2, no son iguales, se imprimirá: No son iguales.

7 Contrato equals Es reflexivo
Para cualquier variable de referencia x, x.equals(x) debe retornar true. Es simétrico x.equals(y) == true si y solo si y.equals(x) == true Es transitiva x.equals(y) == true y y.equals(z) == true, entonces x.equals(z) == true

8 Contrato equals Es consistente
Ante múltiples invocaciones iguales si no se producen cambios en la información utilizada para el cálculo de equals, el valor de retorno debería ser el mismo Para cualquier x != null, x.equals(null) debería ser falso

9 Contrato equals Si dos objetos son considerados iguales utilizando el método equals( ), entonces el valor de hashcode debe ser idéntico Por esto, se recomienda sobrescribir hashCode( ) si se sobrescribe equals( )

10 Sobrescribiendo hashCode()
El valor hashcode de un objeto es utilizado por algunas clases que implementan colecciones. Colecciones como HashMap y HashSet utilizan este valor para determinar donde deben colocar el objeto en su estructura El valor de hashCode no necesariamente es único. En la figura vemos cómo se aplica la función hashCode. Para cada clave, se aplica la función hashCode de manera de obtener en que lugar se debe ubicar el objeto en su estructura. En este caso, se trata de un hashmap.

11 Reglas para hashCode()
Durante la misma ejecución el hashcode de un objeto debe ser el mismo, mientras no se modifique información que altere la comparación equals En esta tabla, se muestra el uso del método hashCode junto con el equals. Por ejemplo, si dos objetos x e y son iguales es decir: x.equals(y)==true, entonces x.hashCode()==y.hashCode().

12 Método toString() Convierte un objeto en String
Usado durante la concatenación de String Sobrescribir este método para brindar información sobre el objeto Un ejemplo del método toString, podría ser el siguiente: @Override public String toString() { // TODO Auto-generated method stub return "NOMBRE: "+ this.nombre + " APELLIDO: " + this.apellido + " DIRECCION: "+this.direccion; }

13 Palabra: static Es utilizada como un modificador en variables, métodos y “nested” clases (anidadas). Declara que el atributo o método esta asociado a la clase y no a una instancia de objeto en particular Debido a lo antes mencionado, los miembros static son llamados “miembros de clase”, como atributo de clase o método de clase La palabra static, forma parte del conjunto de palabras reservadas del lenguaje. Las variables, métodos o atributos declarados como static, son propios de la clase y no del objeto. No se crean instancias de las clases static, es decir que no se crean objetos de dichas clases.

14 Atributos de Clase Son compartidos a lo largo de todas las instancias de la clase public class Count { private int serialNumber; private static int counter = 0; public Count() { counter++; serialNumber = counter; } En este ejemplo, vemos que la clase Count, posee una variable estática: counter, la cual es un contador. Dicha variable es común para todos los objetos creados de ese tipo.

15 Atributos de Clase Pueden ser accedidos desde fuera de la clase, sin una instancia de la clase(si esta marcada como public) public class OtherClass { public void incrementNumber() { Count1.counter++; } Dado que dichas variables estáticas son propias de la clase y no del objeto, para acceder a ella no es necesario hacerlo a través de un objeto, sino que puede ser accedida de la siguiente manera: public class Count { private int serialNumber; public static int counter = 0; public Count() { counter++; serialNumber = counter; } Count.counter;

16 Inicializaciones de Static
Una clase puede contener código en un bloque static que no pertenece a ningún método. Los bloques de código static ejecutan solo una vez, cuando la clase se carga Un bloque static se utiliza usualmente para inicializar atributos static (de la clase)

17 Inicializaciones de Static
public class Count4 { public static int counter; static { counter = Integer.getInteger("myApp.Count4.counter").intValue(); } public class TestStaticInit { public static void main(String[] args) { System.out.println("counter = "+ Count4.counter); La salida del programa es la siguiente: java –DmyApp.Count4.counter=47 TestStaticInit counter = 47 En este caso, vemos la definición de una clase, que posee una variable publica de tipo static. La clase Test, intenta acceder a dicha variable e imprimir su valor.

18 Palabra: final No se puede extender una clase final
No se puede sobrescribir un método final Una variable final es una constante Se puede setear una variable final solo una vez, pero la asignación puede ser independiente de la declaración Se puede setear una variable final solo una vez, pero la asignación puede ser independiente de la declaración , esta es llamada “variable final en blanco” Un atributo final en blanco de instancia debe ser seteado en cada constructor. Una variable final en blanco de un método, debe ser seteada en el cuerpo del método antes de ser utilizada. Como se menciono anteriormente, la clase String es de tipo final, por lo que esta no puede ser extendida. A continuación, veremos un ejemplo.

19 Variables final Constantes: public class Bank {
private static final doubleDEFAULT_INTEREST_RATE=3.2; ... // more declarations } En este ejemplo, tenemos la clase Bank, en la cual se define una variable de tipo static y final, por lo que dicha variable es una constante de la clase. Dicha variable es inicializada, por lo que no esta en blanco. A continuación, veremos un ejemplo de una variable final en blanco.

20 Variables final Atributo final en blanco de instancia
public class Customer { private final long customerID; public Customer() { customerID = createID(); } public long getID() { return customerID; private long createID() { return ... // generate new ID En este ejemplo, definimos la clase Customer, donde la varibale customerID es de tipo final en blanco. Dicha variable es inicializada al crear un nuevo objeto de dicha clase,en el constructor, donde se llama al método createID().

21 Clases Abstractas El problema:
Cuando en una superclase se tiene que implementar un método que van a heredar sus subclases y no se le puede dar comportamiento. Cuando diseñamos una clase solo para heredar y no queremos permitir crear una instancia nunca Una clase abstracta, define características comunes al igual que una clase cualqueira. Sin embargo, no se pueden crear instancias de las mismas, es decir, que no se pueden crear objetos de dicha clase. Ejemplo: public abstract class Persona{ private String nombre; private String apellido; //gets y sets } public class Empleado extends Persona{ private int nroEmpleado; //constructor

22 Clases Abstractas Java permite al diseñador que una superclase declara un método que no provee implementación. Este método es llamado abstracto. Se utiliza la palabra reservada abstract La implementación del método la va a realizar la subclase. Cualquier clase con por lo menos un método abstracta, es una clase abstracta y se tiene que declarar de esta forma Ejemplo: abstract class FiguraGeometrica {         abstract void dibujar();     } class Circulo extends FiguraGeometrica {         void dibujar() {         // codigo para dibujar Circulo             } }  En este caso se define una clase FiguraGeometrica, la cual posee un método abstracto, dibujar,. La clase Círculo, extiende dicha clase y define el contenido del método dibujar.

23 Clases Abstractas El compilar previene el intanciar una clase abstracta Hacer new de una clase abstracta no esta permitido Puede tener: Atributos Métodos concretos Constructores Es buen consejo hacer los constructores protected dado que se hacen para que los invoquen las subclases Si una clase extiende una clase abstracta y no implementa los métodos abstractos, también es una clase abstracta

24 Interfaces Una interfaz pública es un contrato entre el código cliente y la clase que implementa esa interfaz. En java, es la declaración formal de dicho contrato y todos los métodos no tienen implementación Muchas clases no relacionadas pueden implementar la misma interfase Una clase puede implementar muchas interfases no relacionadas Una interfaz define un contrato, un conjunto de funcionalidades. No se pueden crear instancias, es decir objetos de una interfaz. Si se puede implementar una interfaz, lo cual consiste en redefinir los métodos definidos en esta. Sintaxis: < modifier> class < name> [extends < superclass>][implements < interface> [,< interface>]* ] { < declarations>* } Una interfase puede declarar solo constantes: public, static y final

25 Ejemplo:Interface public interface Flyer { public void takeOff();
public void land(); public void fly(); } public class Airplane implements Flyer { public void takeOff() { // accelerate until lift-off // raise landing gear public void land() { // lower landing gear // deccelerate and lower flaps until touch-down // apply breaks public void fly() { // keep those engines running En este ejemplo, se define una interface Flyer, la cual define cierto comportamiento y funcionalidades. La clase Airplane, implementa dicha interfaz, por lo que re define los metodos definidos en el contrato de Flyer. Para representar la implementacion de una interfaz, se utiliza la notacion del grafico, del cual se lee que la clase Airplane implementa la interfaz Flyer.

26 Ejemplo:Interface Como vemos, una interfaz define comportamiento, el cual puede ser utilizado por cualquier clase. Al definir una interfaz, se intenta determinar funcionalidades que puedan ser utilizadas por clases distintas. En este ejemplo, tenemos que las clases Airplane, Bird y Superman, implementan la clase Flyer, ya que comparten dicho comportamiento, pero no son iguales. No seria coherente que la clase Auto, implementara dicha interfaz, ya que este no posee el comportamiento definido por Flyer.

27 Ejemplo:Interface Este diagrama es similar al anterior, solo que se le han agregado clases abstractas: Vehicle, HomoSapien y Animal. Ninguna de las clases poseen el comportamiento de Flyer, por lo que no seria adecuado que implementaran dicha interfaz.

28 Ejemplo:Interface public class Bird extends Animal implements Flyer {
public void takeOff() { /* take-off implementation */ } public void land() { /* landing implementation */ } public void fly() { /* fly implementation */ } public void buildNest() { /* nest building behavior */ } public void layEggs() { /* egg laying behavior */ } public void eat() { /* override eating behavior */ } } En este ejemplo, vemos que la clase Bird, hereda de la clase Animal e implementa la clase Flyer. Tener en cuenta que primero se indica la herencia a través de la palabra extends y luego la implementación de una interfaz, a través de implements. Se pueden implementar múltiples interfaces; para ello, se deben separar por comas. Ejemplo: public class Bird implements Flyer, Zoo{}

29 Ejemplo: Múltiples Interfaces
Como mencionamos anteriormente, se pueden implementar mas de una interfaz. En la figura anterior, vemos que la clase RiverBarge, implementa la interfaz Salier y hereda de la clase Vehicle. La clase Airplane, hereda de Vehicle e implementa Flyer. Finalmente, la clase SeaPlane, hereda de AirPlane e implementa Sailer.

30 Ejemplo: Múltiples Interfaces
public class Harbor { public static void main(String[] args) { Harbor bostonHarbor = new Harbor(); RiverBarge barge = new RiverBarge(); SeaPlane sPlane = new SeaPlane(); bostonHarbor.givePermissionToDock(barge); bostonHarbor.givePermissionToDock(sPlane); } private void givePermissionToDock(Sailer s) { s.dock(); En este ejemplo, se declaran dos objetos de manera de utilizar los métodos implementados provenientes de la interfaz Sailer.

31 Uso de Interfaces Declarar métodos que una o más clases esperan implementar Determinar una interfaz de objetos para programar, sin revelar el cuerpo actual de la clase. Capturar similitudes ente clases que no están relacionadas, sin forzar una relación entre ambas Simular herencia múltiple declarando que una clase implementa varias interfases

32 Nested Clases Agregadas en Java™ Development Kit (JDK™) 1.1
Permite la definición de una clase dentro de otra definición de clase Grupo de clases que lógicamente tiene sentido que estén juntas Se puede controlar la visibilidad de una dentro de la otra Se utilizan para implementar detalles de implementación que no deben ser compartidas por otras clases Las nested clases, son clases definidas dentro de otra clase. Para que definir nested clases? -Permite agrupar de manera logica a las clases que son usadas en un solo lugar -Hacen mas mantenible y legible el codigo

33 Ejemplo: Nested Clases
En este ejemplo vemos la definición de una clase llamada Outer1. Dentro de esta, tenemos la clase Nested. Se pueden crear objetos de las clases nested, como se muestra en el ejemplo, así como acceder a sus atributos.

34 Ejemplo: Nested Clases
En este ejemplo, se define la clase Outer2 junto con su nested clase. En la clase de prueba: TestNested, podemos verificar de que manera se puede acceder a la clase nested y sus métodos.

35 Ejemplo: Nested Clases
En este ejemplo, definimos la clase Outer3 junto con su nested class. El objetivo de este ejemplo, es ver el manejo de las variables/atributos entre ambas clases. Como ven, se puede acceder a los atributos de la Outer class desde la nested class. En el metodo doStuff, se utiliza una nueva palabra reservada: this, la cual hace referencia a dicha clase: Nested, de manera de identificar el atributo de clase size con la variable recibida en el método size.

36 Propiedades: Nested Clases
Dentro del alcance que contiene la definición de la clase, se puede hacer referencia a la misma por el nombre. Fuera de dicho alcance se debe usar el nombre completo(ejemplo Outer.Nested) Puedo definir nested clases dentro de métodos. Estas clases se llaman locales. Las clases locales pueden acceder a variables locales, incluyendo argumentos del método, del bloque que la contenga, pero tienen que ser final

37 Propiedades: Nested Clases
Excepto la clases locales, las clases nested pueden ser declaradas con cualquier nivel de protección Las clases nested pueden ser abstractas Una interfaz puede ser nested, entonces puede ser implementada en forma normal o por otra clase nested Las clases nested pueden acceder miembros static de la clase que la contiene Las clases nested pueden ser publicas, privadas, abstractas. Una interfaz puede ser definida dentro de otra clase: nested class.

38 Nested Clases e Inner Clases
Nested clases pueden ser declaradas static Las clases nested no static son llamadas inner clases

39 Resumen Qué es java.lang? Clase Object Wrapper Classes
Utilidades de Conversión de tipos Clase String Clase StringBuffer Clase Math

40 Referencias Thinking in Java Bruce Eckel The Java Tutorial


Descargar ppt "Curso de java básico (scjp)"

Presentaciones similares


Anuncios Google