Lenguajes de Programación

TDA y Orientación a Objetos

Jorge Valencia

Departamento de Informática
Universidad Técnica Federico Santa Marı́a

Agenda

Introducción a TDAs y OO

Orientación a Objetos

Introducción al lenguaje Java

Variables, Constantes y Tipos Primitivos

Operadores

Clases y objetos

Tipos de datos frecuentes

Excepciones

Streams y archivos

Agenda

Introducción a TDAs y OO

Orientación a Objetos

Introducción al lenguaje Java

Variables, Constantes y Tipos Primitivos

Operadores

Clases y objetos

Tipos de datos frecuentes

Excepciones

Streams y archivos

¿Cómo evitar tener que recompilar todo un sistema. en vista de un pequeño cambio? . de manera que sea fácil de mantener y administrar? 2. ¿Cómo organizar una pieza de software.Problemas de desarrollo 1.

s . lógicamente relacionados. sin necesidad de recompilar todo el sistema. denominados módulos. I Agrupar en subprogramas que puedan ser compilados de forma independiente.Modularidad y Reutilización de Software Ideas: I Organizar el programa en grupos de subprogramas y datos.

Modularidad y Reutilización de Software I El proceso de diseñar módulos o contenedores sintácticos se denomina modularización. I Una unidad de compilación es un conjunto de subprogramas que pueden compilarse de manera independiente al resto del sistema. .

Encapsulación Encapsulación Agrupar un conjunto de subprogramas junto a los datos que ellos manipulan. Ventajas: I Mayor modularidad I Facilita la mantención I Permite la reutilización I Ocultamiento de la información I Énfasis en la interfaz abstrae de la implementación I Permite la reutilización . Esto permite resolver los dos problemas presentados.

Tipos de Datos Abstractos I Un TDA corresponde a una encapsulación que incluye: I La representación de un tipo de dato especı́fico I Las operaciones asociadas a ese tipo I Una instancia de un TDA se denomina objeto .

Tipos de Datos Abstractos Ocultamiento de la información Mediante control de acceso. Un cliente es una unidad de programa que hace uso de una instancia de un TDA. . detalles innecesarios de la implementación de un TDA se ocultan a aquellas unidades fuera de la encapsulación.

