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 DISEÑO DE CLASES

3 Objetivos generales Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto (package-friendly) Describir los conceptos de constructor y de  sobrecarga de métodos. Describir la operación de construcción y de  inicialización de objetos en forma completa.

4 Orientación a Objetos Recordamos las características esenciales:
Encapsulamiento Herencia Polimorfismo Ahora veremos Herencia y Polimorfismo En módulos anteriores, definimos encapsulamiento, herencia y polimorfismo de la siguiente forma: Encapsulamiento significa que el objeto es auto-contenido, es decir que solo éste conoce sus atributos y métodos, pudiendo ser independiente de los demás objetos y clases. Cada objeto está aislado del exterior. Dicho aislamiento protege sus datos asociados, de contra su modificación por quien no tenga derecho a acceder a ellos, eliminando efectos secundarios e interacciones. Si queremos lograr mantenibilidad, fexibilidad y extensibilidad: Mantener las variables de instancia privadas (o protegidas) Crear métodos de acceso públicos (getters y setters) Para esos métodos seguir la convención set<NombrePropiedad> y get<NombrePropiedad>

5 La herencia, implica que una clase puede heredar métodos y atributos de sus clases padres. Por ejemplo, si tenemos la clase Persona, con los atributos: nombre y cédula, y la clase Empleado, la cual contiene: numEmpleado, si la clase Empleado, hereda de la clase Persona, esta también heredara los atributos de la clase Persona. La clase Empleado, no solo contendrá los atributos numEmpleado, sino que también: nombre y cédula. Como vemos, diferentes tipos de objetos poseen ciertas características comunes entre ellos; si bien un empleado, un estudiante, un profesional comparten características de una persona(nombre, apellido, ci, edad, sexo), cada uno posee una característica adicional, que lo hace diferente. La POO, permite que las clases hereden el estado y el comportamiento de otras clases. En este ejemplo, Persona es la superclase de Empleado, Estudiante y Profesional. En Java, cada clase puede tener una superclase, y cada superclase puede tener ilimitadas subclases. El polimorfismo es una técnica por la cual varias clases derivadas (clases hijas que heredan de una clase padre) utilicen un mismo método de forma diferente.

6 Diseño de Clases La clase Employee: public class Employee {
public String name = ""; public double salary; public Date birthDate; public String getDetails() {...} } A continuación, veremos un ejemplo con el objetivo de comprender las definiciones de herencia y polimorfismo. Para ello, definimos una clase; Employee, con su respectivos atributos y métodos. Según, se puede observar en el diagrama, se utiliza el modelado UML para la representación de la clase. El cuadro se divide en tres: nombre de la clase, atributos y métodos. Los atributos, deben indicar visibilidad (private, portected -, public +), nombre del atributo y tipo. Los métodos, también indican su visibilidad (private, protected -, public +), nombre, parámetros y retorno.

7 Subclases La clase Manager: public class Manager {
public String name = ""; public double salary; public Date birthDate; public String department; public String getDetails() {...} } Nuestra segunda clase, es Manager, la cual posee sus respectivos métodos y atributos. Al igual que para la clase Employee, también se indica el modelo UML, para dicha clase. En estas dos clases, vemos que ambas son independientes, no hay herencia. A continuación, veremos una implementación de herencia y aplicación de polimorfismo.

