Upload
basilio-rogel
View
24
Download
0
Embed Size (px)
Citation preview
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
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
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; }
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); } }
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
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
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( )
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
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
Convierte un objeto en String
Usado durante la concatenación de String
Sobrescribir este método para brindar información sobre el objeto
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
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; }
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++; } }
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)
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 TestStaticInitcounter = 47
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
Constantes:
public class Bank {private static final
doubleDEFAULT_INTEREST_RATE=3.2;... // more declarations}
Atributo final en blanco de instanciapublic class Customer {private final long customerID;public Customer() {
customerID = createID();}public long getID() {
return customerID;}private long createID() {
return ... // generate new ID}}
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
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
El compilar previene el intanciar una clase abstracta
Hacer new de una clase abstracta no esta permitido
Puede tener:₋ Atributos₋ Métodos concretos₋ Constructores
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
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
}}
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 */ }
}
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(); }}
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
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
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
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
Nested clases pueden ser declaradas static
Las clases nested no static son llamadas inner clases
Qué es java.lang? Clase Object Wrapper Classes Utilidades de Conversión de tipos Clase String Clase StringBuffer Clase Math
Thinking in Java₋ Bruce Eckel
The Java Tutorial₋ http://download.oracle.com/javase/tutorial/