Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
>Este pattern tena muchos problemas (no tenan namespace, no eran typesafe, brittleness, informacin nula al imprimirlos).
Java 5.0
> Soporta enums como un tipo. > Son una clase. > Por lo tanto, pueden tener mtodos y variables, implementar interfaces, y ms. > Proveen implementaciones de los mtodos heredados de Object. > Son Comparables y Serializables.
public Rank rank() { return rank; } public Suit suit() { return suit; } public String toString() { return rank + " de" + suit; } private static final List<Card> protoDeck = new ArrayList<Card>(); // Initializa el mazo static { for (Suit suit : Suit.values()) for (Rank rank : Rank.values()) protoDeck.add(new Card(rank, suit)); } public static ArrayList<Card> newDeck() { return new ArrayList<Card>(protoDeck); // Retorna una copia del mazo. } }
Ejecucin de Deal
$ java Deal 4 5 [FOUR of HEARTS, NINE of DIAMONDS, QUEEN of SPADES, ACE of SPADES, NINE of SPADES] [DEUCE of HEARTS, EIGHT of SPADES, JACK of DIAMONDS, TEN of CLUBS, SEVEN of SPADES] [FIVE of HEARTS, FOUR of DIAMONDS, SIX of DIAMONDS, NINE of CLUBS, JACK of CLUBS] [SEVEN of HEARTS, SIX of CLUBS, DEUCE of DIAMONDS, THREE of SPADES, EIGHT of CLUBS]
Agregar operaciones
public enum MERCURY VENUS EARTH MARS JUPITER SATURN URANUS NEPTUNE PLUTO Planet { (3.303e+23, (4.869e+24, (5.976e+24, (6.421e+23, (1.9e+27, (5.688e+26, (8.686e+25, (1.024e+26, (1.27e+22, 2.4397e6), 6.0518e6), 6.37814e6), 3.3972e6), 7.1492e7), 6.0268e7), 2.5559e7), 2.4746e7), 1.137e6);
private final double mass; // in kilograms private final double radius; // in meters Planet(double mass, double radius) { this.mass = mass; this.radius = radius; }
public double mass() { return mass; } public double radius() { return radius; } // universal gravitational constant (m3 kg-1 s-2) public static final double G = 6.67300E-11; public double surfaceGravity() { return G * mass / (radius * radius); } public double surfaceWeight(double otherMass) { return otherMass * surfaceGravity(); } }
SCJP 6
Clase 2 POO
AGENDA
> Encapsulamiento > Herencia (es un / tiene un) > Polimorfismo > Interfaces > Valores de retorno legales > Constructores > Mtodos y variables estticas
Encapsulamiento
> Oculta ciertos elementos de la implementacin de una clase proveyendo una interfaz pblica para los clientes. > Mantiene las variables de instancia protegidas (private). > Se utilizan mtodos de accesos pblicos, forzando su utilizacin en vez de el acceso directo a las variables de instancia (set<Propiedad>, get<Propiedad>).
Encapsulamiento
ObjetoB.Metodo1()
Datos Objeto A
Datos Objeto B
Valor de retorno
Herencia
> El lenguaje Java permite que una clase herede funcionalidad de una nica clase. > Esto se conoce como herencia simple.
Scanner Impresora Deporte
Fotocopiadora
Ftbol
Rugby
Relaciones es un
> En POO, el concepto de es un se basa en la herencia de clases o implementacin de interfaces. Es un es una forma de decir Esta cosa es un tipo de esa otra.
Auto
Auto Deportivo
Relaciones Tiene un
> Estn basadas en el uso, ms que en la herencia. En otras palabras, la clase A tiene un B si el cdigo en la clase A tiene una referencia a una instancia de la clase B. > Por ejemplo: un caballo ES UN animal y TIENE UN cabestro. Escrito en Java, sera algo como:
public class Animal {} public class Caballo extends Animal { private Cabestro miCabestro; }
Polimorfismo
> Las invocaciones polimorficas a mtodos slo aplican a mtodos de instancia. > Siempre podremos referirnos a un objeto con una variable de un tipo ms general (una superclase o interfaz). > Por lo tanto, podemos hacer cosas como: Auto a = new AutoDeportivo();
Pregunta
public class Employee{ public void printDetail(){ system.out.println(Employee); } } public class Manager extends Employee{ public String department = Marketing; public void printDetail(){ system.out.println(Manager); } }
>Si hiciramos Employee e = new Manager(), podramos usar la variable department? y que resultado tendra la llamada a e.printDetail()?
Sobrescritura de mtodos
> Siempre que tengamos una clase que herede un mtodo de una superclase, tendremos la posibilidad de sobrescribir dicho mtodo. > Salvo que tal mtodo sea final o static. > El nmero y el tipo de los argumentos DEBEN ser iguales.
Sobrecarga de mtodos
>La sobrecarga de mtodos permite reusar el mismo nombre de un mtodo en una clase, pero con una lista de argumentos diferente. >Un mtodo sobrecargado DEBE cambiar la lista de argumentos respecto del original. >Un mtodo sobrecargado PUEDE cambiar el tipo del valor de retorno respecto del original.
public static void main (String [] args) { UsedCar uc= new UsedCar(); Car c = new Car(); BMW b = new BMW(); Car carRefToBMW= new BMW(); uc.doStuff(c); uc.doStuff(b); uc.doStuff(carRefToBMW); } }
En resumen
> La eleccin sobre que versin de un mtodo sobrescrito llamar, es hecha en tiempo de ejecucin, y se basa en el tipo del objeto. > Mientras que la eleccin sobre que versin de un mtodo sobrecargado llamar se basa en el tipo de la referencia del argumento que se pasa en tiempo de compilacin.
Ingeniero
Manager
Pregunta
Interface A { void methodA(); } public class Temp implements A{ void methodA() { } }
? ?
Valores de retorno
> En los mtodos sobrecargados, no podemos cambiar slo el tipo de retorno.
public class Foo{ void go() { } } public class Bar extends Foo{ String go() { // No legal return null; } }
Pregunta
1. 2. 3. 4. 5. 6. class Programmer { Programmer debug() { return this; } } class SCJP extends Programmer { // insertar el cdigo aqu }
> Cual de estas lneas har que el programa compile? (pueden ser varias)
> A. Programmer debug() { return this; } > B. SCJP debug() { return this; } > C. Object debug() { return this; } > D. int debug() { return 1; } > E. int debug(int x) { return 1; } > F. Object debug(int x) { return this; }
Constructores e instanciacin
> Los constructores son el cdigo que se ejecuta siempre que utilizamos la palabra new. > No solo se ejecuta el constructor de la clase, sino tambin todos los constructores de las superclases. > Todas las clases, incluso las abstractas DEBEN tener un constructor.
Constructores
> Dos puntos clave a tener en cuenta acerca de los constructores es que no deben tener tipo de retorno y sus nombres deben ser exactamente los mismos que los de las clases a las que pertenecen. En general, se los utiliza para inicializar los estados de las variables de instancia:
class Foo{ int size; String name; Foo(String name, int size) { this.name = name; this.size = size; } }
Constructores (II)
>Caballo c = new Caballo();
> Qu sucede realmente ante esta llamada? (asumiendo que Caballo extiende Animal y Animal extiende Object).
1. 2. 3. 4. Main llama a new Caballo(). Caballo llama a super(). Animal llama a super(). Object().
class Top { public Top(String s) { System.out.print("B"); } } public class Bottom2 extends Top { public Bottom2(String s) { System.out.print("D"); } public static void main(String [] args) { new Bottom2("C"); }} Cual es el resultado? A. BD B. DB C. BDC D. DBC E. Falla la compilacin.
? ?
Sobrecarga de constructores
> Los constructores se sobrecargan tpicamente para proveer formas alternativas de instanciar objetos de nuestra clase. > Una llamada a this() es retrasar lo inevitable, alguno de los constructores deber llamar a super(). > Regla clave: la primera lnea de un constructor debe ser una llamada a super() o una llamada a this().
public class Animal { String name; Animal(String name) { this.name = name; } Animal() { this(makeRandomName()); } static String makeRandomName() { int x = (int) (Math.random() * 5); String name = new String[] {"Fluffy","Fido","Rover", "Spike","Gigi"}[x]; return name; } }
class Uber { static int y = 2; Uber(int x) { this(); y = y * 2; } Uber() { y++; } } class Minor extends Uber { Minor() { super(y); y = y + 3; } public static void main(String [] args) { new Minor(); System.out.println(y); } }
Pregunta
>Qu pasar si tratamos de compilar el siguiente cdigo? Dnde podra ir la llamada a super()? class A { A() { this("foo"); } A(String s) { this(); } }
? ?
Preguntas