8 Subclases public class Employee { public String name = "";
public double salary; public Date birthDate; public String getDetails() {...} } public class Manager extends Employee { public String department; Como vemos, la clase Manager, hereda de clase Employee, es decir que hereda todos sus atributos y características. Para indicar que la clase Manager hereda de la clase Employee, al definir la clase Manager, se debe indicar dicha relación. Para ello, se utiliza la palabra extends, tal y como se indica en el ejemplo. Tener en cuenta, que al implementar una herencia, la clase padre es la clase Employee, mientras que la clase padre es la clase Manager. En este caso, dado que en el ejemplo anterior, ambas clases contenían atributos comunes, se decidió, solo incluir dichos atributos en la clase padre, dado que estos serán heredados por todas sus clases hijas. Observar que, el diagrama en notación UML, también ha cambiado, ya que ambas clases están relacionadas.

9 Herencia Simple Cuando una clase hereda de una sola clase, se le llama herencia simple Las Interfaces proveen la herencia múltiple, sin los problemas de la misma Sintaxis de clases: < modifier> class < name> [extends < superclass>] { < declarations>* } Como se menciono anteriormente, una interfaz provee un contrato, es decir servicios. Dichos servicios, pueden ser heredados, mediante herencia múltiple. Para ello, la clase que implementa dicho contrato, deberá definir la implementación propia de cada servicio. Ejemplo: public interface Comparar{ bool compararNombres(string s1, string s2); bool compararNumeros(int i1, int i2); }

10 public class CompararImpl implements Comprar
{ public bool compararNombres(string s1, string s2) //código } public bool compararNumeros(int i1, int i2)

11 Herencia Simple Como se muestra en el diagrama, las clases Engineer, Manager y Secretary heredan de la clase Employee, mientras que la clase Director hereda de la clase Manager e indirectamente de la clase Manager. Al tener esta herencia, vemos que tanto Engineer, Manager, Secretary son un tipo de Employee, por lo que poseen todos los atributos y métodos de dicha clase. La clase Director, hereda indirectamente los métodos y atributos de la clase Employee, a través de clase Manager.

12 Accediendo a una Clase ¿Que quiere decir acceder a un clase B desde una clase A? Crear una instancia de B Extender B Acceder ciertos miembros de B dependiendo de los niveles de acceso de los mismos Acceso se traduce a Visibilidad Acceder a una clase determinada implica: -crear una instancia de dicha clase -extender dicha clase (heredar) -acceder a los miembros de dicha clase, según la visibilidad de los mismos ( es decir si son públicos, privados o protected) Para crear una instancia de la clase, solo bastara con crear un nuevo objeto utilizando el constructor: Date myDate = new Date(25,9,1865); Para extender dicha clase, aplicamos herencia simple:

13 public class Persona { ////codigo } public class Empleado extends Persona Y finalmente, acceder a ciertos miembros del objeto. Emleado emp= new Empleado(); Emp.setNombre(“Juana”); //en este caso, accedemos al miembro setNombre()

14 Accediendo a una Clase Niveles de acceso permitidos para clases:
default (no tienen modificador precediendo a la keyword class): Accesibles por clases dentro del mismo paquete public: Accesibles por todas las clases EL nivel de acceso de una clase puede ser: default o public. Ejemplos: public class Persona { ////código } class Persona

15 Accediendo a una Clase Con nivel de acceso default: package cert;
class Beverage { } package exam.stuff; import cert.Beverage; class Tea extends Beverage { //Error de compilación porque están en distinto paquete!! En este ejemplo, vemos que ambas clases se encuentran en distintos paquetes, por lo que si estas no son publicas, no podrán verse entre si. Se obtiene un error, dado que ambas se encuentran en distintos paquetes.

16 Accediendo a una Clase Con nivel de acceso public: package cert;
public class Beverage { } package exam.stuff; import cert.Beverage; class Tea extends Beverage { // OK! Nivel de acceso de Beverage public!! En este caso, como la clase Beverage es publica, ésta puede ser importada y vista por la clase Tea. En el ejemplo anterior, Beverage solo podía ser utilizada dentro de ese paquete.

17 Accediendo a los miembros de una Clase
Se permiten todos los niveles de acceso: En esta tabla, vemos los distintos niveles de acceso de una clase según la visibilidad.

18 Accediendo a los miembros de una Clase
Los niveles de acceso default y protected difieren solo en que: Un miembro default puede ser accedido solo si la clase que accede al miembro se encuentra en el mismo paquete. Un miembro protected puede ser accedido (a través de la herencia) por una sublcase por más que esta no se encuentre en el mismo paquete Como se explico anteriormente, las clases default, solo pueden ser utilizadas dentro del mismo paquetes. Por otro lado, los miembros protected, sólo pueden ser accedidos por una subclase, aunque ésta no se encuentre en el mismo paquete.

19 Sobrescribir métodos Una clase puede modificar el comportamiento heredado de una clase padre Una subclase puede crear un método con diferente funcionalidad que la clase padre, pero con el mismo: nombre tipo de retorno lista de argumentos No se puede sobrescribir constructores Para comprender estas características, a continuación veremos un ejemplo.

20 Sobrescribir métodos public class Employee { protected String name;
protected double salary; protected Date birthDate; public String getDetails() { return “Name: “ + name + “\n” + “Salary: “ + salary; } public class Manager extends Employee { protected String department; return “Name: “+name +“\n”+ “Salary: “ + salary + "\n" +“Manager of: “ +department; En este caso, tenemos la clase Employee, la cual contiene 3 atributos protected y un método getDetails(). Por otro lado, la clase Manager, hereda de la clase Employee, por lo que hereda sus atributos y métodos. En este caso, los atributos definidos en la clase padre pueden ser accedidos por la clase hijo, aunque estos sean protected o dicha clase se encuentre en otro package. Como podemos ver, el método getDetails, es definido con el mismo nombre, tipo de retorno y argumentos que el método definido en la clase padre. En este ejemplo, al ejecutar el método getDetails(), se ejecutará el de la clase Manager.

21 Palabra clave: super La palabra clave super es usada en una clase para hacer referencia a su superclase. También es usada para hacer referencia a los miembros de la superclase, tanto atributos como métodos El comportamiento invocado no tiene porque estar en la superclase, puede venir también de arriba de la jerarquía de clases Para comprender esta nueva palabra: super, veremos a continuación un ejemplo.

22 Palabra clave: super public class Employee { private String name;
private double salary; private Date birthDate; public String getDetails() { return "Name: " + name + "\nSalary: " + salary; } public class Manager extends Employee { private String department; // call parent method return super.getDetails() +"\nDepartment: " +department; Siguiendo con el ejemplo anterior, al utilizar la palabra reservada super, hacemos que al invocar el método getDetails, no solo se ejecute el que se encuentra en la clase Manager, sino que antes de hacerlo, vaya a la clase padre (Employee), ejecute el método getDetails() de dicha clase, para luego ejecutar el contenido del método de la clase Employee. Al ejecutarlo, se ejecutaría: "Name: " + name + "\nSalary: " + salary +"\nDepartment: " +department;

23 Reglas para métodos sobrescritos
La lista de parámetros debe ser idéntica a la del método sobrescrito El tipo de retorno debe ser idéntico al del método sobrescrito El nivel de acceso no debe ser más restrictivo que el del método sobrescrito (puede ser menos) No puede arrojar una nueva excepción o una más general que el método sobrescrito (puede declarar menos o más específicas) No se puede sobrescribir un método final Como se menciono anteriormente, para sobrescribir métodos se debe tener en cuenta: -que el nombre sea el mismo. -el retorno debe ser el mismo. -los parámetros deben ser los mismos. -el nivel de acceso (public, private, protected) debe ser el mismo o menos.

24 Reglas para métodos sobrescritos
public class Parent { public void doSomething() {} } public class Child extends Parent { private void doSomething() {} public class UseBoth { public void doOtherThing() { Parent p1 = new Parent(); Parent p2 = new Child(); p1.doSomething(); p2.doSomething(); En este ejemplo, vemos que la clase Child hereda de la clase Parent. Ahora bien, el método de la clase Parent: doSomething, tiene visibilidad public, mientras que en la clase Child, es privado. Observar, que al sobrescribir este método, se respetan las reglas descriptas anteriormente: -que el nombre sea el mismo. -el retorno debe ser el mismo. -los parámetros deben ser los mismos. -el nivel de acceso (public, private, protected) debe ser el mismo o menos.

25 Sobrecarga de métodos Permiten utilizar el mismo nombre que otro método pero con distintos parámetros y opcionalmente distinto tipo de retorno. Ejemplo: public void println(int i) public void println(float f) public void println(String s) En este caso, son métodos sobrecargados, es decir, pueden llamarse de igual forma, pero los parámetros o el tipo de retorno puede variar. La idea es que según los parámetros que reciba, se ejecutará cierto método.

26 Reglas para métodos sobrecargados
Deben cambiar la lista de argumentos Pueden cambiar el tipo de retorno Pueden cambiar los modificadores de acceso Pueden declarar excepciones nuevas o más genericas Se puede sobrecargar un método dentro de la misma clase

27 Sobrecarga de constructores
Como los métodos, los constructores pueden ser sobrecargados. Ejemplo: public Employee(String name, double salary, Date DoB) public Employee(String name, double salary) public Employee(String name, Date DoB) La lista de argumentos debe ser diferente Puede usar this en la primera línea del constructor para llamar otro constructor Como se vio en módulos anteriores, se pueden definir varios constructores de una misma clase. En este caso, varía la cantidad de parámetros que este recibe. Ejemplo: public class Persona { private string nombre; public Persona(){} public Persona(String nombre) this.nombre=nombre; } Recordar que la palabra reservada this, se utiliza para hacer referencia a atributos de la propia clase. En este ejemplo, this.nombre corresponde al atributo de clase, y nombre corresponde a la variable del método que se pasa por parámetro.

28 Sobrecarga de constructores
public class Employee { private static final double BASE_SALARY = ; private String name; private double salary; private Date birthDate; public Employee(String name, double salary, Date DoB) { this.name = name; this.salary = salary; this.birthDate = DoB; } public Employee(String name, double salary) { this(name, salary, null); public Employee(String name, Date DoB) { this(name, BASE_SALARY, DoB); public Employee(String name) { this(name, BASE_SALARY); // more Employee code... En este ejemplo, tenemos la clase Employee, para la cual se definen 4 constructores; por lo que a la hora de crear un nuevo objeto de tipo Employee, será posible utilizar cualquiera de estos 4 constructores. Ejemplo: Employee e = new Employee(“Pepe”,200,new Date(23,01,2011)); Employee e1 = new Employee(“Pepe”,200); Employee e3 = new Employee(“Pepe”,new Date(23,01,2011)); Employee e = new Employee(“Pepe”);

29 Los constructores no son heredados
Una subclase hereda todos los métodos y variables de su superclase La subclase no hereda constructores de la superclase Existen dos formas de tener constructores en una clase: Utilizar el constructor por defecto Escribir uno o mas constructores explícitos Si bien al tener una herencia, podemos heredar métodos y atributos, no se heredan los constructores.

30 Invocar constructores de clase padre
Para invocar un constructor padre, debe poner una llamada a super en la primera línea del constructor Si no es utilizado this o super en el constructor, entonces el compilador agrega una llamada implícita super() (la primer línea siempre debe ser una llamada a super o una llamada a this) Si en la clase padre se definen constructores y no tiene el constructor sin parámetros, un error de compilación es generado Para el caso de querer ejecutar el constructor de la clase padre, es necesario utilizar la palabra reservada super. Al invocar este método en el constructor de la clase hija, inmediatamente al crear un nuevo objeto, se ejecutará primero el constructor de la clase padre para luego ejecutar el de la subclase. Tener en cuenta, que se deberá definir el constructor sin parámetros en la clase padre para evitar errores de compilación. Más adelante veremos un ejemplo.

31 Construyendo e Inicializando objetos
No se puede crear un objeto sin invocar a su constructor Más aún, no puede crearse un objeto sin invocar a su constructor y a todos los constructores de sus superclases

32 Proceso de creación de objetos
La memoria es reservada y la inicialización por defecto es efectuada La inicialización de las variables de instancia utiliza este paso recursivamente: Busca el constructor con los parámetros invocados Si existe this(), llama recursivamente y saltar hasta paso 5 Invoca recursivamente super (implícitamente o explícitamente), excepto para Object Ejecuta la inicialización explícita de la variable de instancia Ejecuta el cuerpo del constructor Como se menciono anteriormente, en Java no es posible el manejo de memoria; son el Garbage Collector y la Máquina Virtual quienes se encargan de hacerlo. Una vez que el objeto no es utilizado, ese espacio de memoria es liberado.

33 Ejemplo public class Object { ... public Object() {} }
public class Employee extends Object { private String name; private double salary = ; private Date birthDate; public Employee(String n, Date DoB) { // implicit super(); name = n; birthDate = DoB; Ahora veremos un ejemplo del uso de super(). En este ejemplo tenemos la clase Object, la cual define un constructor sin parámetros. Luego, tenemos la clase Employee, que hereda de la clase Object. Al crear una nueva instancia de la clase Employee, solo se ejecutara el constructor de dicha clase y no el de la clase padre, debido a que no se indica que se utilice también el constructor de la clase padre. (No se utiliza la palabra super) Ahora bien, cómo podemos hacer para que al crear un nuevo objeto de tipo Employee, también se ejecute el constructor de la clase Object? La respuesta la veremos a continuación.

34 Ejemplo public Employee(String n) { this(n, null); }
public class Manager extends Employee { private String department; public Manager(String n, String d) { super(n); department = d; En este ejemplo, la clase Employee, tiene un constructor, el cual recibe un parámetro: un string. La clase Manager hereda de la clase Employee. Si observamos el constructor, vemos que éste no solo recibe los parámetros que son utilizados por dicha clase, sino que también los definidos en la clase padre: String n. Para ejecutar el constructor de la clase padre, se deberá utilizar la palabra super. Como vemos, el método super, recibe los mismos parámetros que el constructor de la clase padre. Si el constructor de la clase padre no recibiera parámetros, se debería haber escrito: public Employee() { } public class Manager extends Employee { private String department; public Manager( String d) { super(); department = d;

35 Reglas para constructores
Pueden usar cualquier modificador de acceso incluyendo private (ver Singleton) El nombre del constructor debe coincidir con el de la clase No tienen tipo de retorno Si no se declara uno el compilador construye el constructor por defecto sin argumentos La primer línea del constructor es o una llamada a otro constructor de la misma clase o a un constructor de la superclase Si se utiliza el patrón Singleton, se deberá escribir: public class Employee{ private static Employee employee= new Employee(); private Employee() { } public static Employee getEmployee() return this.employee;

36 Reglas para constructor por defecto
Tiene el mismo nivel de acceso que la clase No tiene argumentos Incluye una llamada sin argumentos al constructor de la clase padre (super())

37 Polimorfismo Polimorfismo es la capacidad de tener varias formas diferentes, por ejemplo, la clase Manager tiene acceso a los métodos de la clase Employee. Un objeto tiene sólo una forma. Es la variable referencia la que puede referenciar a objetos de diferentes formas El polimorfismo es una técnica por la cual varias clases derivadas (clases hijas que heredan de una clase padre) utilicen un mismo método de forma diferente.

38 Polimorfismo Ejemplo: Employee employee = new Manager();
employee.department = "Sales"; No se le puede asignar un atributo de Manager, la variable fue declarada de tipo Employee AL crear un objeto de tipo Employee, dicha variable sólo puede acceder a los atributos y métodos de dicha clase y no de la clase padre.

39 Invocación métodos virtuales
Ejemplo: Employee e = new Manager(); e.getDetails(); El comportamiento lo toma del objeto al que hace referencia en tiempo de ejecución.

40 Colecciones heterogéneas
Las colecciones de objetos del mismo tipo de clase se llaman colecciones homogéneas. MyDate[] dates = new MyDate[2]; dates[0] = new MyDate(22, 12, 1964); dates[1] = new MyDate(22, 7, 1964); Las colecciones de objetos de tipos diferentes de clases son llamadas colecciones heterogéneas. Employee [] staff = new Employee[1024]; staff[0] = new Manager(); staff[1] = new Employee(); staff[2] = new Engineer(); En este caso, una colección es un array cuyos objetos son o no todos del mismo tipo.

41 Argumentos Polimórficos
Como un Manager es un Employee: // In the Employee class public TaxRate findTaxRate(Employee e) { } // Meanwhile, elsewhere in the application class Manager m = new Manager(); : TaxRate t = findTaxRate(m); En este ejemplo, vemos que el objeto m, es de tipo Manager, por lo que éste podrá acceder a los métodos y atributos de dicha clase.

42 Operador: instanceof public class Employee extends Object
public class Manager extends Employee public class Engineer extends Employee public void doSomething(Employee e) { if (e instanceof Manager) { // Process a Manager } else if (e instanceof Engineer) { // Process an Engineer } else { // Process any other type of Employee } El operador instanceof, me permite preguntarle el tipo al objeto y según este realizar alguna acción.

43 Casteo de Objetos Utilice el operador instanceof para conocer el tipo del objeto Recupere todas las funcionalidades de un objeto mediante el casteo. Compruebe que el casteo sea correcto, realizando lo siguiente: El casteo hacia arriba (jerárquicamente) es hecho implícitamente El casteo hacia abajo (jerárquicamente) debe ser con una subclases y chequeado por el compilador El tipo del objeto es chequeado en tiempo de ejecución, por lo tanto si hay un error este será en tiempo de ejecución. Para llevar a cabo un casteo, se deberá realizar de la siguiente manera: Upcasting: package pruebaPolimorfismo; public class Persona { private int edad; public void setEdad(int unaEdad) { edad = unaEdad; } public int getEdad() { return edad; public boolean esMenorQue(Persona unaP) { return (this.getEdad()) <= unaP.getEdad(); public String mensaje() { return "Es Persona";

44 package pruebaPolimorfismo;
public class Empleado extends Persona { int sueldo; public void setSueldo(int unSueldo) { sueldo = unSueldo; } public int getSueldo() { return sueldo; public String mensaje() { return “Es Empleado "; public class PruebaUp { public static void main(String[] args) { Empleado e1, e2; e1 = new Empleado(); e1.setEdad(18); e2 = new Empleado(); e2.setEdad(20) ; if (e1.esMenorQue(e2)) { System.out.println("E1 es menor" ); else { System.out.println("E2 es menor");

45 En este ejemplo, vemos que e1 es de tipo Empleado, (clase que hereda de la clase Persona), por lo que todo Empleado hereda de la clase Persona (métodos y atributos.) Notar que el metodo esMenorQue(Persona) recibe un objeto Persona, no Empleado. ¿Por qué funciona? Funciona debido al UPCASTING. Todo empleado es una persona, el hecho de transformar un empleado en persona se hace de forma automática y se llama UPCASTING. Downcasting: -Ejemplo 1: Qué pasa si escribo en el main: Empleado e3; e3 = new Persona(); Resultado: No compila pues una persona podría no ser empleado. -Ejemplo 2: Si creo un empleado y quiero setear su sueldo: Persona p4; p4 = new Empleado(); p4.setSueldo(100); Asi no funciona, dice que el “método setSueldo no está en Persona”. Para Java, es un objeto Persona, aunque en realidad es un Empleado. Para indicarle que lo mire como empleado es necesario hacer DOWNCAST ((Empleado)p4).setSueldo(100); -Ejemplo 3: Persona p2 = new Persona(); Empleado e3 = (Empleado) p2; System.out.println(e3.mensaje()); Da error en ejecución, no puede hacer el cast de Persona a Empleado. La conversión hacia un tipo que esté debajo en la jerarquía no es siempre posible (por ejemplo, una Persona no tiene por qué ser un Empleado) Por lo tanto, el DOWNCASTING no es automático, debo indicarlo mediante el operador de casting () como en el ejemplo 2.

46 Clase Objetc Es la clase base de todas las clases en Java
Una declaración de una clase sin extends, implícitamente utiliza “extends Object” La veremos en profundidad cuando hablemos del paquete java.lang

47 Resúmen Definimos: Herencia Polimorfismo Sobrecarga
Sobrescritura e invocación de métodos virtuales Modificadores de acceso: protected Sobrecarga de constructores y de métodos Construcción e inicialización de objetos.

48 Referencias Thinking in Java Bruce Eckel The Java Tutorial


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

Presentaciones similares


Anuncios Google