Programacin Orientada a Objetos en Java Unidad 1
Programación Orientada a Objetos en Java Unidad 1 Nociones básicas del lengueje
Temario n n n n n El lenguaje de programación Java Tipos de aplicaciones en Java Tipos de datos primitivos Variables Constantes Arreglos Operadores Control de flujo String y String. Buffer 2
Java n n n Java (1995) fue desarrollado en Sun Microsystems por James Gosling, Bill Joy y Guy Steele Influenciado por C++ Soporta clases, encapsulación, herencia simple, polimorfismo, interfaces, garbage collection 3
Java n n n Objetivo inicial: un lenguaje de programación para dispositivos de consumo Requerimientos: pequeño, rápido, confiable y portable En 1994 se produce la explosión del Web, y Sun advierte que Java es ideal para aplicaciones Internet: n n n Independiente de la plataforma Pequeño Seguro 4
El Lenguaje Java n n n n Independiente de la plataforma Seguro Simple Robusto Orientado a Objetos Distribuido Multi-threaded Ref: http: //www. oracle. com/technetwork/javase/documentatio n/index. html 5
El Modelo Java n Al compilar un programa Java, se genera un código de máquina intermedio definido por Sun, que recibe el nombre de bytecode 6
El Modelo Java n El código bytecode es portable entre diferentes plataformas 7
Java Standard Edition n Java SE es la edición estándar de Java, sobre la cual están construidas Java ME (Mobile Edition) y Java EE (Enterprise Edition) 8
Tipos de Aplicaciones n Usando Java es posible escribir: n n Aplicaciones stand-alone Aplicaciones Web (servlets, JSP, applets) Componentes (Java. Beans, Enterprise Java. Beans) Web Services 9
Tipos de Archivos Java n n Todo archivo define una clase o una interfaz Clase: n n n Define e implementa un tipo de objeto Variables (representación) Procedimientos (funciones) n n n estáticos (especial: main) y dinámicos (se ejecutan sobre un objeto) Interfaz n Define la firma de un procedimiento 10
Ejemplo de una clase public class Mi. Clase { int a; //variable de instancia static int b; //variable de clase public void mi. Metodo 1( ) {. . . } static public void mi. Metodo 2 {. . . } static public void main(String[] args) {. . . } } 11
Características del Lenguaje n n n Case-sensitive Todas las sentencias terminan con un punto-coma (; ) Los espacios blancos (incluyendo tabs y fines de línea) se ignoran, excepto al interior de strings 12
Comentarios // comentario /* comentario */ /** comentario */ Caracteres desde // hasta el fin de línea son ignorados Caracteres entre /* y */ son ignorados Caracteres entre /** y */ son ignorados e incluidos en la documentación javadoc 13
Javadoc 14
Identificadores n n Nombre dado a una variable, clase, o método Comienza con una letra Unicode (incluyendo _ y $), a la que pueden seguir letras y dígitos Puede tener cualquier tamaño Ejemplos n n n apellido $ 15
Unicode n Versión extendida de la tabla de caracteres ASCII n n Los caracteres ASCII tienen 7 bits Los caracteres Unicode tienen 16 bits Diseñado para manejar múltiples lenguajes La secuencia udddd permite codificar caracteres Unicode (d es un dígito hexadecimal) 16
Tipos, Valores y Variables n En Java existen 2 categorías de tipos: tipos n n Primitivos: Primitivos boolean, char, byte, short, int, long, float, double Referencias: Referencias objetos, interfaces, arreglos Un objeto es una instancia de una clase o de un arreglo Una variable es un espacio de memoria que puede almacenar: Tipo de la variable Puede almacenar Primitivo Un valor del tipo que se declaró Clase El valor null, o una referencia a una instancia de la clase o de alguna subclase de la clase Interfaz El valor null, o una referencia a una instancia de alguna clase que implemente la interfaz Arreglo El valor null, o una referencia a un arreglo de elementos del tipo del arreglo 17
Tipos de Datos Primitivos Tipo Valores boolean true o false char Carácter Unicode (de 16 bits) byte Entero de 8 bits (con signo) short Entero de 16 bits (con signo) int Entero de 32 bits (con signo) long Entero de 64 bits (con signo) float Número flotante de 32 bits double Número flotante de 64 bits 18
Variables n n Una variable es un espacio de almacenamiento de datos, con un nombre y un tipo de datos asociado La existencia de una variable está dada por su alcance: n n n static (variable "de clase"): se crea una vez, sin importar cuántas instancias de la clase existan no static (variable "de instancia"): se crea una vez por cada instancia de la clase local: ocal se crea al ejecutarse la declaración, y desaparece al finalizar el bloque en el que fue creada 19
Variables Locales n n La declaración puede aparecer en cualquier punto del código fuente de un método La variable existe mientras se ejecuta el bloque contiene la declaración 20
Bloque n n Cualquier número de sentencias agrupadas entre un par de llaves { } Puede ser usado en cualquier lugar donde se acepta una sentencia simple El bloque define el ámbito (scope) de las variables El bloque provee contornos para el control de flujo del procesamiento 21
Ambito de Variables public class Mi. Clase { int a; static int b; public void mi. Metodo( ) { int c; if (condicion) { int d; } d fuera de ámbito } c fuera de ámbito } a y b fuera de ámbito 22
Valores Iniciales n Variables de instancia y de clase n n n tipos primitivos numéricos char boolean referencias 0 'u 0000' false null Variables locales n Deben ser inicializadas explícitamente antes de ser usadas; de lo contrario se produce un error de compilación 23
Precedencia de Variables 1. Variables locales 2. Parámetros de métodos 3. Variables de clase y de instancia Ej: class Punto { private double x, y; public void set. X(double x) { this. x = x; } } 24
Constantes n n Una vez inicializadas, no pueden ser modificadas Se utiliza la palabra reservada final para definir una constante Típicamente las constantes se definen como static, static para no instanciarlas con cada objeto Ejemplo class Circulo { static final double PI = 3. 1416; } 25
Conversión de Tipos n Java es fuertemente tipeado n n n Chequea compatibilidad de tipos en tiempo de compilación Permite hacer cast entre tipos Provee operadores para determinar el tipo de un objeto en tiempo de ejecución 26
Conversion Implícita n Cualquier valor numérico puede ser asignado a una variable numérica que seoporte un rango de valores más amplio byte short más chico n int long float double más grande Ejemplo int i = 1000; double d = i; 27
Cast Explícito n n Cuando una conversión implícita no es posible, un cast explicita la conversión a realizar Sólo se permiten casts que tienen sentido 28
Cast de Tipos Primitivos n Puede perderse precisión double d = 20. 5; long l = (long) d; System. out. println(l); n 20 Pueden perderse dígitos long l = 1000000; short s; s = (short) l; System. out. println(s); 16960 29
Tipos de Operadores n n Asignación Aritméticos Relacionales Lógicos 30
Operador de Asignación n n Se usa el símbolo = para asignar un valor Ejemplo sueldo = 1000000; validado = true; n La asignación puede ocurrir en la declaración String nombre = "Paula"; 31
Operadores Aritméticos + * / % Suma Resta Multiplicación División Resto 32
Métodos Estáticos n n Se identifican con el selector static Devuelven o no un resultado de un cierto tipo Reciben un número determinado de parámetros de tipo determinado Métodos de igual nombre pero con distinto número o tipo de parámetros son métodos distintos ! 33
Métodos en la misma clase public class Mi. Clase { public int suma(int x, int y ) { return x+y; } static public int suma(int x, int y, int z) { return x+y+z } static public void main(String[] args) { System. out. println(suma(5, 4)+” “+suma(2, 3, 4)); } } 34
Métodos en otra clase public class Sumas { //En archivo Sumas. java public int suma(int x, int y ) { return x+y; } static public int suma(int x, int y, int z) { return x+y+z } } public class Mi. Clase { //En archivo Mi. Clase. java static public void main(String[] args) { System. out. println(Sumas. suma(5, 4)+” “+ Sumas. suma(2, 3, 4)); } } Ver Ejemplos. Funciones. ppt 35
Incremento y Decremento n n n i++ es equivalente a i = i + 1 i-- es equivalente a i = i - 1 El valor de la expresión es el valor de la variable antes o después de la operación, según si el operador se encuentra a la izquierda o a la derecha del operando Ejemplo int x = 10; System. out. println( x++ ); System. out. println( ++x ); System. out. println( x ); // x=11, print 10 // x=12, print 12 // print 12 36
Operadores Abreviados var op= expression es equivalente a: var = var op (expression) n Ejemplo a *= b + 1; es equivalente a: a = a * (b + 1); 37
Sentencias de Control de Flujo n n n if / else switch for while do / while 38
if if ( result == 0 ) { System. out. println("No encontrado!"); } 39
if / else if (rol. equals("administrador")) { // acceso a administración; } else { // no tiene acceso a administración } 40
Operadores Relacionales > >= < <= == != Mayor o igual Menor o igual Igual Distinto 41
Operadores Lógicos && || ! n and or not Ejemplo boolean fin = eof || (str != null && str. equals(patron)); 42
Operador "? " n Expresión condicional: n n n condición ? expresión 1 : expresión 2 El valor de la expresión es expresión 1 si la condición es verdadera, y expresión 2 de lo contrario Ejemplo monto. Neto = hay. Impuesto ? p * 1. 05 : p; es equivalente a: if (hay. Impuesto) { monto. Neto = p * 1. 05; } else { monto. Neto = p; } 43
if / else if ( años < 5 ) { vacaciones = 10; } else if ( años < 10 ) { vacaciones = 15; } else { vacaciones = 20; } 44
while y do while n Sintaxis 1: se ejecuta 0 o más veces while ( condición ) { sentencias } n Sintaxis 2: se ejecuta 1 o más veces do { sentencias } while ( condición ); 45
break n break causa el fin del ciclo en el que se encuentra while ( condición ) { sentencias… if (condición de salida) { break; } más sentencias… } 46
continue n continue causa el fin de la iteración actual y el paso a la siguiente while ( condición ) { sentencias… if (condición siguiente iteración) { continue; } más sentencias… } (ver ejemplos instrucciones especiales) 47
Recursividad n Java soporta que un método se invoque a sí mismo, de manera recursiva: // sumatoria int f(int n) { if (n == 0) { return 0; } else { return n + f(n – 1); } } 48
switch n n n Selección múltiple switch <expresión> debe evaluar un int case <expresión> debe ser un literal o un campo static final break abandona el bloque del switch (de otra manera los siguientes cases son ejecutados sin ser evaluados) El bloque default es opcional switch (<expresión>) { case <expresión>: . . . break; } default: . . . 49
Ejemplo de switch public static void main(String[] args) { switch (args. length) { case 0: File. Editor e = new File. Editor(); break; case 1: File. Editor e = new File. Editor(args[0]); break; default: // mensaje de error y fin } } 50
for n Sintaxis for (inicialización; condición; reinicialización) { sentencias } n Nota n inicialización y reinicialización pueden ser listas de expresiones separadas por comas 51
Ejemplo de for ( x=0; x<10; x++ ) { // ejecuta el bloque mientras x < 10 } for ( x=0, y=0; y<20; x++, y+=x ) { // ejecuta el bloque mientras y < 20 } 52
Etiquetas (Labels) n n Los labels se usan típicamente en bloques y ciclos Un label es un identificador seguido de dos puntos: Label 1: n El label identifica la siguiente sentencia 53
Ejemplo search: for (. . . ) { for (…) { if (. . . ) { break search; } } } 54
Arreglos n n Un arreglo es un objeto Colecciones ordenadas de elementos n n n Tipos de datos primitivos (int, …) Referencias a objetos El tamaño es definido en la creación (new) y no puede ser modificado 55
Arreglos de Tipos Primitivos int[] x; // equivalente a int x[] x = new int[3]; x[0] = 10; x[1] = 20; x[2] = 30; X 10 20 30 Nota: x. length es una variable final que entrega el tamaño del arreglo 56
Arreglos de Objetos Referencias X Circulo[] x; x = new Circulo[3]; x[0] = new Circulo(); x[1] = new Circulo(); x[2] = new Circulo(); 57
Arreglos de Arreglos n Java permite crear arreglos de arreglos con la siguiente sintaxis int[][] matriz = new int[4][]; for (int i = 0; i < matriz. length; i++) { matriz[i] = new int[5]; for (int j = 0; j < matriz[i]. length; j++) { matriz[i][j] = i + j; } } 58
Inicialización de Arreglos n Un arreglo puede inicializarse con la siguiente sintaxis: boolean[] respuestas = {true, false, true}; String[] nombres = {"Ana María", "Carlos"}; Circulo[] circulos = { new Circulo(), new Circulo(20), new Circulo(5. 5) }; String[][] humor = { { "Coco Legrand", "Alvaro Salas" }, { "Les Luthiers" }, { "Groucho Marx", "Buster Keaton", "Jerry Lewis", "Woody Allen" } }; 59
for-each (desde Java 5. 0) n n Java 5. 0 introdujo un for simplificado para recorrer arreglos y otras estructuras El siguiente método retorna la suma de los elementos de un arreglo // Java 1. 4 o anterior int sum(int[] a) { int result = 0; for (int i=0; i<a. length; i++) { result += a[i]; } return result; } // Java 5. 0 int sum(int[] a) { int result = 0; for (int i : a) { result += i; } return result; } 60
String n n En Java los strings son objetos de la clase String Los objetos String son inmutables, es decir, permanecen con el string que se les asignó en la inicialización Si se desea modificar un String, debe usarse la clase String. Buffer Un literal de tipo String ("hola, mundo!") da origen a un objeto de tipo String instanciado por la máquina virtual 61
Concatenación de Strings n n El operador + permite concatenar Strings El operador + no modifica los operandos, sino que genera un nuevo objeto String con la concatenación String s 1 = "Hola"; String s 2 = ", mundo!"; s 1 = s 1 + s 2; // s 1: "Hola, mundo!" 62
Programa
Tipo Char
Caracteres y enteros import java. util. *; nclass Caracteres { n public static void main(String args[]) { n Scanner C = new Scanner(System. in); n System. out. print("ingrese numeros n 1 n 2 "); n int in = C. next. Int(), n fn = C. next. Int(); n for (int i = in; i <= fn; i++) n System. out. println(i+" <-> "+(char)i); n C. next. Line(); n System. out. print("ingrese letras x 1 Enter x 2"); n char ic = C. next. Line(). char. At(0), n fc = C. next. Line(). char. At(0); n for (int i = ic; i <= fc; i++) n System. out. println(i+" <-> "+(int)i); n } n} n
Métodos de Strings
Contar las apariciones de un carácter en un String
Más métodos
Función para respuesta “si” o “no”
Apariciones de un string en otro
Conversion entre números y Strings
String. Buffer y String. Builder n n n String. Buffer y String. Builder implementan una secuencia de caracteres modificable String. Buffer realiza sincronización, y puede ser utilizado simultáneamente por múltiples threads String. Builder (desde Java 5) no realiza sincronización, está orientado a ser utilizado sin concurrencia 73
Métodos de String. Buffer n n String. Buffer(String str): crea un String. Buffer a partir de un String. Buffer append(int i): concatena la variable i en el String. Buffer append(String str): concatena la variable str en el String. Buffer delete(int start, int end): elimina el substring indicado 74
Métodos de String. Buffer n n int length(): retorna el número de caracteres del String. Buffer replace(int start, int end, String substr): reemplaza el substring entre start y end por substr String substring(int start, int end): retorna un nuevo string con el substring indicado String to. String(): retorna un nuevo String a partir del String. Buffer 75
La clase String. Tokenizer El Constructor de esta clase recibe un string (y optativamente también un separador). El string es separado en varios sub-strings, de acuerdo al separador (espacio si no se recibe nada). Estos pueden ser recuperados secuencialmente por el método next. Token(). También existe el método has. More. Tokens() que retorna true si todavía quedan más substrings por retornar. String s 1 = “we are a happy family” n. String. Tokenizer st = new String. Tokenizer(s 1); n n st n n n we n are n a n happy n family String s = st. get. Token(); s = “we” n st n are n a n happy n family
Ejemplos n Conversión de un número a string String s = String. value. Of(100); String s = new Double(100). to. String(); n Conversión de un string a número int i = Integer. parse. Int(s); int i = new Integer(s). int. Value(); 77
n n n Los Archivos de Texto Se organizan en líneas de texto (Strings) Cada línea consiste una cadena de caracteres que termina con una marca de fin de línea Después de la marca de fin de línea de la última línea viene una marca de fin de archivo Por convención tienen la extensión. txt Se generan con un editor de texto (sin formato) o por un programa
Escribiendo archivos de texto n Apertura de un archivo para escritura: Print. Writer x = new Print. Writer ( n new File. Writer(filename)) n Se pueden escribir líneas con los siguientes métodos: x. print(string) n x. println(string) Si existía un archivo con ese nombre se borra y es reemplazado por el que genere el programa Es importante hacer que al final se ejecute la instrucción n x. close() para asegurarse de que los datos que aún están en el buffer sean traspasados. Hay que reportar que se usan métodos que pueden causar excepciones con throws IOException •
Ejemplo: escritura Leer líneas que terminan con la palabra “fin” y grabarlas en un archivo en disco de nombre “archivo. txt”. import java. io. *; import java. util. *; class Crear. Archivo { static public void main(String[]args) throws IOException{ Print. Writer a=new Print. Writer( new File. Writer(“archivo. txt”)); Scanner U = new Scanner(System. in); while(true){ System. out. print (“linea(o fin)? “); String linea=U. next. Line() if( linea. equals(“fin”) ) break; a. println(linea); } a. close(); } } 80
Leyendo archivos de texto en JAVA n Abrir un archivo existente : Buffered. Reader x = new Buffered. Reader( new File. Reader(filename)) Las líneas pueden ser leídas de la siguiente manera: String line = x. read. Line() Archivos se tratan secuencialmente Si no quedan líneas por leer en el archivo, el método read. Line() retornará el valor null. Hay que “importar” las clases Buffered. Reader y File. Reader poniendo al comienzo del programa la instrucción import java. io. *; Hay que “reportar” las llamadas a métodos que pueden causar excepciones con throws IOException •
Ejemplo: lectura Leer líneas que terminan con la palabra “fin” y grabarlas en un archivo en disco de nombre “archivo. txt”. import java. io. *; class Leer. Archivo{ static public void main(String[]args) throws IOException { Buffered. Reader a = new Buffered. Reader( new File. Reader(“archivo. txt”)); while(true){ String linea=a. read. Line(); if(linea==null) break; System. out. println(linea); } a. close(); } } 82
Encontrar alumno con nota mayor Lineas en el archivo “archivo. txt”: Nombre: nota Ej. Juan Perez: 6. 7 import java. io. *; class Leer. Archivo{ static public void main(String[] args) throws IOException { Buffered. Reader a = new Buffered. Reader( new File. Reader(“archivo. txt”)); String linea; String nombre; double notamax = 0. 0; while(linea=a. read. Line() != null){ int i = linea. index. Of(“: ”); double nota = Double. parse. Double(linea. substring(i+1)); if(nota > notamax) { notamax = nota; n nombre = linea. substring(0, i+1); } } a. close(); System. out. println(“Nombre: “+nombre+” Nota: “+notamax); } } 83
Otras Estructuras: Vector n n n Una implementación de lista enlazada eficiente Puede contener objetos de cualquier clase Ultimas versiones de java apuntan a que todos sean de una sola (super)clase Vector v = new Vector(); //crea un vector vacio v. add(“Hola”); v. add(new Scanner()); . . . //agregar elementos al final, v. add(5, “chao”); //agrega en el indice 5 //mostrar los elementos for(int i = 0; i < v. size(); i++) System. out. println(v. get(i). to. String()); 84
Generics: chequeo de tipos n Usando Generics se puede hacer que se chequee el tipo de objeto Vector<Tipo> v = new Vector<Tipo>(); Solo se pueden poner objetos de la Clase Tipo (o derivados) v. add(“Hola”); //produciría error de compilación 85
for-each (Java 5. 0) n For-each para Vectores (con uso de generics) // Java 1. 4 o anterior void close. All(Vector<Socket> c) { Iterator i = c. iterator(); while (i. has. Next()) { Socket t = (Socket)i. next(); t. close(); } } // Java 5. 0 void cancel. All(Vector<Socket> c) { for (Socket t : c) { t. close(); } } 86
Otras Estructuras: Hashtable n n Una implementación de un diccionario eficiente Conviene usarlo con Generics Hashtable<String, Integer> h = new Hashtable<String, Integer>(); //crea una tabla de Hashing vacía //Integer: clase Wrapper de int (Double, Char, . . . ) Integer i = new Integer(5); h. put(“Palabra”, i); Integer x = h. get(“Palabra”); int c = x. int. Value()+1; Enumeration e = x. keys(); 87
Otras Estructuras: Enumeration n n Los objetos Enumeration se crean como resultado de aplicar una funcion a una estructura Retornan una enumeracion de los elementod de esa estructura que se pueden recorrer Enumeration e = x. keys(); x. has. More. Elements() (true o false) x. next. Element() retorna el siguiente elemento while( x. has. More. Tokens()) { String s = (String)x. next. Element(); Integer I = x. get(s); System. out. println(s+” “+i); } 88
Autoboxing (Java 5. 0) n A partir de Java 5. 0, la conversión entre tipos primitivos y objetos (entre int e Integer, Integer por ejemplo) se produce de manera automática cuando se requiere n import java. util. *; // Imprime la frecuencia de los parámetros public class Frequency { public static void main(String[] args) { Hashtable<String, Integer> m = new Hashtable<String, Integer>(); for (String word : args) { Integer fr = m. get(word); m. put(word, (fr == null ? 1 : fr + 1)); } System. out. println(m); } } 89
Clases "Wrapper" n n Boolean, Boolean Byte, Byte Char, Char Double, Double Float, Float Integer, Integer Long, Long Number, Number y Short Almacenan un valor de un tipo primitivo en un objeto Del mismo modo que la clase String, estas clases son inmutables Proveen métodos para manipular y convertir los valores 90
Métodos de Integer n n n n Integer(int value): constructor Integer(String value): constructor boolean equals(Object o): compara con otro objeto int. Value(): retorna el valor del objeto como un int static int parse. Int(String s): parsea el string y retorna un int String to. String(): retorna el objeto como string static String to. String(int n): retorna el int indicado como un string 91
Ejercicio 1 n n Se tienen dos archivos: items. txt y ventas. txt Items tiene por cada línea el código de un producto y el stock actual Ej: 12345 56 Ventas tiene por cada línea el código de un producto y cuanto se vendió EJ: 12345 20 Generar un archivo llamado stockfinal. txt con el stock para cada producto después de descontar las ventas del día 92
Algoritmo sugerido Crear tabla de hashing con formato <String, Integer> abrir archivo stock. txt para lectura por cada linea: sacar el codigo y el stock, poner en la tabla el par (codigo, stock) abrir archivo ventas. txt por cada linea: sacar el codigo y la venta obtener el par (codigo, stock) correspondiente actualizar stock restandole la venta abrir archivo stockfinal para escritura por cada par (codigo, stock) de la tabla escribir en el archivo codigo+” “+stock Cerrar archivos 93
- Slides: 93