Programacin Orientada a Objetos Mundo Virtual Mundo Real
Programación (Orientada a Objetos) Mundo Virtual Mundo Real 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 1
Programación (Orientada a Objetos) Mundo Real Mundo Virtual • Nuestro Mundo comprende de Objetos. ! • Objetos con las mismas propiedades y similar comportamiento (métodos) se resumen en una clase. (class) • un objeto de una clase se llama una instancia de la clase. //una forma equivalente Mundo Mimundo; //declara la referencia a un objeto Mimundo = new Mundo(); //reserva espacio para el objeto //una clase class Mundo{ double largo; double ancho; double alto; } //una instancia de Mundo Mimundo= new Mundo(); //accediendo a largo Mimundo. largo=10000; 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 2
Programación (Orientada a Objetos) Mundo Real Dentro de un programa Java, una clase define un tipo de dato que contiene información y operaciones relacionadas Por otra parte, un objeto es una variable (del tipo) de la clase, también conocida como instancia, es decir un ejemplo concreto de la clase. 12/3/2020 Mundo Virtual Clase Persona class Persona { String apellido; String nombre; String direccion; Persona(String p_apellido, String p_nombre, String p_direccion) { apellido = p_apellido; nombre = p_nombre; direccion = p_direccion; } void entregar. Datos() { System. out. println(“n“); System. out. println(“Apellido: “ + apellido); System. out. println(“Nombre: “ + nombre); System. out. println(“Direccion: “ + direccion); } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 3
Programación (Orientada a Objetos) Mundo Real Mundo Virtual Propiedad de la clase deben ser almacenadas en campo de datos Métodos de la clase Un método es una función que pertenece a una clase. En este caso, los métodos no contiene modificadores, entendiéndose por ello, palabras claves opcionales: public, private, protected o static. 12/3/2020 class Persona { String apellido; String nombre; String direccion; Persona(String p_apellido, String p_nombre, String p_direccion) { apellido = p_apellido; nombre = p_nombre; direccion = p_direccion; } void entregar. Datos() { System. out. println(“n“); System. out. println(“Apellido: “ + apellido); System. out. println(“Nombre: “ + nombre); System. out. println(“Direccion: “ + direccion); } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 4
Programación (Orientada a Objetos) Mundo Virtual Mundo Real Constructor de la clase Al diseñar métodos, es usual utilizar la sobrecarga, con el fin de crear varios métodos con el mismo nombre. En general Java permite la sobrecarga de los métodos , de forma que el compilador de Java decida cuál método llamar de acuerdo con el nº o tipo de los parámetros que pasen al método. 12/3/2020 class Persona { String apellido; String nombre; String direccion; Persona(String p_apellido, String p_nombre, String p_direccion) { apellido = p_apellido; nombre = p_nombre; direccion = p_direccion; } void entregar. Datos() { System. out. println(“n“); System. out. println(“Apellido: “ + apellido); System. out. println(“Nombre: “ + nombre); System. out. println(“Direccion: “ + direccion); } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 5
Programación (Orientada a Objetos) Mundo Real Mundo Virtual class Libro { String titulo; String editorial; float precio; Libro(String titulo, String editorial, float precio) { Constructor de la clase //instrumentalización del constructor } void mostrar. Info() { //instrumentalización del método } } Al crear una instancia de un objeto, el programa habitualmente asigna valores iniciales a sus elementos de datos. Con el fin de simplificar la inicialización de los elementos del objeto, Java soporta una función llamada constructor. , que se ejecuta en forma automática al crear la instancia. La función es un método public que tiene el mismo nombre de la clase. Notar que los constructores pueden tener cero o más parámetros, y no devuelven ningún tipo en forma explícita. 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 6
Programación (Orientada a Objetos) Mundo Real Al sobrecargar un método, significa que existen varios métodos con el mismo nombre, pero diferentes firmas. La firma es la combinación de su nombre y los tipos de parámetros de entrada. Por ejemplo, int medir (int altura, int ancho) {} int medir (int long){} int medir (float tamaño){} 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 7
Programación (Orientada a Objetos) Mundo Virtual Mundo Real Java permite sobrecargar un constructor, de modo que el compilador decida a cuál función llamar, de acuerdo a los parámetros que se le pasen, y los constructores no son la excepción. Formas de crear objetos de tipo Libro!! Libro tipos = new Libro(“ 100 Tips de Java”, “Mc. Graw-Hill”, 50. 00); Libro tipos = new Libro(“ 100 Tips de Java”, 50. 00); O en forma equivalente Libro tipos; tipos = new Libro(“ 100 Tips de Java”, 50. 00); 12/3/2020 class Libro { String titulo; String editorial; float precio; Libro(String titulo, String editorial, float precio); Libro(String titulo, float precio); void mostrar. Info() { //instrumentalización del método } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 8
Programación (Orientada a Objetos) class Persona { String apellido; String nombre; String direccion; Test de la clase Persona(String p_apellido, String p_nombre, String p_direccion) { apellido = p_apellido; public class Ejemplo. Persona. Test nombre = p_nombre; { public static void main(String[] direccion = p_direccion; args) } { Persona berti = new Persona(“Vogts“, void entregar. Datos() { “Berti“, System. out. println("n"); “Leverkusen, Deutschstr. 0“); berti. entregar. Datos(); System. out. println("Apellido: " + apellido); } System. out. println("Nombre: " + nombre); } System. out. println("Direccion: " + direccion); } } 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 9
Programación (Orientada a Objetos) public class Ejemplo. Persona. Test { public static void main(String[] args) { Persona berti = new Persona(“Vogts“); berti. nombre = “Berti“; berti. direccion= “Leverkusen, Deutschstr. 0“; berti. entregar. Datos(); } } 12/3/2020 class Persona { String apellido; String nombre; String direccion; Persona(String p_apellido, String p_nombre, String p_direccion) { apellido = p_apellido; nombre = p_nombre; direccion = p_direccion; } Persona(String p_apellido) { apellido = p_apellido; } void entregar. Datos() { System. out. println(“n“); System. out. println(“Apellido: “ + apellido); System. out. println(“Nombre: “ + nombre); System. out. println(“Direccion: “ + direccion); } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 10
Programación (Orientada a Objetos) • Una clase puede estar construida a partir de muchos constructores. • Ellos se diferencian en los parámetros de entrada 12/3/2020 class Persona { String apellido; String nombre; String direccion; Persona(String p_apellido, String p_nombre, String p_direccion) { apellido = p_apellido; nombre = p_nombre; direccion = p_direccion; } Persona(String p_apellido) { apellido = p_apellido; } void entregar. Datos() { System. out. println(“n“); System. out. println(“Apellido: “ + apellido); System. out. println(“Nombre: “ + nombre); System. out. println(“Direccion: “ + direccion); } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 11
Programación (Orientada a Objetos) HERENCIA, son objetos que se relacionan entre ellos de manera jerárquica. Es decir a partir de una superclase se definen otras clases con atributos más específicos, llamadas subclases o clases derivadas. Las clases se pueden extender Herencia simple es de Java Persona Estudiante Ayudante Profesor Ayudante de Investigación Herencia múltiple , es de C++ y otros. Cómo lo supera Java? , usando interfaces. 12/3/2020 class Persona { String apellido; String nombre; String direccion; Persona(String p_apellido, String p_nombre, String p_direccion) { apellido = p_apellido; nombre = p_nombre; direccion = p_direccion; } Persona(String p_apellido) { apellido = p_apellido; } void entregar. Datos() { System. out. println(“n“); System. out. println(“Apellido: “ + apellido); System. out. println(“Nombre: “ + nombre); System. out. println(“Direccion: “ + direccion); } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 12
Programación (Orientada a Objetos) HERENCIA Clase base Persona Estudiante Ayudante Clase Derivada Profesor class Persona { String apellido; String nombre; String direccion; Persona(String p_apellido, String p_nombre, String p_direccion) { apellido = p_apellido; nombre = p_nombre; direccion = p_direccion; } Persona(String p_apellido) { apellido = p_apellido; } void entregar. Datos() { System. out. println(“n“); System. out. println(“Apellido: “ + apellido); System. out. println(“Nombre: “ + nombre); System. out. println(“Direccion: “ + direccion); } } 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 13
Programación (Orientada a Objetos) Extensión de la clase class Ayudante extends Persona { float sueldo; Ayudante(String p_apellido, String p_nombre, String p_direccion, float p_sueldo) { // llama al Constructor de la clase base super(p_apellido, p_nombre, p_direccion); sueldo = p_sueldo; } void entregar. Sueldo() { System. out. println(“n“); System. out. println(“Sueldo: “ + sueldo); } void cambio. Sueldo(int cambio) { sueldo += cambio; } } 12/3/2020 class Persona { String apellido; String nombre; String direccion; Persona(String p_apellido, String p_nombre, String p_direccion) { apellido = p_apellido; nombre = p_nombre; direccion = p_direccion; } void entregar. Datos() { System. out. println("n"); System. out. println("Apellido: " + apellido); System. out. println("Nombre: " + nombre); System. out. println("Direccion: " + direccion); } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 14
Programación (Orientada a Objetos) Test de la clase class Ayudante extends Persona { float sueldo; Ayudante(String p_apellido, String p_nombre, String p_direccion, float p_sueldo) { // llama al Constructor de la clase base super(p_apellido, p_nombre, p_direccion); sueldo = p_sueldo; } void entregar. Sueldo() { System. out. println(“n“); System. out. println(“Sueldo: “ + sueldo); } void cambio. Sueldo(int cambio) { sueldo += cambio; } } 12/3/2020 public class Aplic. Ayudante. Test { public static void main(String[] args ) { Ayudante billy; billy = new Ayudante(“Gates“, “Bill“, “Hollywood“, 2000); billy. cambio. Sueldo(-2000); billy. entregar. Datos(); billy. entregar. Sueldo(); } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 15
Programación (Orientada a Objetos) HERENCIA, son objetos que se relacionan entre ellos de manera jerárquica. Es decir a partir de una superclase se definen otras clases con atributos más específicos, llamadas subclases o clases derivadas. Clase base class Ayudante. Investigación extends Ayudante { // Implementación } Persona Estudiante Ayudante_Labora 12/3/2020 Profesor Ayudante_Teoría Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 16
Programación (Orientada a Objetos) POLIMORFISMO, es un término que se utiliza para describir una situación en donde un nombre puede referirse a diferentes métodos. En Java existen dos tipos de polimorfismo: el que ocurre en la sobrecarga (ya lo vimos) y el que ocurre en el reemplazo. En el caso de reemplazar métodos , Java determina cuál debe llamar al momento de ejecutar el programa, no durante la compilación. Ahora para determinar que métodos debe llamar, Java debe considerar no sólo los que están dentro de una clase, sino además los que están en las clases madres. El reemplazo ocurre cuando un método en una clase tiene el mismo nombre y firma es decir el mismo nº, tipo y orden de los parámetros , que un método de una clase madre o superclase. . En caso que los métodos tengan el mismo nombre y firma siempre reemplaza al método de la clase madre. // Usando polimorfismo. class Figura { double dim 1; double dim 2; Figura(double a, double b) { dim 1 = a; dim 2 = b; } double area() { System. out. println("Area para Figura no esta definida. "); return 0; } } 12/3/2020 class Rectangulo extends Figura { Rectangulo(double a, double b) { super(a, b); } class Triangulo extends Figura { Triangulo(double a, double b) { super(a, b); } // sobreescritura de area para // sobreescribe area para triangulo rectangulo double area() { System. out. println("Area interna System. out. println("Area para Triangulo. "); para Rectangulo. "); return dim 1 * dim 2 / 2; return dim 1 * dim 2; } } } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 17
Programación (Orientada a Objetos) class Hallar. Areas { public static void main(String args[]) { Figura f = new Figura(10, 10); Rectangulo r = new Rectangulo(9, 5); Triangulo t = new Triangulo(10, 8); Figura figref; figref = r; System. out. println("Area es " + figref. area()); figref = t; System. out. println("Area es " + figref. area()); figref = f; System. out. println("Area es " + figref. area()); } } 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 18
Programación (Orientada a Objetos) POLIMORFISMO, permite que un método tenga múltiples implementaciones que se seleccionan en base a que tipo de objeto se le pasa. class Ayudante extends Persona { float sueldo; Ayudante(String p_apellido, String p_nombre, String p_direccion, float p_sueldo) { // llama al Constructor de la clase base super(p_apellido, p_nombre, p_direccion); sueldo = p_sueldo; } void entregar. Sueldo() { System. out. println(“n“); System. out. println(“Sueldo: “ + sueldo); } void cambio. Sueldo(int cambio) { sueldo += cambio; } } 12/3/2020 public class Poli. Test { public static void main(String[] args ) { Persona[] persona = new Persona[300]; Ayudante billy = new Ayudante(“Gates“, “Bill“, “Hollywood“, 2000); persona[0]=billy; ((Ayudante)persona[0]). cambio. Sueldo(-1000); ((Ayudante)persona[0]). entregar. Sueldo(); } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 19
POLIMORFISMO, Programación (Orientada a Objetos) permite que un método tenga múltiples implementaciones que se seleccionan en base a que tipo de objeto se le pasa. public class Otro_Poli. Test class Persona { { public static void main(String[] args String apellido; ) String nombre; { String direccion; Persona[] persona = new Persona[300]; Persona(String p_apellido, String p_nombre, Ayudante billy = new String p_direccion) Ayudante(“Gates“, “Bill“, “Hollywood“, { 2000); apellido = p_apellido; nombre = p_nombre; persona[0]=billy; direccion = p_direccion; } ((Ayudante)persona[0]). cambio. Sueldo( void entregar. Sueldo(){} 1000); void entregar. Datos() persona[0]. entregar. Sueldo(); { } System. out. println(“n“); } System. out. println(“Apellido: “ + apellido); System. out. println(“Nombre: “ + nombre); System. out. println(“Direccion: “ + direccion); } } 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 20
Programación (Orientada a Objetos) POLIMORFISMO, permite que un método tenga múltiples implementaciones que se seleccionan en base a que tipo de objeto se le pasa. public class Otro_Poli. Test { public static void main(String[] args ) { Persona[] persona = new Persona[300]; Ayudante billy = new Ayudante(“Gates“, “Bill“, “Hollywood“, 2000); Ejemplo: En el campo „persona“ pueden ser almacenados objetos de la clase base „Persona“ y de las clases derivadas„Ayudante“, „Estudiante“, etc. Para todo elemento en el campo se pueden llamar los métodos de la clase base. persona[0]=billy; ((Ayudante)persona[0]). cambio. Sueldo(-1000); persona[0]. entregar. Sueldo(); } } La conversión de objetos (cast o casting) se realiza en forma similar a la utilizada para convertir variables, sin embargo una restricción es que la clase del objeto que se está convirtiendo y la clase a la que se va a convertir deben estar relacionadas por herencia, como superclase o subclase. 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 21
Programación (Orientada a Objetos) CLASES ABSTRACTAS, permite crear una superclase que sólo defina una forma generalizada que será compartida por todas las subclases, dejando a cada subclase la tarea de completar los detalles. // Usando metodos y clases abstractos. abstract class Figura { double dim 1; double dim 2; Figura(double a, double b) { dim 1 = a; dim 2 = b; } class Rectangulo extends Figura { Rectangulo(double a, double b) { super(a, b); } // sobreescribe area para //rectangulo double area() { System. out. println("Area para Rectangulo. "); return dim 1 * dim 2; } // area es metodo abstract double area(); } 12/3/2020 class Triangulo extends Figura { Triangulo(double a, double b) { super(a, b); } // sobreescribe area para triangulo double area() { System. out. println("Area para Triangulo. "); return dim 1 * dim 2 / 2; } } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 22
Programación (Orientada a Objetos) CLASES ABSTRACTAS, no permite que se creen objetos de ella. Su misión es proporcionar miembros comunes que serán class Abstract. Areas { compartidos por todas sus public static void main(String args[]) { subclases. // Figura f = new Figura(10, 10); //ahora es ilegal Rectangulo r = new Rectangulo(9, 5); Triangulo t = new Triangulo(10, 8); Figura figref; // esto es OK, ningún objeto se ha creado!! figref = r; System. out. println("Area es " + figref. area()); figref = t; System. out. println("Area es " + figref. area()); } } 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 23
Programación (Orientada a Objetos) Paso de Argumentos Paso por valor: copia el valor de un argumento en el parámetro formal de la subrutina. Los cambios que se realizan sobre el parámetro de la subrutina no tienen efecto sobre el argumento usado en la llamada. class Test { void modelo. V(int i, int j) { i *= 2; j /= 2; } } 12/3/2020 class Por. Valor { public static void main(String args[]) { Test ob = new Test(); int a = 15, b = 20; System. out. println("a y b antes de la llamada: " + a + " " + b); ob. modelo. V(a, b); System. out. println("a y b despues de la llamada: " + a + " " + b); } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 24
Programación (Orientada a Objetos) Paso de Argumentos Paso por referencia: al parámetro lo que se le pasa es una referencia a un argumento y no el valor del mismo. Esto significa que los cambios realizados al parámetro afectarán al argumento utilizado en la llamada de la subrutina. class Test { int a, b; Test(int i, int j) { a = i; b = j; } // pasa un objeto void modelo. R(Test o) { o. a *= 2; o. b /= 2; } } class Por. Refer{ public static void main(String args[]) { Test ob = new Test(15, 20); System. out. println("ob. a y ob. b antes de la llamada: " + ob. a + " " + ob. b); ob. modelo. R(ob); System. out. println("ob. a y ob. b despues de la llamada: " +ob. a + " " + ob. b); } } 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 25
Programación (Orientada a Objetos) Encapsulación: Control de acceso • En general la encapsulación relaciona los datos con el código que los utiliza, sin embargo , otra atributo importante es el control de acceso, es decir que partes de un programa pueden acceder a los miembros de una clase. • Los especificadores de acceso en Java son public, private y protected. En todo caso el acceso protected solo funciona para cuando se trabaja con herencia. • Control de acceso: publico (public), en este caso significa que ese miembro puede ser accedido por cualquier parte del programa // diferencia entre public y private. class Test { int a; // acceso por defecto public int b; // acceso public private int c; // acceso private // metodo para accesar a c void setc(int i) { // setear el valor de c c = i; } int obtenerc() { // obtener el valor de c return c; } } 12/3/2020 class Acceso. Test { public static void main(String args[]) { Test ob = new Test(); // OK, a y b pueden ser accedidos directamente, //pero c? ob. a = 10; ob. b = 20; ob. c = 30; System. out. println("a, b, y c: " + ob. a + " " + ob. b + " " + ob. obtenerc()); } } Resultado…. Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 26
Programación (Orientada a Objetos) resultado // ERROR // ob. c = 30; // Ud. debe accesar a c a través de un método, por ejemplo //ob. setc(100); // OK Algunas conclusiones: Como pudo apreciar dentro de la clase Test, la variable a, usa el acceso por defecto es decir public, b se especifica , mientras que c es private, es decir no puede ser accedida por código fuera de su clase. 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 27
Programación (Orientada a Objetos) Encapsulación: Control de acceso, a través de paquetes (package) /*crear un directorio Mi. Paquete, en donde irá su clase*/ package Mi. Paquete; /* la clase Balance, su constructor y su método son publicos. Esto significa que pueden ser usados fuera de su paquete. */ public class Balance { String nombre; double bal; public Balance(String n, double b){ nombre = n; bal = b; } public void mostrar. B() { if(bal<0) System. out. print("-->> "); System. out. println(nombre + ": $" + bal); } } 12/3/2020 //invocar a la (o las) clases dentro de Mi. Paquete, // eso lo lográ con. * import Mi. Paquete. *; class Test. Balance { public static void main(String args[]) { /* Balance es public, Ud. puede usar la clase Balance y llamar a su constructor. */ Balance test = new Balance("J. J. Perez. ", 99. 88); test. mostrar. B(); // puede llamar a mostrar. B() } } Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 28
Programación (Orientada a Objetos) Encapsulación: Control de acceso, a través de paquetes (package). OJO!!!, con los accesos. package Mi. Paquete; /* la clase Balance , su constructor y su método son ? ? ? . Observación: la opción de. *, incrementa el tiempo de Esto significa que ? ? ? . compilación especialmente si se importan paquetes grandes. */ public class Balance { //invocar a la (o las) clases dentro de Mi. Paquete, String nombre; // eso lo lográ con. * double bal; import Mi. Paquete. *; class Test. Balance { private Balance(String n, double b) public static void main(String args[]) { { nombre = n; bal = b; } private void mostrar. B() { if(bal<0) System. out. print("-->> "); System. out. println(nombre + ": $" + bal); } } 12/3/2020 /* Balance es public, Ud. puede usar la clase Balance y llamar a su constructor. */ Balance test = new Balance("J. J. Perez. ", 99. 88); test. mostrar. B(); // puede llamar a mostrar. B() } } Resultado…… Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 29
Programación (Orientada a Objetos) ERROR!!!! C: Documents and SettingsusuarioEscritorioeric_Web_CD _2006POO_web_CDpoo 2Test. Balance. java : 8: Balance(java. lang. String, double ) has private access in Mi. Paquete. Balance test = new Balance("J. J. Perez. ", 99. 88); ^ C: Documents and SettingsusuarioEscritorioeric_Web_CD _2006POO_web_CDpoo 2Test. Balance. java : 10: mostrar. B() has private access in Mi. Paquete. Balance test. mostrar. B(); // puede llamar a mostrar. B() ^ 2 errors Lo mismo pasa si es protected, el constructor o el método. !! 12/3/2020 Dr. Eric Jeltsch F. Ing. en Comp. Universidad de La Serena. 30
- Slides: 30