Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar...

48

Transcript of Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar...

Page 1: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.
Page 2: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.
Page 3: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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.

Page 4: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

Recordamos las características esenciales:₋ Encapsulamiento₋ Herencia₋ Polimorfismo

Ahora veremos Herencia y Polimorfismo

Page 5: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.
Page 6: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

La clase Employee:

public class Employee {public String name = "";public double salary;public Date birthDate;

public String getDetails() {...}

}

Page 7: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

La clase Manager:

public class Manager {public String name = "";public double salary;public Date birthDate;public String department;public String getDetails() {...}

}

Page 8: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

public class Employee {public String name = "";public double salary;public Date birthDate;public String getDetails() {...}

}

public class Manager extends Employee {public String department;

}

Page 9: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

}

Page 10: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.
Page 11: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.
Page 12: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

¿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

Page 13: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.
Page 14: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 15: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

}

Page 16: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 17: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

Se permiten todos los niveles de acceso:

Page 18: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 19: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 20: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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;

public String getDetails() { return “Name: “+name +“\n”+ “Salary: “ + salary + "\n" +“Manager of: “ +department;}

}

Page 21: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 22: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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;public String getDetails() { // call parent method return super.getDetails() +"\nDepartment: " +department;}

}

Page 23: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 24: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

}}

Page 25: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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)

Page 26: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 27: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 28: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

public class Employee { private static final double BASE_SALARY = 15000.00; 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... }

Page 29: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 30: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 31: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 32: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 33: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

public class Object {...public Object() {}...}public class Employee extends Object { private String name; private double salary = 15000.00; private Date birthDate; public Employee(String n, Date DoB) { // implicit super(); name = n; birthDate = DoB; }

Page 34: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 35: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 36: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el 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())

Page 37: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 38: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

Ejemplo:

Employee employee = new Manager();

employee.department = "Sales";

No se le puede asignar un atributo de Manager, la

variable fue declarada de tipo Employee

Page 39: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

Ejemplo:

Employee e = new Manager();

e.getDetails();

El comportamiento lo toma del objeto al que hace referencia en tiempo de ejecución.

Page 40: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 41: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

Como un Manager es un Employee:

// In the Employee classpublic TaxRate findTaxRate(Employee e) {}// Meanwhile, elsewhere in the application classManager m = new Manager();:TaxRate t = findTaxRate(m);

Page 42: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

public class Employee extends Objectpublic class Manager extends Employeepublic 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

}}

Page 43: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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.

Page 44: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.
Page 45: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.
Page 46: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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

Page 47: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

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.

Page 48: Definir herencia, polimorfismo, sobrecarga, sobrescritura e invocación de métodos virtuales. Usar los modificadores de acceso protected y el por defecto.

Thinking in Java₋ Bruce Eckel

The Java Tutorial₋ http://download.oracle.com/javase/tutorial/