s i z e ( ) ) . addLast (new C h a r a c t e r ( ’ e ’ ) ) . } } . System . l i s t a . u t i l . for ( Object o : l i s t a ) System . o u t . l i s t a . p r i n t l n ( l i s t a . p r i n t l n ( o . t o S t r i n g ( ) ) . public class EjemploTDA { public s t a t i c void main ( S t r i n g [ ] args ) { L i n k e d L i s t<Object> l i s t a = new L i n k e d L i s t<Object >(). add (new S t r i n g ( ” EjemploTDA ” ) ) .Ejemplo import j a v a . l i s t a . L i n k e d L i s t . o u t . a d d F i r s t (new I n t e g e r ( 4 2 ) ) .

Problemas de Reuso Los TDAs son las unidades a reutilizar. pero: I Generalmente requieren ser adaptadas para el nuevo uso I Hacer las modificaciones implicarı́a entender los detalles de implementación del TDA reutilizado I De aquı́ surge la necesidad de establecer relaciones entre distintos TDAs. tales como padre-hijo o similitud de roles .

Agenda

Introducción a TDAs y OO

Orientación a Objetos

Introducción al lenguaje Java

Variables, Constantes y Tipos Primitivos

Operadores

Clases y objetos

Tipos de datos frecuentes

Excepciones

Streams y archivos

Visión Orientada a Objetos

I Un programa es un conjunto de objetos (instancias de
alguna clase), que corresponden a abstracción del mundo
real (problema)
I Un objeto se comunica con otro mediante paso de
mensajes
I Un objeto puede alterar su estado a causa del
procesamiento de mensajes u otros eventos.

Niveles de OO en los Leguajes

Lenguajes OO puros
Realmente consideran que todo es un objeto. Ejemplos:
Smalltalk, Eiffel, Ruby.

Lenguajes OO no puros
Diseñados para programación OO, pero mantienen algunas
caracterı́sticas de otros paradigmas. Ejemplos: Java mantiene
tipos de datos primitivos (i.e. no-objetos); Python tiene
elementos de la programación funcional y la programación
orientada a aspectos.

Lenguajes extendidos a OO
Históricamente han seguido otro paradigma pero se han
extendido para soportar caracterı́sticas de la OO. Ejemplos:
C++,Fortran 2003, Perl.

Polimorfismo Con especie particular de ligado de métodos a su implementación (clases y métodos virtuales en C++.Soporte para Programación OO Tipos de datos abstractos Soporte para clases y objetos. Herencia Puede ser simple o múltiple. . interfaces en Java).

Objetos I Un objeto tiene estado y comportamiento I El estado se mantiene con variables I El comportamiento se implementa mediante métodos I Un objeto encapsula su estado a través de sus métodos I Con esto también controla la manipulación de su estado .

O.Idea General de O. .

Ejemplo de Objeto: LinkedList .

si aplica I Los objetos no requieren estar en el mismo proceso o máquina .Mensajes I Objetos interactúan intercambiando mensajes I Un mensaje consiste en: I Identificador del objeto I Identificador del método I Parámetros.

Mensajes (1) .

Mensajes (2) .

u t i l . addLast (new C h a r a c t e r ( ’ e ’ ) ) . s i z e ( ) ) . l i s t a . L i n k e d L i s t . p r i n t l n ( l i s t a . t o S t r i n g ( ) ) . a d d F i r s t (new I n t e g e r ( 4 2 ) ) . public class EjemploTDA { public s t a t i c void main ( S t r i n g [ ] args ) { L i n k e d L i s t <Object> l i s t a = new L i n k e d L i s t <Object > ( l i s t a . p r i n t l n ( o . add (new S t r i n g ( ” EjemploTDA ” ) ) . o u t .Mensajes: ejemplo en Java import j a v a . } } . System . o u t . l i s t a . for ( Object o : l i s t a ) System .

Clases I Introducidas en SIMULA 67 I Una clase representa un conjunto de objetos con caracterı́sticas comunes I Se puede interpretar como una plantilla de objetos I Un objeto es una instancia de una clase I Una clase puede tener variables de clase (o campos de clase) como también métodos de clase. estos son comunes para todos los objetos de la misma clase .

en Java es implı́cita) . ocupan memoria I Se les puede instanciar de forma estática. por lo tanto.Clases vs. Objetos I Una clase define un tipo abstracto de datos I Los objetos son instancias de una clase y. dinámica de stack o dinámica de heap (C++ permite las tres formas) I Si se crean en el heap su destrucción puede ser explı́cita o implı́cita (en C++ es explı́cita.

} double complex : : g e t I m a g i n a r y P a r t ( ) { return imaginary . h ” complex : : complex ( double re . } double complex : : g e t R e a l P a r t ( ) { return r e a l .Clases: ejemplo en C++ # include ” c l a s e s . } . i m a g i n a r y = im . double im ) { r e a l = re .

Clases: ejemplo en C++ using namespace s t d . c o u t << com . } . h ” i n t main ( ) { complex com ( 1 . # include <iostream > # include ” c l a s e s . g e t R e a l P a r t ( ) << ’ ’ << com . 2 . 3 . g e t I m a g i n a r y P a r t ( ) << e n d l . 0 ) . return 0.

tam . tam ++. } public void add ( i n t dato ) { i f ( s g t e == n u l l ) s g t e =new L i s t a E n l a z a d a ( dato ) . } public i n t s i z e ( ) { r e t u r n tam . } } .Clases: ejemplo en Java (ListaEnlazada. r e t u r n ( s g t e . dato=dato . tam =1.java) public class L i s t a E n l a z a d a { p r i v a t e i n t dato . g e t(−−i n d e x ) ) . else s g t e . s g t e = n u l l . public L i s t a E n l a z a d a ( i n t dato ) { t h i s . } public i n t g e t F i r s t ( ) { r e t u r n dato . } public i n t g e t L a s t ( ) { r e t u r n g e t ( tam − 1 ) . private ListaEnlazada sgte . } public i n t g e t ( i n t i n d e x ) { i f ( i n d e x ==0) r e t u r n dato . add ( dato ) .

l i s t a . System .java) public class E j e m p l o L i s t a E n l a z a d a { public s t a t i c void main ( S t r i n g [ ] args ) { L i s t a E n l a z a d a l i s t a =new L i s t a E n l a z a d a ( 6 ) . println ( lista . l i s t a . System . System . println ( lista . getLast ( ) ) . System .Clases: ejemplo en Java (EjemploListaEnlazada. l i s t a . getFirst ( ) ) . add ( 5 ) . add ( 0 ) . add ( 3 ) . } } . o u t . l i s t a . o u t . l i s t a . add ( 1 ) . l i s t a . add ( 4 ) . println ( lista . o u t . add ( 2 ) . get ( 3 ) ) . size ( ) ) . println ( lista . o u t .

sin alterarlos I La reutilización se realiza definiendo nuevos TDAs que modifican o extienden la funcionalidad del TDA base I De este modo se permite adaptar un TDA a las condiciones particulares de un problema con menos esfuerzo .Herencia I Permite reusar tipos de datos abstractos ya definidos.

Jerarquı́a de Herencia I Una clase que hereda de otra se denomina clase derivada o subclase I La clase superior se denomina clase padre o superclase .

Jerarquı́a de Herencia: ejemplo .

} public S t r i n g t o S t r i n g ( ) { r e t u r n nombre+ ” ( ” + r u t + ” ) ” . } public S t r i n g getNombre ( ) { r e t u r n nombre . t h i s .Jerarquı́a de Herencia: ejemplo en Java (Persona. nombre=nombre .java) public class Persona { private String r u t . } public S t r i n g getRut ( ) { return r u t . rut = rut . public Persona ( S t r i n g r u t . . p r i v a t e S t r i n g nombre . S t r i n g nombre ) { this .

public E s t u d i a n t e ( S t r i n g r u t . ” Jorge ” ) .Jerarquı́a de Herencia: ejemplo en Java (Estudiante. r o l = r o l .java) public class E s t u d i a n t e extends Persona { private String r o l . } public S t r i n g g e t R o l ( ) { return r o l . S t r i n g r o l ) { super ( r u t . this . } } .

g e t R o l ( ) ) .Jerarquı́a de Herencia: ejemplo en Java (EjemploHerencia.678−9 ” . ” p r o f e ” ) . p r i n t l n ( p r o f e s o r . / / System .567.892−3 ” . p r i n t l n ( e s t u d i a n t e . o u t . /∗ E r r o r ∗/ } } . System . o u t . o u t . getRut ( ) ) . System . o u t . E s t u d i a n t e e s t u d i a n t e = new E s t u d i a n t e ( ” 13. getRut ( ) + ” <−> ” + e s t u d i a n t e . / / profesor .java) public class EjemploHerencia { public s t a t i c void main ( S t r i n g [ ] args ) { Persona p r o f e s o r = new Persona ( ” 12. getRut ( ) ) . System . p r i n t l n ( x . ” 2405063−1 ” ) .789−2 ” . getRol ( ) /∗ E r r o r ∗/ /∗ Se puede? ∗/ Persona x = new E s t u d i a n t e ( ” 14. p r i n t l n ( ” La persona ” + x ) . p r i n t l n ( x .456. o u t . ” 2391505−7 ” ) . g e t R o l ( ) ) .345. System .

entonces B (subclase) hereda todo lo de A (superclase) I Una subclase heredera tiene la opción de reimplementar a su modo algun método heredado (override) .Herencia: Relaciones entre Clases I El mecanismo de herencia permite extender una clase (agregar variables o métodos) I Si B extiende a A.

que definen un comportamiento genérico y que debe ser definido por las clases herederas I En resumen. representa un mecanismo de reutilización de interfaces y código .Ventajas de la Herencia I Subclases pueden proveer un comportamiento especializado basado en la superclase I Los programadores pueden definir clases abstractas.

Herencia Múltiple: ejemplo La nueva clase hereda a partir de dos o más clases: .

teniendo en cuenta el aumento en la complejidad de la organización de la jerarquı́a .Problemas con la Herencia Múltiple I Colisión de nombres I Pérdida de eficiencia dada su complejidad (sobretodo en el ligado de métodos) I No es claro que su uso mejore el diseño y la facilidad en la mantención de sistemas.

Polimorfismo I Permite tratar a objetos como si fueran del tipo de la superclase I Las subclases implementan métodos que llevan el mismo nombre que tienen en la superclase. cambiando su comportamiento I Cuando se invoca a uno de estos métodos se debe hacer un ligado dinámico a la implementación que corresponda .

Polimorfismo: ejemplo .

toda clase que tenga al menos un método virtual se denomina clase virtual .Clases y Métodos Virtuales I A veces no tiene sentido la instanciación de objetos de determinadas clases. dependiendo de la abstracción realizada I En estos casos la clase puede implementar un grupo de métodos y definir un prototipo de los métodos que deben implementar sus subclases I Los estos prototipos de métodos se llaman métodos virtuales.

v i r t u a l double g e t P e r i m e t r o ( ) = 0 . . class f i g u r a { public : v i r t u a l double getArea ( ) = 0 .Clases y Métodos Virtuales: ejemplo en C++ (figura) using namespace s t d . }.

0 ∗ l a d o . . class cuadrado : public f i g u r a { private : double l a d o . } }. } double getArea ( ) { r e t u r n l a d o ∗ l a d o . public : cuadrado ( double l ) { l a d o = l . } double g e t P e r i m e t r o ( ) { r e t u r n 4 .Clases y Métodos Virtuales: ejemplo en C++ (cuadrado) using namespace s t d .

} double g e t P e r i m e t r o ( ) { r e t u r n 2 ∗ p i ∗ r a d i o . s t a t i c const double p i = 3.Clases y Métodos Virtuales: ejemplo en C++ (circulo) class c i r c u l o : public f i g u r a { private : double r a d i o . } double getArea ( ) { r e t u r n p i ∗ r a d i o ∗ r a d i o . public : c i r c u l o ( double r ) { r a d i o = r . } }.14159265358979323846. .

f i g [ 1 ] = new c i r c u l o ( 3 . } .Clases y Métodos Virtuales: ejemplo en C++ (uso figuras. f o r ( i n t i = 0 . f i g [ 0 ] = new cuadrado ( 2 . 0 ) .cpp) # include <iostream> # include ” figura ” # include ” cuadrado ” # include ” circulo ” using namespace s t d . i < 2 . 3 ) . i n t main ( ) { figura ∗fig [2]. return 0. i ++) c o u t << f i g [ i ]−>getArea ( ) << ’ ’ << f i g [ i ]−>g e t P e r i m e t r o ( ) << e n d l .

Interfaces I Definen un protocolo para la interacción entre objetos sin necesidad de conocer su clase I Una o más clases pueden implementar una misma interfaz I Una clase que implemente a una interfaz debe necesariamente implementar cada uno de sus métodos .

} .Interfaces: ejemplo en Java (Ejecutable.java) public i n t e r f a c e E j e c u t a b l e { public void e j e c u t a r ( ) .

public Tarea ( i n t n . n=n . o u t . } public void e j e c u t a r ( ) { f o r ( i n t i =0. i <n .Interfaces: ejemplo en Java (Tarea. S t r i n g mensaje ) { t h i s . t h i s . p r i n t l n ( mensaje ) . mensaje=mensaje . p r i v a t e S t r i n g mensaje .java) public class Tarea implements E j e c u t a b l e { private int n . i ++) System . } } .

sin revelar la implementación .Interfaces: ventajas I Capturan similitudes entre clases no relacionadas. sin forzar una relación artificial entre ellas I Permiten declarar métodos que se espera que implementen las clases que responden a la interfaz I Permiten establecer un contrato de programación.

Constantes y Tipos Primitivos Operadores Clases y objetos Tipos de datos frecuentes Excepciones Streams y archivos .Agenda Introducción a TDAs y OO Orientación a Objetos Introducción al lenguaje Java Variables.

Historia 1991: James Gosling inicia un proyecto para escribir código independiente de la arquitectura para sistemas empotrados. . 1993: Desarrolla un nuevo lenguaje llamado OAK. 1995: Sun anuncia la disponibilidad del lenguaje Java y el browser HotJava con soporte para applets En la actualidad se reconoce al leguaje Java por ser una tecnologı́a clave en la explosión de la WWW. similar a C++ pero más seguro y portable. 1994: Aparece la World Wide Web y Mosaic. Intenta con C++ pero no le satisface.

Plataforma Incluye a la Java Virtual Machine y la especificación de una extensa API. en al menos tres ediciones: I JSE: Java Standard Edition I JME: Java Micro Edition I JEE: Java Enterprise Edition . Tres sabores. orientado a objetos. Se distribuye.. con sintaxis similar a la de C++..Tecnologı́a Java Leguaje de Programación Especificado por Sun Microsystems. segun la necesidad.

con tipos de dato thread-safe para concurrencia. I Soporte multihebra en la JVM. I Protable. Realiza revisiones en tiempo de compilación y ejecución. diseñado para producir software confiable. integración CORBA). I Alto rendimiento. I Robusto y seguro. .Caracterı́sticas I Leguaje simple. orientado a objetos. neutro de la arquitectura. con posibilidad de compilar parte de un programa a código de máquina. sintaxis similar a C++. I Facilidades para distribución de componentes (RMI.

API Java I java. I java.applet: Desarrollo de applets I java. etc. streams. propiedades del sistema. etc.math: Clases utilitarias para matemáticas I java. streams.io: Entrada/salida en general.lang: Tipos de datos fundamentales del lenguaje. I java. I java. etc. consola. fecha.awt: Interfaces gráficas de usuario (GUIs) I java. sockets. strings.net: Redes.rmi: Remote Method Invocation . hora. archivos.

polı́ticas de seguridad. rmi. . Java2D. internacionalización (i18n. colas.text: Procesamiento de textos I java. matrices. vectores. seguridad. manejo de imágenes.). impresión. etc. control de acceso.util: Utilidades varias como el Collection Framework (colecciones.sql: Java DataBase Conectivity (JDBC) I java. etc. l10n). SWING. etc. I javax: contiene paquetes adicionales con clases para accessibilidad. Java3D. extensiones a la API de red. servicios de nombres. listas. eventos.API Java I java. autenticación. etc. CORBA. sonido. pilas. transacciones. XML. I java. funciones criptográficas.security: Encriptación.

Prentice Hall.sun. 4th Edition. http://www.sun.com/javase/6/docs/api/. Thinking in Java.html. http://mindview.com/docs/books/jls/index. I Java Language Specification: http://java. Prentice Hall.net/Books/TIJ4.com/docs/books/tutorial/. I Sun’s Java Tutorials: http://java. 3rd Edition.net/Books/TIJ/. Thinking in Java.mindview. . I Java API Specification: http://java.sun. I Java 5/6: I Bruce Eckel.¿Dónde aprender sobre Java? I Java 2: Bruce Eckel.

Ciclo de un programa Java .

indicándole el nombre de la clase cuyo método main será ejecutado. I Esta clase no es instanciada. .Ejecución de un programa Java I Para ejecutar un programa se debe iniciar la Máquina Virtual Java (JVM). I Este método main es el encargado de instanciar los objetos que compondrán el programa y hacerlos interactuar.

p r i n t l n ( ” Hola Mundo ! ” ) . o u t .¡Hola Mundo! public class HolaMundoApp { public s t a t i c void main ( S t r i n g [ ] args ) { System . } } .

I Difiere de un programa normal en su modelo de ejecución. sino que instanciará la clase especificada y la dibujará con ayuda de la API AWT. I Su uso normal es a través de la Web. . I El browser es el encargado de iniciar una máquina virtual que no correrá un método main.Applets I Significa “aplicacioncita”.

Applets: modelo de ejecución .

s q l . /∗ ∗ ∗ l a c l a s e HolaMundo implementa una a p p l e t que ∗ simplemente d e s p l i e g a ” Hola Mundo ! ” . ∗ .Applets: ejemplo import j a v a . g . } } . A p p l e t public void p a i n t ( j a v a . awt . import j a v a . 50 . Graphics g ) { j a v a . ∗ . a p p l e t . u t i l . Date fecha . ∗/ public class HolaMundoApplet extends j a v a . d r a w S t r i n g ( ” Hola Curso Dormido ! ” . u t i l .

c l a s s ” WIDTH=150 HEIGHT=25> < / APPLET> < /BODY> < /HTML> .Applets: ejemplo <HTML> <HEAD> <TITLE>Un Programa Simple con A p p l e t< / TITLE> < /HEAD> <BODY> Aqui v i e n e l a s a l i d a d e l programa : <APPLET CODE= ” HolaMundoApplet .

package s i n s e n t i d o . I Para utilizar una clase A desde una clase B. I Este mecanismo permite evitar colisiones de nombres.Nombres I Los nombres de las clases se agrupan en paquetes. los que se comportan como espacios de nombres. I Para declarar el paquete al que pertenece una clase se usa la palabra reservada package. entonces hay que importar el espacio de nombres (paquete) al que pertenece A. public class ClaseNula { } .

Clase) o simplemente importar una vez el paquete en que se encuentra.* para poder utilizar todas las clases de los paquetes java. Para seleccionar una de las dos a utilizar se debe hacer referencia a su nombre completo (paquete.awt. I En el ejemplo del applet se utilizan las sentencias import java.sql.Nombres I Por ejemplo.util como en java.* e import java.awt.applet y java. .applet. la clase Date existe tanto en el paquete java.

I En el ejemplo del applet... .Subclases I La palabra clave extends permite establecer una relación de herencia. la clase HolaMundoApplet hereda la implementación de la clase base java.applet.Applet: public class HolaMundoApplet extends Applet .

estos definen el comportamiento de los objetos de dicha clase. En el ejemplo: public void p a i n t ( Graphics g ) { g . 2 5 ) . el método paint se debe implementar para indicar la forma en que dicho applet se dibujará en alguna región de la pantalla. d r a w S t r i n g ( ” Hola Mundo ! ” .Métodos I Una clase puede implementar uno o más métodos. } I En el caso de los applets. 50 . .

I La codificación particular utilizada es UTF-16. y sin mayor esfuerzo. I UTF-16 interpreta de forma correcta. codificaciones como ASCII básico (7 bits) con extensiones como latin1 (ISO 8859-1). separando el repertorio de caracteres del esquema de codificación. .Codificación I Java utiliza el estándar Unicode. que utiliza una cantidad variable de bits para representar un caracter.

se permiten identificadores como Árbol.Identificadores I Deben comenzar con una letra. incluido o $.g. etc. árbol es diferente a Árbol) I Java define algunas palabras reservadas que no pueden ser usadas como identificador (ver especificación del lenguaje) . Hähnchen. seguido de letras o dı́gitos I Debido a que el repertorio de caracteres Unicode es más amplio. I Es sensible a la capitalización (e.

Agenda

Introducción a TDAs y OO

Orientación a Objetos

Introducción al lenguaje Java

Variables, Constantes y Tipos Primitivos

Operadores

Clases y objetos

Tipos de datos frecuentes

Excepciones

Streams y archivos

Datos primitivos

I En general se comportan igual que C
I Java hace inicialización automática de sus valores
I Cada tipo primitivo (excepto short y byte) tiene una
clase declarada en el paquete java.lang que define
constantes tales como:
I MIN VALUE y MAX VALUE
I NEGATIVE INFINITY y POSTIVE INFINITY
I NaN (Not a Number)

Declaración de variables

[modificador] tipo variable {, variable}∗
I Modificador es opcional. Opciones: static o final
I final sólo se puede usar en campos (atributos)
I Ejemplo: float x, y;
I Declaraciones pueden aparecer casi en cualquier parte
del código
I La visibilidad de una variable se limita al bloque en que se
declara

g.Resolución de nombres I Declaración local a un bloque (e. Loop) I Parámetro de un constructor o método I Un miembro de una clase o interfaz I Tipos explı́citamente importados I Otros tipos declarados en el mismo paquete I Tipos importados implı́citamente nombrados I Paquetes disponibles en el sistema host .

datos lógicos o referencias. Por ejemplo: final double pi = 3. para datos primitivos.Valores iniciales I Una variable se puede inicializar en su declaración.14159. false o null. I Java asigna valores por omisión a los campos de una clase si no se especifica I Este valor es cero. respectivamente I Variables locales de un método. constructor o inicializador estático no se inicializan I Una variable se inicializa cada vez que se alcanza su declaración .

Agenda Introducción a TDAs y OO Orientación a Objetos Introducción al lenguaje Java Variables. Constantes y Tipos Primitivos Operadores Clases y objetos Tipos de datos frecuentes Excepciones Streams y archivos .

. se asocia por la izquierda. sin exagerar. Por ejemplo: while ( ( v = stream .Precedencia y asociatividad I A igual precedencia. de manera de hacer explı́cita la precedencia. excepto asignación que es por la derecha I La precedencia se pueda cambiar usando paréntesis I Para legibilidad se recomienda usar paréntesis. n e x t ( ) ) ! = n u l l ) procesar ( v ) . cuando sea posible.

Expresiones I Una expresión se evalúa de izquierda a derecha I Orden puede ser importante cuando existen efectos laterales o corto-circuito I Cada operando se evalúa antes de realizar la operación I Cada expresión tiene un tipo I En general domina el operando de mayor rango de valores (e.g. double + long→double) .

. ¡Es automática! I Se permite entre valores primitivos cuando se soporta un mayor rango de valores I No se permite de punto flotante a entero I En la conversión se puede perder precisión I Una referencia a un objeto de una clase incluye la compatibilidad para los supertipos I Se puede usar una referencia a un objeto de un tipo cuando se requiera una referencia a un supertipo (upcast) .. I Conversión implı́cita.Conversión de tipo: implı́cita Esta se realiza de forma automática.

99. I Se puede usar para referencias a objetos con conversión no segura (downcast) I Operador instanceof permite verificar si se puede aplicar cast a un objeto if (obj instanceof clase) .Conversión de tipo: explı́cita I Se requiere cuando un tipo no se puede asignar a otro por conversión implı́cita I La conversión explı́cita se denomina cast I Ejemplo: double d = 7. .. long l = (long) d..

Constantes y Tipos Primitivos Operadores Clases y objetos Tipos de datos frecuentes Excepciones Streams y archivos .Agenda Introducción a TDAs y OO Orientación a Objetos Introducción al lenguaje Java Variables.

pero es su implementación la que define su semántica .Conceptos generales I Las clases definen los métodos que detallan el comportamiento de un objeto I Los campos o atributos definen el estado I Un método tiene una firma sintáctica.

salvo que sea declarada pública abstract La clase no puede ser instanciada final La clase no puede ser derivada .Modificadores de clases public Por omisión una clase sólo es accesible por clases del mismo paquete.

cuando se habla de variables y métodos miembros se refiere a aquellos no estáticos .Atributos I Cada objeto de una clase tiene sus propias instancias de cada variable miembro I Significa que cada objeto tiene su propio estado I Cambio de estado en un objeto no afecta a otros objetos I Variables miembros se pueden compartir entre todos los objetos de una clase con el modificador static I Todos los objetos de una clase comparten una única copia de un campo declarado como static I En general.

Control de acceso I Todos los métodos y variables miembro están disponibles para el código de la propia clase I Para controlar el acceso a otras clases y subclases. los miembros tienen 4 posibles modificadores: I Privado: Declarados con private son sólo accesibles por la propia clase I Paquete: Miembros sin modificador de acceso son sólo accesibles por código y heredados por subclases en el mismo paquete I Protegido: Declarados con protected son accesibles por una subclase (que puede estar fuera del paquete). como también por código del mismo paquete I Público: Declarados con public son accesibles por cualquier clase .

sino que una referencia a un objeto. que inicialmente es null I Cuando se usa el operador new.291 −6 ” ) . el JRE retorna la referencia al nuevo objeto .Creación de objetos Persona p1 .333. Persona p2=new Persona ( ” Pedro ” . I Se han declarados dos referencias a objetos de clase Persona I La declaración de una variable no crea un objeto. se lanza un OutOfMemoryError I Terminada la inicialización. e inicializando el objeto con algún constructor I Si no existe suficiente memoria se ejecuta el recolector de basura (garbage collector). el JRE crea un objeto. ” 10. y si aún no existe suficiente memoria. asignando suficiente memoria.

pero no retornan un valor I Una clase puede tener varios constructores . tienen el mismo nombre de la clase y pueden recibir parámetros.Constructores I Un objeto recién creado debe inicializar las variables miembro I Las variables miembro pueden ser inicializadas explı́citamente en la declaración I Muchas veces se requiere algo más (e. ejecutar código para abrir un archivo) I Los constructores cumplen ese propósito I Son “métodos” especiales.g.

Bloques de inicialización estáticos I Permiten a una clase inicializar variables miembro estáticas u otros estados necesarios I Se ejecutan en el orden que aparecen declarados I Ejemplo: UnicaInstancia. } public U n i c a I n s t a n c i a ( ) {} public s t a t i c U n i c a I n s t a n c i a g e t I n s t a n c i a ( ) { return i n s t a n c i a . } } .java class U n i c a I n s t a n c i a { private static UnicaInstancia instancia . static { i n s t a n c i a =new U n i c a I n s t a n c i a ( ) .

} . close ( ) .Método finalize I Permite ejecutar código de finalización antes de liberar memoria I Es el equivalente al concepto de destructor en C++ I Es útil cuando se usan recursos externos y que deben liberarse (evitar fuga de recursos) I Ejemplo: cerrar archivos o conexiones de red abiertas protected void f i n a l i z e ( ) throws Throwable { super . f i n a l i z e ( ) . archivo .

Método toString

I Si un objeto soporta el método toString, este método se
invocará en cualquier expresión que requiera hacer
transformación implı́cita al tipo String.
public class Persona {
private String r u t ;
p r i v a t e S t r i n g nombre ;

public Persona ( S t r i n g r u t , S t r i n g nombre ) {
this . rut = rut ;
t h i s . nombre=nombre ;
}

public S t r i n g getRut ( ) {
return r u t ;
}

public S t r i n g getNombre ( ) {
r e t u r n nombre ;
}

public S t r i n g t o S t r i n g ( ) {
r e t u r n nombre+ ” ( ” + r u t + ” ) ” ;
}
}

Método toString

Persona p=new Persona ( ” 12.345.876 −9 ” ,
” Gonzalo Gonzalez ” ) ;
System . o u t . p r i n t l n ( ” Se creo l a persona : ” + p ) ;

Constructores y herencia

I Al crear un objeto, el orden de ejecución es:
I Se invoca el constructor de la superclase (si no se
especifica cuál, se usa el por omisión)
I Inicializar los campos usando sentencias de inicialización
I Ejecutar el cuerpo del constructor
I Si se quiere usar un constructor especı́fico de la
superclase debe invocarse con super(...)

No es igual a verificar que tienen la misma referencia (se puede hacer con el operador ==) public int hashCode() Retorna código hash del objeto. que es usualmente único para cada objeto. . Sirve para ser usados en tablas de hash.Otros métodos de Object public boolean equals(Object obj) Compara si dos objetos tienen el mismo valor. Por omisión se supone que un objeto es sólo igual a si mismo.

Otros métodos de Object protected Object clone() throws CloneNotSupportedException Retorna un clon del objeto. Permite utilizar reflexión. . public final Class getClass() Retorna un objeto de tipo Class que representa la clase del objeto this.

Métodos equals y hashCode I Los métodos equals y hashCode deben ser redefinidos conjuntamente I Normalmente dos objetos no son iguales. dado que retornan diferentes códigos de hash I Para que dos objetos sean iguales en valor deben retornar el mismo código de hash .

Clonación de objetos I El método clone permite clonar un objeto I Cambios posteriores en el clon no afectan al estado del objeto original I Una clase que permite clonar objetos normalmente implementa la interfaz java.lang.Cloneable I Aquellas clases que tienen atributos que son referencias deben redefinir el método clone para clonar los objetos referenciados .

p u b l i c c l a s s Stack implements Cloneable { p r i v a t e Vector items . ∗ . // codigo de l o s metodos y c o n s t r u c t o r de Stack protected Object clone ( ) throws CloneNotSupportedException { Stack s=new Stack ( ) . clone ( ) . items = ( Vector ) items . / / clona e l v return s . u t i l . s . / / retorna el clon } } .Clonación de objetos: ejemplo import java .

Agenda Introducción a TDAs y OO Orientación a Objetos Introducción al lenguaje Java Variables. Constantes y Tipos Primitivos Operadores Clases y objetos Tipos de datos frecuentes Excepciones Streams y archivos .

además agrega el atributo public final length.Arrays provee algunos algoritmos interesantes para operar con arreglos I ¿Cómo se llama la clase de un objeto arreglo? I ¿Qué pasa si intento acceder a un ı́ndice fuera del rango permitido? . donde T es el tipo componente del arreglo. Los objetos arreglo son instancias de clases especiales que heredan todos los miembros de la clase Object I El único método que es sobreescrito es clone.Arreglos I En Java los arreglos son objetos. cuyo tipo de retorno es T[].util. que indica el largo del arreglo I La clase utilitaria java.

p r i n t l n ( ” Ups ! ” +e ) . 2} . p r i n t l n ( ) . g e t C l a s s ( ) . n u l l }. } System . p r i n t l n ( e ) .java) class E j e m p l o A r r e g l o s { public s t a t i c void main ( S t r i n g [ ] args ) { i n t i a [ ] [ ] = { {1 . getName ( ) ) . o u t . e r r . getName ( ) ) .Arreglos: ejemplo (EjemploArreglos. p r i n t l n ( i a . o u t . } } . p r i n t l n ( i a [ 1 0 ] ) . o u t . System . g e t C l a s s ( ) . o u t . System . System . p r i n t l n ( i a [ 0 ] . o u t . } catch ( E x c e p t i o n e ) { System . try { f o r ( i n t [ ] ea : i a ) f o r ( i n t e : ea ) System .

StringTokenizer.util.io.StringWriter . java.StringReader o java.Strings I Para uso básico de strings Java provee las clases Character: para manipulación de caracteres String: para utilización de cadenas inmutables StringBuffer: para utilización de cadenas mutables I Character es una clase wrapper para el tipo primitivo char I La documentación de la API Java describe ampliamente los distintos usos de estas clases y otras más para manipulación de strings como java.io.

length ( ) . i f ( args . append ( i n v e r t i r . i −−) d e s t i n o . o u t .java) public class E j e m p l o S t r i n g s { public s t a t i c void main ( S t r i n g [ ] args ) { String i n v e r t i r = ” lenguajes ” . System . c h a r A t ( i ) ) . int largo = i n v e r t i r .Strings: ejemplo (EjemploStrings. } } . S t r i n g B u f f e r d e s t i n o = new S t r i n g B u f f e r ( l a r g o ) . l e n g t h > 0 ) i n v e r t i r =args [ 0 ] . f o r ( i n t i = ( l a r g o − 1 ) . i >= 0 . p r i n t l n ( d e s t i n o ) .

Float.14” ).2). Integer.parseFloat(”3. Long y Short I Todas estas clases incluyen métodos de clase para conversión de strings al tipo primitivo especı́fico. Double. floatValue.Number provee una base para conversión entre tipos numéricos I Sus únicos métodos son byteValue. intValue. doubleValue. permitiendo la especificación de una base (sólo para enteros): float pi=Float.lang. int x=Integer.parseInt( ”101”. longValue y shortValue I De ella heredan las clases wrappers Byte.Números I La clase abstracta java. // x = 5 .

Math provee las constantes de clase E (para Euler) y PI (para π) como double para su utilización en conjunto con una serie de funciones matemáticas como: I Valor absoluto I Funciones trigonométricas y sus inversas I Aproximación a enteros I Exponenciación y logaritmos I Números al azar I Signo.Números La clase utilitaria java. máximos y mı́nimos I Conversión de ángulos en grados ↔ radianes .lang.

Agenda Introducción a TDAs y OO Orientación a Objetos Introducción al lenguaje Java Variables. Constantes y Tipos Primitivos Operadores Clases y objetos Tipos de datos frecuentes Excepciones Streams y archivos .

g. etc.Motivación I Cuando ocurren errores es importante que un programa sea capaz de reaccionar al evento. disco lleno). error en un dispositivo (e. por ejemplo: I Notificar al usuario de un error I Guardar el trabajo hecho I Volver a un estado anterior seguro I Terminar limpiamente el programa I Los errores se pueden producir por problemas en la entrada de datos. errores en el código del programa. . Impresora apagada.

se dice que este captura (catch) la excepción . entonces se captura la excepción invocando al manipulador de la excepción. la JVM avisa de este al programa lanzando un objeto de excepción I De este modo el control se traslada a algún punto definido por el programador I Si este punto se define. sino se se termina el programa I Se dice que el punto en que se produce el problema lanza (throws) una excepción.Excepciones I Una excepción corresponde a un evento que interrumpe el flujo normal de ejecución I Cuando ocurre tal tipo de evento. si existe un punto de control de la excepción.

Ventajas de excepciones I Provee un mecanismo limpio para el tratamiento de errores (evita tener que estar retornando valores no esperados para inidicar problemas) I Separa el código para tratamiento de errores del código de ejecución normal I Permite agrupar las condiciones de error I Como toda excepción es una instancia de una clase. por lo que es posible controlar una excepción en cualquier parte del stack de llamados . estas se pueden heredar para afinar el control de errores I Se propagan entre llamadas anidadas.

Tratamiento de errores: ejemplo en C De la página de manual de fopen (man fopen): . fdopen y freopen devuelven un puntero a FILE. . o a freopen no era válido.. fdopen.. VALOR DEVUELTO Cuando acaban bien.. ERRORES EINVAL El modo pasado a fopen.. fopen. devuelven NULL y la variable global errno contiene un valor que indica el error. Cuando no. .

} catch ( Fil eNo tFo und Exc ept ion e ) { System . } } } . } catch ( IOException e ) { System . p r i n t l n ( ” E r r o r de E / S” ) . p r i n t l n ( s ) . i o . j a v a ” ) ) . s ! = n u l l . r e a d L i n e ( ) ) System . p r i n t l n ( ” E l a r c h i v o no e x i s t e ” ) . ∗ . e r r . } catch ( EOFException e ) { System . r e a d L i n e ( ) . e r r . s= a r c h i v o . f o r ( S t r i n g s= a r c h i v o . o u t . public class EjemploExp { public s t a t i c void main ( S t r i n g [ ] args ) { try { BufferedReader a r c h i v o = new BufferedReader ( new F i l e R e ad e r ( ” EjemploExp .Tratamiento de errores: ejemplo en Java import j a v a . o u t . p r i n t l n ( ” F i n d e l a r c h i v o ” ) .

Anidamiento de excepciones: ejemplo void metodo1 ( ) { try { metodo2 ( ) . } catch ( E x c e p t i o n e ) { System . } . p r i n t l n ( ” Ups ! O c u r r i o e l s i g u i e n t e e r r o r : ” + e ) . 0 ) . ” ) . e r r . } void metodo3 ( double f ) throws I l l e g a l A r g u m e n t E x c e p t i o n { i f ( f >1) throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” E l argumento debe s e r menor a uno . } } void metodo2 ( ) throws I l l e g a l A r g u m e n t E x c e p t i o n { metodo3 ( 1 5 .

Representa un error interno o agotamiento de recursos en el sistema runtime de Java I Exception. a menudo.Jerarquı́a de errores I En Java toda excepción se deriva de la clase Throwable I Existen dos subclases conocidas: I Error. Error o cualquiera de sus subtipos. I Las excepciones se pueden clasificar en: I Unchecked Exceptions: Identificadas for ser instancias de RuntimeException. Representa un error en el programa. es dı́ficil recuperarse. . I Checked Exceptions: Corresponden a todo el resto de las excepciones y toman este nombre porque el compilador Java hace un revisión del correcto tratamiento de éstas excepciones que puedan ocurrir. Representan problemas que pueden ocurrir en demasiadas partes de un programa y de los cuales.

entonces puede lanzar cualquier excepción de alguna subclase de ella I Aquellas excepciones que son capturadas (catch) no salen del método y no debieran ser declaradas . I Al advertir sobre una clase de excepciones sin tratar...Tratamiento de excepciones I Un método debe advertir al compilador sobre todas las excepciones verificadas (checked que no puede tratar por medio de la palabra reservada throws: public String readLine() throws IOException .

” ) .Tratamiento de excepciones: lanzar I Se debe elegir una clase apropiada de excepción (se pueden crear excepciones personalizadas si es necesario) I Hay que instanciar un objeto de excepción de esa clase I Finalmente la excepción es lanzada con throw i f ( x>1) throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” E l argumento debe s e r menor a uno . .

varias subclases diferentes de excepciones pueden tener un único bloque de control I Se puede utilizar la cláusula finally para definir un bloque de código que se debe ejecutar en caso de excepción o ejecución normal I Estos bloque s de control puede relanzar la excepción o incluso lazar una excepción distinta .Tratamiento de excepciones: capturar I Palabra clave try permite definir un bloque de sentencias para las cuales se quiere controlar excepciones I Para cada clase de excepción se define un bloque de control diferente con catch I Usando una superclase común.

e r r . p r i n t l n ( ” E r r o r de E / S con e l a r c h i v o : ” + e ) . try { a r c h i v o =new B u f f e r e d r e a d e r (new F i l e R ea d e r ( ” m i a r c h i v o ” ) . .. } catch ( IOException e ) { System . close ( ) . } . p r i n t l n ( ” Se e n c o n t r o un e r r o r desconocido : ” + e ) . } catch ( E x c e p t i o n e ) { System . e r r .Captura de excepciones: ejemplo BufferedReader a r c h i v o . } finally { i f ( archivo != null ) archivo ..

Agenda Introducción a TDAs y OO Orientación a Objetos Introducción al lenguaje Java Variables. Constantes y Tipos Primitivos Operadores Clases y objetos Tipos de datos frecuentes Excepciones Streams y archivos .

dispositivos.g. conexiones de red.Streams I E/S es en principio una secuencia de bytes (e.) I Java provee dos clases básicas para E/S de bytes: InputStream y OutputStream I Estas clases no son convenientes para manejo de caracteres Unicode (y menos para codificación UTF-16 en la que un caracter tiene un largo variable múltiplo de 2 bytes) I Para ello la API Java incluye los tipos Reader y Writer que son abstracciones sobre los streams de bytes I De estas cuatro clases abstractas Java deriva las demás clases para E/S . archivos. etc.

io.Clases útiles para lectura I java. un stream ya abierto o una URL.g.io.AudioInputStream: Permite leer audio en distintos formatos y calidad.sound. Incluye un construtor para instanciar objetos a partir de un nombre de archivo. I java. Es capaz de obtener datos desde un archivo. I javax.sampled.BufferedReader: Permite realizar lectura lı́nea a lı́nea desde un stream. . FileReader).FileReader: Implementación de Reader para archivos. Incluye un constructor para crear objetos desde cualquier implementación de Reader (e.

. La serialización realizada puede luego ser reconstruida con un objeto java. etc.io.io.ObjectInputStream.PrintWriter: Permite escritura para distintos tipos de datos.io. I java. Se puede instanciar a partir de objetos File. con métodos polimórficos print y println.Clases útiles para escritura I java.ObjectOutputStream: Permite serializar objetos completos para almacenar en medio persistente. para transmisión a través de la red.

renombrar y eliminar archivos y directorios.io.Archivos I E/S en archivos se puede realizar con cualquiera de las clases nombradas I Para acceso aleatorio a archivos se puede utilizar java. permite operaciones como seek(long pos) y skipBytes(int n) I Para operaciones que no sean E/S en streams existe la clase java.io. revisar hora y fecha de modificación. comprobar y cambiar permisos. listar. entre otras operaciones.RandomAccessFile que.File I Esta clase permite crear. además de operaciones comunes de E/S. .

.EOC Fin del capı́tulo 3.