Download Introducción y Fundamentos del lenguaje de programación
Document related concepts
no text concepts found
Transcript
Introducción y Fundamentos del lenguaje de programación Java Agenda Qué es Java ? Características generales del lenguaje Variables Tipos de Datos Estructuras de control Orientado a Objeto: Clase, objeto, atributos, métodos, constructores y mas…. Java Tecnología desarrollada por Sun Microsystems para aplicaciones software independiente de la plataforma, que engloba: Lenguaje de programación Java API Java, proporciona a los programadores un entorno de desarrollo completo, así como una infraestructura. JVM, la máquina virtual que ejecuta bytecode de Java. Java Lenguaje de programación orientado a objetos desarrollado por Sun Microsystems a principios de los 90 Las aplicaciones son compiladas en un bytecode, aunque también es posible la compilación en código de máquina nativo En tiempo de ejecución, el bytecode es normalmente interpretado Java La promesa inicial era Write Once, Run Anywhere La idea era proporcionar un lenguaje independiente de la plataforma y un entorno de ejecución ligero y gratuito Tecnología Java La tecnología Java incluye el lenguaje de programación y la plataforma Java es al mismo tiempo compilado e interpretado Tecnología Java Genera byteCode Implementación de la Máquina Virtual Java Tecnología Java Compile-time Environment Compile-time Environment Class Loader Bytecode Verifier Java Source (.java) Java Compiler Java Bytecodes move locally or through network Java Interpreter Just in Time Compiler Runtime System Java Bytecode (.class ) Operating System Hardware Java Class Libraries Java Virtual machine Programa Simple public class ProgramaSimple { public static void main(String[] args) { System.out.println("Este es” + ”un programa simple"); System.exit(0); } } Características del lenguaje Características del Lenguaje Sensible a las Mayúsculas / Minúsculas Distingue entre mayúsculas y minúsculas. Los identificadores Papa, papa y PAPA son diferentes. No pueden comenzar con dígitos Los identificadores deben ser descriptivos Todas las palabras reservadas del lenguaje van en minúsculas Características del lenguaje Estilo Los programadores deben seguir ciertas convenciones en cuanto a estilo Los nombres de las clases deben empezar con mayúscula, las siguientes palabras también inician en mayúscula public class DanceFloor Los nombres de los métodos, campos y variables empiezan con minúscula y el resto de las palabras comienzan con mayúscula private int stepsCount = 0; public void nextStep() Características del lenguaje Generalmente, los nombres de los métodos suenan como verbos setBackground, getText, moveForward, stop Los nombres de los campos o atributos como nombres foot, picture, button, controlPanel Las constantes se especifican completamente en mayúsculas PI, PIXELS_PER_INCH Es OK usar nombres cortos estandares para variables temporales i, k, x, y, str Características del lenguaje Sintáxis vs Estilo Sintáxis es parte del lenguaje. El compilador chequea este aspecto Estilo es una convención ampliamente adoptada por los desarrolladores de software El propósito del estilo es mejorar la comprensión de los programas Características del lenguaje El compilador detecta errores de sintáxis y genera mensajes de error Texto incluído en comentarios y las cadenas de caracteres son excluídas del chequeo sintáctico Antes de compilar, lea cuidadosamente su código para detectar errores sintácticos y lógicos Características del lenguaje Errores comunes de sintáxis Ortografía (p → P, if → If) Falta } Public static int abs (int x) { If (x < 0); { x = -x } return x; public static int sqrt (int x) ... Punto y coma extraño Falta punto y coma Características del lenguaje Comentarios Un bloque de comentario puede ser colocado entre las marcas /* y */ /* Exercise 5-2 for Java Methods Author: Miss Brace Date: 3/5/2010 Rev. 1.0 */ Un comentario de una sola línea va desde // hasta el final de la línea weight *= 2.2046; // Convert to kilograms Características del Lenguaje Comentarios /** comentario */ Los caracteres entre /** y */son ignorados y se incluyen en la generación automática de la documentación. Características del lenguaje Usado por javadoc para la generación automática de documentación en formato HTML a partir del código fuente Debe preceder una clase, un método o un campo Se pueden usar tags especiales de javadoc @param – describe el parámetro de un método @return - describe el valor de retorno de un método Características del lenguaje /** indica un comentario javadoc /** * * * * * */ Returns total sales from all vendors; sets <code>totalSales</code> to 0. @return total amount of sales from all vendors Estilo Se pueden usar tags HTML Ejemplo javadoc /** * Inserta un título en la clase descripción. * Al ser el título obligatorio, si es nulo o vacío se lanzará * una excepción. * * @param titulo El nuevo título de la descripción. * @throws IllegalArgumentException Si titulo es null, está vacío o contiene solo espacios. */ public void setTitulo (String titulo) throws IllegalArgumentException { if (titulo == null || titulo.trim().equals("")) { throw new Exception ("El título no puede ser nulo o vacío"); } else { this.titulo = titulo; } } Características del lenguaje La disposición de los elementos dentro del código es libre Instrucciones o sentencias: línea simple de código terminada en ; Bloque de código: Conjunto de sentencias agrupadas entre llaves. { X = x + 1; Y = y + 1; } Java permite espacios en blanco entre elementos del código X1 = y * delta; X2 = (y-1) * delta; Características del lenguaje Estilo Coloque cada sentencia en una línea e indente el código entre llaves Use conscientemente los comentarios. Comente constructores, métodos, campos o atributos, pasos importantes pero no comente cada sentencia en su programa Características del lenguaje Estilo public void nextStep() { if (stepsCount % 2 == 0) leftFoot. moveForward (2 * stepLength); else rightFoot. moveForward(2 * stepLength); stepsCount++; } Compila bien public void nextStep() { if (stepsCount % 2 == 0) leftFoot.moveForward (2 * stepLength); else rightFoot.moveForward (2 * stepLength); stepsCount++; } Más fácil de leer Características del lenguaje Palabras Reservadas Palabras con un significado especial para el compilador Ejemplos: Nombres de tipos básicos: boolean, char, double, int, … Indicadores de control: do, if, else, for, while, … Class, interface, extends, implements package, import this, super Modificadores de acceso: public, private, protected Constantes: true, false, null Características del lenguaje public void fill (char ch) { int rows = grid.length, cols = grid[0].length; for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { grid[r][c] = ch; } } } Agregar líneas en blanco para facilitar lectura Agregar espacios alrededor de los operadores y después de los puntos y comas public void makeNextStep ( ) Cuerpo del método { if (currentState == State.READY) { amy.firstStep(); amy.firstStep(); ben.firstStep(); currentState = State.MOVING; stepsCount = 0; Grupo de sentencias } else if (currentState == State.MOVING) { if (amy.distanceTraveled() <= danceFloor.getWidth() * 3 / 4) { Grupo de amy.nextStep(); ben.nextStep(); sentencias stepsCount++; } else { amy.stop(); ben.stop(); currentState = State.STOPPED; } } danceFloor.update(this); } Grupo de sentencias Grupo de sentencias Variables Variables Una variable corresponde a una dirección de memoria que almacena un valor. q = 100 - q; significa 1. Leer el valor actual de q 2. Restar 100 de dicho valor 3. Mover el resultado a q Variables Las variables pueden ser de distintos tipos : int, char, double, boolean, etc. Las variables pueden contener objetos entonces el tipo de la variable es la clase del objeto El programador le da nombre a las variables Generalmente los nombres de las variables empiezan con una letra en minúscula (por convención) Variables Una variable debe ser declarada antes de su uso int Tipo count; double x, y; JButton go; Walker amy; String firstName; Nombre(s) Variables El operador de asignación permite cambiar el valor de una variable count = 5; x = 0; go = new JButton("Go"); firstName = args[0]; Una variable puede ser inicializada en su declaración int count = 5; JButton go = new JButton("Go"); String firstName = args[0]; Variables Alcance Cada variable tiene un alcance – el área en el código donde es “visible” Si usa una variable fuera de su alcance, el compilador reportará un error de sintáxis Variables pueden tener el mismo nombre cuando sus alcances no se solapan { int k = ...; ... } for (int k = ...) { ... } Variables Las variables locales se declaran dentro de un constructor o en un método Las variables locales pierden su valor y son destruidas cuando finaliza el constructor o método El alcance de una variable local es desde su declaración hasta donde cierra el paréntesis del bloque en el cual fue declarado Variables public class SomeClass { ... public SomeType SomeMethod (...) { Variable local declarada { } } ... } Variable local declarada Alcance Variables Usen variables locales cuando sea apropiado; nunca use atributos cuando debería usar una variable Nómbrelas de manera que puedan ser fácilmente distinguibles de los atributos Use el mismo nombre para variables locales usadas de la misma forma en distintos métodos (por ejemplo, x, y para coordenadas, cont, count para un contador, i, k para índices, etc.). Variables Errores comunes public void someMethod (...) { int x = 0; ... int x = 5; ... Error de sintáxis. Variable declarada dos veces dentro del mismo alcance Variables Errores comunes private double radius; ... public Circle (...) // constructor { double radius = 5; ... radius ha sido declarada como atributo y como variable local; el valor del atributo radius se queda en 0.0 Tipos de datos primitivos Tipos de datos primitivos • • • • int double char boolean • • • • byte short long float Tipos de datos String no es un tipo primitivo de datos String trabaja igual que cualquier objeto excepto por String entre comillas dobles representa constantes literales + y += concatena strings "Catch " + 22 "Catch 22" Tipos de datos Constantes literales new line tab 'A', '+', '\n', '\t' char -99, 2010, 0 int 0.75, -12.3, 8., .5 double “coin.gif", "1776", "y", "\n" String Tipos de datos Constantes simbólicas son inicializadas como final private final int stepLength = 48; private static final int BUFFER_SIZE = 1024; public static final int PIXELS_PER_INCH = 6; Tipos de datos Por qué Constantes Simbólicas? Fácil de cambiar su valor en un programa en caso de ser necesario Fácil de cambiar a una variable Facilita la lectura del código Operadores Aritméticos Operadores Operadores: +, -, /, * , % La precedencia de los operadores y paréntesis es la misma que en algebra m % n es el resto cuando m es dividido por n (por ejemplo, 17 % 5 is 2; 2 % 8 is 2) % tiene el mismo rango que / y * Operadores binarios con el mismo rango se evaluan de izquierda a derecha Operadores El tipo del resultado viene determinado por el tipo de los operandos y no por sus valores. Esta regla aplica también para los resultados intermedios en una expresión Si uno de los operandos es entero y el otro es double, entonces el resultado es double. Si ambos operandos son enteros, el resultado será entero Operadores Si a y b son enteros entonces a / b es truncado a un entero 17 / 5 3 3/4 0 … aún si asignamos el resultado a un double el resultado será truncado a un entero double ratio = 2 / 3; Operadores Para obtener el resultado correcto, deben usar constantes dobles o el operador cast double ratio = 2.0 / 3; double ratio = 2 / 3.0; int m = ..., n = ...; double factor = (double)m / (double)n; double factor = (double)m / n; double r2 = n / 2.0; Operadores Devuelve un double int ptsOnDie = (int)(Math.random() * 6) + 1; int miles = (int)(km * 1.61 + 0.5); Convierte Km a Millas, redondeado al entero más cercano Estructuras de Control if else if ( <condition> ) { < statements > } else { < other statements > } if ( <condition> ) { < statements > } la cláusula else es opcional Expresiones booleanas Variables booleanas pueden tener sólo dos posibles valores: true o false. Se definen igual que el resto de las variables o atributos boolean true false private boolean hasMiddleName; boolean isRolling = false; Palabras reservadas Expresiones booleanas En if (<condition> ) <condition> es una expresión booleana El resultado de una expresión booleana es true o false Las expresiones booleanas están compuestas de variables booleanas y operadores lógicos y relacionales Operadores relacionales Operadores relacionales <, >, <=, >=, ==, != Hay que tener cuidado cuando se usan con objetos, pues en esos casos estamos comparando referencias (direcciones) en lugar de sus valores String cmd = console.readLine(); if ( cmd == "Help" ) ... incorrecto Operadores relacionales Usar los métodos equals o equalsIgnoreCase para comparar Strings: o String cmd = console.readLine(); if ( cmd.equals ("Help") ) ... if ( "Help".equals (cmd) ) ... Operadores relacionales Mayor ! -(unary) * / + - < <= ++ -- (cast) % > >= == != && || Menor Más fácil de leer if ( ( ( year % 4 ) == 0 ) && ( month == 2 ) ) ... if ( year % 4 == 0 && month == 2 ) ... If else anidados if ("forward".equals(cmd)) { if (slide >= numSlides) beep.play(); else slide++; } else { if (slide <= 1) beep.play(); else slide--; } If else if if (drinkSize.equals(”Large")) { price += 1.39; } else if (drinkSize.equals("Medium")) { price += 1.19; } else // if "Small" drink size { price += 0.99; } if (drinkSize.equals(”Large")) price += 1.39; else if (drinkSize.equals("Medium")) price += 1.19; else // if "Small" drink size price += 0.99; Errores comunes Punto y coma adicional if (...) ; { sentencias; ... } Es más seguro usar { } en ifelse Faltan { } if (...) sentencia1; sentencia2; ... if (...) if (...) sentencia1; else sentencia2; switch switch (expression) { case value1: ... break; } case value2: ... break; ... ... default: ... break; switch (num) { case 1: case 2: System.out.println ("Buckle your shoe"); break; case 3: ... } Tipos de datos enumerados Usados cuando el atributo de un objeto o estado puede tomar solo un pequeño conjunto de valores private enum Speed { LOW, MEDIUM, HIGH }; private enum InkColor { BLACK, RED }; private enum DayOfWeek { sunday, monday, tuesday, wednesday, thursday, friday, saturday }; Tipos de datos enumerados Use == o != para comparar valores enum private enum Speed { LOW, MEDIUM, HIGH }; ... Speed currentSpeed = Speed.LOW; ... if (currentSpeed == Speed.LOW) ... Puede ser usado en una estructura switch switch (currentSpeed) { case LOW: ... break; case MEDIUM: ... while while ( condicion ) { statement1; statement2; ... statementN; } Si el cuerpo tiene solo una sentencia, entonces las { } son opcionales condicion es cualquier expresión lógica cuerpo del lazo while ( condicion ) statement1; while // Returns the smallest n // such that 2^n >= x public static int intLog2 (int x) { int n = 0, p = 1; while ( p < x ) { p *= 2; n++; } return n; } Inicialización Test Cambio for for es una forma abreviada que combina en una sentencia la inicialización, la condición y el cambio for ( initialization; condition; change ) { statement1; statement2; ... statementN; } do while do { statement1; statement2; ... statementN; } while ( condition ); Siempre use { } para facilitar la lectura del código Se ejecuta al menos una vez Si la condición es falsa, no se ejecuta la próxima iteración break y continue El break en una sentencia de iteración instruye al programa para que termine inmediatamente la iteración y continúe en la primera sentencia después del lazo return en un lazo indica al programa para que inmediatamente termine la ejecución del método y retorne al punto donde fue invocado Un break o return debe estar dentro de una cláusula if o else break y continue int r, c; for (r = 0; r < m.length; r++) { for (c = 0; c < m[0].length; c++) { if (m [ r ][ c ] == 'X' ) break; } } ... breaks colocados dentro de un lazo interno continuan con el lazo externo Paradigma Orientado a Objetos Paradigma Orientado a Objetos Paradigma estructurado o procedural: Los programas se dividen en procedimientos independientes con acceso total a los datos comunes. Algortimos + Estructuras de Datos = Programas Paradigma orientado a objetos: Los datos se consideran la parte más importante del programa. Los objetos modelan las características de los problemas del mundo real, su comportamiento ante estas caracteristicas y su forma de interactuar con otros elementos objetos + mensajes = Programas Ejemplo: Tomarse un café en una panadería Procedural El cliente entra en la panadería El cliente pasa detrás de la barra El cliente prepara la cafetera El cliente se sirve el café El cliente se bebe el café. Orientado a Objetos El cliente entra en la panadería El cliente pide un café al “cafetero” El “cafetero” prepara el café. El “cafetero” sirve el café al cliente. El cliente se bebe el café. Paradigma Orientado a Objetos Clases: Patrones que indican como construir objetos Objetos: Instancias de las clases en tiempo de ejecución. Miembros de la clase: Atributos: Características o propiedades de los objetos (o clases). Pueden ser variables de tipo simple o referencias a otros objetos Métodos: Comportamientos de los objetos. Son funciones que operan sobre los atributos de los objetos. Clase Sintáxis Class <NombreClase> { // Declaracion de atributos <tipo> <var>; // Declaración de métodos <tipo> <nombreMetodo> ( <argumentos> ) { … } } El nombre del archivo debe coincidir con el de la clase definida en él. Se recomienda definir una clase por cada archivo Java. Estructura general Attribute Creación de un objeto Se usa la palabra reservada new <refObjeto> = new <NombreClase>(); Ejemplo: Circulo miCirculo; miCirculo = new Circulo(); Atributos Atributos o Miembros Los miembros o atributos se declaran fuera de los constructores y métodos Generalmente su declaración se agrupa en el tope de la clase o después de los métodos El alcance de un atributo es toda la clase Alcance de los atributos Alcance public class SomeClass { Atributos } Constructores y métodos O Alcance public class SomeClass { Constructores y métodos Atributos } Atributos La definición de los miembros o atributos de una clase se puede ampliar añadiendo modificadores al principio.: [modificador]<tipo> <identificador>; [modificador]<tipo> <nombre>(<args>) {...} Los modificadores permiten acceder a los datos o métodos de manera restringida Atributos public. El miembro de la clase es accesible desde cualquier parte del código. private. El miembro de la clase sólo es accesible desde código perteneciente a la propia clase. protected(o friendly). Sólo las subclases de la clase y nadie más pueden acceder a las variables y métodos. Ejemplo public class Circulo { // Atributos double radio; String color; // Metodos void asigRadio( ){ … } double area( ){…} } Atributos de una clase De instancia. Cada instancia tiene un valor particular. Representan el estado particular de cada objeto. De clase. Todas las instancias comparten el mismo valor para estos atributos (como atributo global). Si se cambia en una instancia, se refleja en todas. Representan el estado compartido Se declaran utilizando el modificador static. class Ficha { public long id; public static long idactual = 0; public Ficha() { id = idactual++; } } Acceso a los miembros El operador “.” aplicado a referencias permite el acceso a atributos y métodos. public class EjemplosManipulacionObjetos { public static void main(String[] args) { Ficha f1 = new Ficha(); System.out.println(f1.id); f1.id = 34; Persona juan = new Persona("Juan","5555555"); Persona maria = new Persona("María","5555555"); Persona pedro = new Persona("Pedro","5555555", juan,maria); System.out.println(pedro.nombre()); System.out.println(pedro.padre().nombre()); System.out.println(pedro.madre().nombre()); } } Métodos Constructores y métodos públicos de una clase constituyen la interface de la clase que puede ser usada por sus clientes Todos los campos son generalmente declarados de tipo privado, es decir están ocultos Métodos “Ayudantes” que son necesarios sólo para la clase se declaran de forma privada accessor modifier Generalmente, el programador provee de métodos “accessors” que permiten acceder campos privados y métodos “modifiers” que permiten modificar el valor de los campos privados Generalmente, el nombre de los métodos “accessor” comienzan con get y los “modifiers” con set encapsulación public class MyClass { // Private fields: private <sometype> myField; ... // Constructors: public MyClass (...) { ... } ... // Public methods: public <sometype> myMethod (...) { ... } ... // Private methods: private <sometype> myMethod (...) { ... } ... } Public interface: public constructors and methods Constructores Un constructor es un procedimiento para crear objetos de una clase El constructor generalmente inicializa los campos del objeto Los constructores no tienen valor de retorno Todos los constructores en una clase tienen el mismo nombre ( el de la clase) Los contructores pueden recibir parámetros Constructores Si una clase tiene más de un constructor, entonces deben tener distintos números o tipo de argumentos Generalmente se proveen constructores sin argumentos Si el programador no provee un constructor, Java provee uno por defecto que reserva memoria para el objeto e inicializa los campos con los valores por defecto Constructores public class Fraction { private int num, denom; public Fraction (int n, int d) { num = n; denom = d; reduce (); } public Fraction ( ) { num = 0; “No-args” denom = 1; constructor } public Fraction (int n) { num = n; denom = 1; Continua ® } public Fraction (Fraction other) { num = other.num; denom = other.denom; } ... Copy } constructor Constructores Constructores de una clase pueden llamarse entre si usando la palabra reservada this public class Fraction { ... public Fraction (int n) { this (n, 1); } ... ... public Fraction (int p, int q) { num = p; denom = q; reduce (); } ... Referencias a objetos Fraction f1 = new Fraction(3,7); Fraction f2 = f1; f1 Objeto Fraction f2 num = 3 denom = 7 Fraction f1 = new Fraction(3,7); Fraction f2 = new Fraction(3,7); f1 num = 3 denom = 7 f2 Referencia al mismo objeto objeto Fraction objeto Fraction num = 3 denom = 7 Métodos public [or private] returnType methodName (type1 name1, ..., typeN nameN) { ... } cuerpo encabezado Para definir un método • Decida entre public y private (usualmente public) • Dele un nombre • Especifique el tipo de argumentos y deles un nombre • Especifique el valor del retorno del método • Escriba el código del método Paso de argumentos Cualquier expresión que tenga el tipo apropiado puede ser pasada como argumento double u = 3, v = -4; ... Polynomial p = new Polynomial (1.0, -(u + v), u * v); double y = p.getValue (2 * v - u); public class Polynomial { public Polynomial (double a, double b, double c) { ... } public double getValue (double x) { ... } ... Paso de argumentos Un tipo “menor” puede ser promovido a un tipo “mayor” ( int a long, float a double) int es promovido a double cuando sea necesario ... Polynomial p = new Polynomial (1, -5, 6); double y = p.getValue (3); Igual que (3.0) Igual que (1.0, -5.0, 6.0) Paso de argumentos Los tipos primitivos son siempre pasados por valor, es decir el valor es copiado en el parámetro public class Polynomial { double x = 3.0; double y = p.getValue ( x ); } x: 3.0 copia ... public double getValue (double u) { double v; u actua como una ... variable local en } getValue copia u: 3.0 Paso de argumentos public class Test { public double square (double x) { x es una copia del parámetro x *= x; pasado. La copia cambia pero… return x; } public static void main(String[ ] args) { Test calc = new Test (); ... el valor original de double x = 3.0; x no cambia double y = calc.square (x); Salida: 3 9 System.out.println (x + " " + y); } } Paso de argumentos Los objetos siempre se pasan por referencia: la referencia es copiada mas no el objeto Fraction f1 = new Fraction (1, 2); Fraction f2 = new Fraction (5, 17); public class Fraction { ... copia referencia Fraction f3 = f1.add (f2); Refiere a Un objeto Fraction: num = 5 denom = 17 public Fraction add (Fraction f) { ... } Refiere al } mismo objeto Paso de argumentos Dentro de un método, this hace referencia al objeto por el cual el método fue invocado this puede ser pasado a otros constructores y métodos como parámetro public class ChessGame { ... Player player1 = new Player (this); ... Una referencia a este (this) objeto ChessGame sentencia return Un método, a menos que sea void, retorna un valor del tipo especificado por el método Paso de argumentos La sentencia return es usada para terminar el método y devolver un valor return expresión; El tipo del valor o expresión retornada debe ser del mismo que lo declarado en el método sentencia return Un método puede tener varias sentencias return public someType myMethod (...) { ... if (...) return <expression1>; else if (...) return <expression2>; ... return <expression3>; } sentencia return Un método booleano puede retornar true, false, o el resultado de una expresión booleana public boolean myMethod (...) { ... if (...) return true; ... return n % 2 == 0; } sentencia return Un método void puede usar una sentencia de return para finalizar antes el método public void myMethod (...) { ... if (...) return; ... No hay necesidad } de especificar return al final del método sentencia return Si la clase devuelve una clase, entonces el método retornará una referencia a un objeto o null Generalmente el objeto será creado dentro del método usando new public Fraction inverse () { if (num == 0) return null; return new Fraction (denom, num); } El objeto retornado puede también venir de un parámetro o de otra llamada a otro método Sobrecarga de métodos Métodos de la misma clase que tienen el mismo nombre y diferente número y/o tipo de argumentos se conocen como métodos sobrecargados Use sobrecarga de métodos cuando deben llevar a cabo tareas similares public void move (int x, int y) { ... } public void move (double x, double y) { ... } public void move (Point p) { ... } public Fraction add (int n) { ... } public Fraction add (Fraction other) { ... } Sobrecarga de métodos El compilador los trata como métodos diferentes El compilador sabe cuál método será invocado basado en el número de argumentos y el tipo de los mismos Circle circle = new Circle(5); circle.move (50, 100); Point center = new Point(50, 100); circle.move (center); public class Circle { public void move (int x, int y) { ... } public void move (Point p) { ... } ... Sobrecarga de métodos El tipo devuelto por el método no es suficiente para distinguir métodos sobrecargados public class Circle { public void move (int x, int y) { ... } public Point move (int x, int y) { ... } ... Error de sintáxis Campos static Un campo static (class field o class variable) es un campo compartido por todos los objetos de la clase Un campo non-static ( instance field o instance variable) pertenece al objeto en particular Campos static Un campo static puede mantener una constante compartida por todos los objetos de la clase public class RollingDie { private static final double slowDown = 0.97; private static final double speedFactor = 0.04; ... Palabras reservadas: static final Un campo static puede ser usado para recoger estadísticas o totales de los objetos de la clase Campos static El campo Static es almacenado dentro del código de la clase, de manera separada de las variables de instancia que describen a un objeto en si Campos public static son usualmente constantes globales y son referenciadas con el operador . ClassName.constName double area = Math.PI * r * r; setBackground(Color.BLUE); c.add(btn, BorderLayout.NORTH); System.out.println(area); Campos static Generalmente no se inicializan los campos static en los constructores. Se hace en la declaración o en métodos public static Si una clase tiene solamente campos static, entonces no hay necesidad de crear objetos de dicha clase. Todos serían idénticos Math y System son ejemplos de lo anterior. No poseen constructores públicos y no pueden ser instanciados static métodos Métodos static pueden acceder y manipular campos estáticos de una clase No pueden acceder campos no estáticos o llamar métodos no estáticos de la clase Los métodos static son llamados usando la “notación punto” ClassName.statMethod(...) double x = Math.random(); double y = Math.sqrt (x); System.exit(); static métodos public class MyClass { public static final int statConst; private static int statVar; private int instVar; ... public static int statMethod(...) { statVar = statConst; OK statMethod(...); instVar = ...; instMethod(...); } Error! Método static Métodos no static Un método no static puede ser invocado por un objeto usando la notación punto objName.instMethod(...); vendor.addMoney(25); die1.roll(); Estos métodos pueden acceder todos los campos y métodos de la clase (static o no) Herencia Herencia Superclase (clase base) Subclass extends Superclass Subclase (clase derivada) La herencia representa una relación de “es un” entre objetos Un objeto de la subclase es un objeto de la superclase Jerarquía entre clases Usando herencia, el programador puede definir jerarquía entre las clases Biped Walker ToedInWalker Hopper CharlieChaplin Dancer Herencia La herencia de clases se lleva a cabo mediante extends Establece una relación de especialización -generalización entre clases. La subclase puede introducir nuevos métodos y redefinir métodos de la superclase. Jerarquía entre clases Ayuda a reducir duplicación de código factorizando lo común entre varias clases en la superclase Walker Constructor firstStep nextStep stop distanceTraveled Biped Constructor Accessors turnLeft turnRight turnAround draw Hopper Constructor firstStep nextStep stop distanceTraveled Jerarquía entre clases Reduce la duplicación de código y permite escribir métodos mas generales public void moveAcross (Walker creature, int distance) { Sirve tanto para Walker o Hopper por polimorfismo creature.firstStep(); while (creature.distanceTraveled() < distance) creature.nextStep(); public void moveAcross creature.stop(); } (Biped creature, int distance) { public void moveAcross creature.firstStep(); while (creature.distanceTraveled() < distance) (Hopper creature, int distance) creature.nextStep(); { creature.stop(); creature.firstStep(); while (creature.distanceTraveled() < distance) } creature.nextStep(); creature.stop(); } Ejemplo de herencia public class Articulo { // clase padre public float precio=0; ... public void setPrecio(float elPrecio) { precio = elPrecio; } ... public float getPrecio() { return precio; } } //los métodos y atributos de Articulo son heredados a Pelicula public class Pelicula extends Articulo {// clase hijo public void setDescripcion(String descrip) { descripcion = descrip; } ... public String getDescripcion() { return descripcion; } } Ejemplo de herencia public class Persona { // Hereda de Object private String nombre; public Persona(String nombre) { this.nombre = nombre; } public String nombre() {return nombre;} } public class Empleado extends Persona { private double salario; public Empleado(String nombre,double salario) { super(nombre); // invoca al constructor de la superclase this.salario = salario; } public double salario() {return salario;} } Herencia “es un” Para saber si la relación de herencia es correcta, se plantea la pregunta "¿la subclase es-una superclase?". La respuesta debe ser "sí” ¿el Jefe es-un Empleado? Sí ¿la Secretaria es-un Empleado? Sí class Bici { int numRuedas; int numAsientos; int velocidadMax; } class Avion { int int int int } numRuedas; numAsientos; velocidadMax; numAlas; class Bici { int numRuedas; int numAsientos; int velocidadMax; } class Avion extends Bici { int numAlas; } ¿Avion es-una Bici? NO Relación de contenido Una clase puede contener referencias a objetos de otras clases Se diferencia de la herencia en que es necesario instanciarlos por separado Responde afirmativamente a la pregunta: ¿<Contenedor> tiene-un <Contenido>? class Motor { ... ... } class Chasis { } ¿un Coche tiene-un Motor? Sí ¿un Coche tiene-un Chasis? Sí class Coche { Motor m; Chasis ch; } Métodos virtuales Una subclase puede modificar los métodos que ha heredado de las superclase, manteniendo los mismos nombres, tipos de retorno y listas de argumentos. class Empleado { int calcularVacaciones() {...} } class Jefe extends Empleado { int numSupervisados, int calcularVacaciones() {...} } Ejemplo class Persona { // Atributos private String nombre; private String telefono; private Persona padre; private Persona madre; // Constructores public Persona(String nombre, String telefono) { this(nombre,telefono,null,null); } public Persona(String nombre, String telefono, Persona padre, Persona madre) { this.nombre = nombre; this.telefono = telefono; this.padre = padre; this.madre = madre; .... ......... // Metodos, acceden a atributos privados public String nombre() {return nombre;} public String telefono() {return telefono;} public Persona padre() {return padre;} public Persona madre() {return madre;} public boolean hayPadre() {return padre != null;} public boolean hayMadre() {return madre != null;} } polimorfismo Asegura que el método correcto será llamado para un objeto de un tipo específico, aún cuando el objeto es una referencia a un objeto de un tipo genérico, es decir de una superclase Una vez definido una superclase común, el polimorfismo ya existe, no hay que hacer nada adicional polimorfismo El parámetro actual pasado a este método puede ser Walker, Hopper, etc. ⎯ cualquier subclase de Biped. public void moveAcross (Biped creature, int distance) { creature.firstStep(); while (creature.distanceTraveled () < distance) creature.nextStep(); creature.stop(); } El método correcto será llamado automáticamente para cada tipo específico de creature: métodos Walker para Walker, métodos Hopper para Hopper, etc. Un método con el mismo nombre, tipo de retorno y lista de parámetros puede ser aplicado a objetos de diferentes clases. Uso, trabajar con la clase más general: Parámetros polimórficos Colecciones heterogéneas Empleado e1 = new Empleado(); Empleado e2 = new Jefe(); Empleado e1 = new Secretaria(); e2.numSupervisados = 15; // ERROR ((Jefe)e2).numSupervisados = 15; Parámetros polimórficos class Mascota {...} class Raton extends Mascota {...} class Gato extends Mascota {...} class Veterinario { void vacunar ( Mascota m ) {...} } ... Veterinario doctor = new Veterinario(); Gato tom = new Gato(); Raton jerry = new Raton(); doctor.vacunar(tom); doctor.vacunar(jerry); ... clases abstractas Algunos métodos en una clase pueden ser declarados como abstract y sólo especificar la firma del método Una clase con uno o más métodos abstractos debe ser declarada abstract public abstract class Biped { ... public abstract void firstStep(); public abstract void nextStep(); public abstract void stop(); ... public void draw(Graphics g) { ... } } Métodos abstractos clases abstractas Clases abstractas sirven como superclases comunes para clases más específicas Un método abstracto provee una oportunidad al compilador para realizar chequeo adicional de errores Las clases y métodos abstractos son necesarios para que el polimorfismo funcione Las clases abstractas están más cerca de la raíz de la jerarquía pues describen objetos abstractos clases abstractas Java no nos permite instanciar, es decir crear objetos, de una clase abstracta Aún cuando la clase abstracta pueda tener constructores, estos pueden ser llamados desde constructores de las subclases Una clase sin métodos abstractos se conoce concrete Ejemplo Jerarquía de figuras geométricas: class Punto { int x; int y; int color; } abstract class Figura { Punto ptoOrigen; abstract void dibujar(); } class Rectangulo extends Figura { Punto ptoFinal; void dibujar() {...} } class Circulo extends Figura { int radio; void dibujar() {...} } Class Object En Java, cada clase por defecto extiende de Object(java.lang) Object es una clase concreta public class Object { public String toString {...} public boolean equals (Object other) {... } public int hashCode() { ... } // a few other methods ... } Methods redefined (overridden) as necessary Object Todas las clases implícitamente heredan de la clase Object: raíz de la jerarquía. Object define un conjunto de métodos redefinibles: public boolean equals(Object o): Permite definir el criterio de igualdad de contenido de una determinada clase El operador == únicamente chequea la igualdad de referencias. En Object, equals se define directamente como la identidad de referencias. Object public class Ficha { private long id; private static long idactual = 0; public Ficha() { id = idactual++; } public long id() {return id;} public boolean equals(Object o) { return (o instanceof Ficha) && ((Ficha)o).id() == id; } public String toString() { return "Ficha(id="+id+")"; } } Object String s1 = new String("Hola") String s2 = new String("Hola"); if (s1 == s2) ... // false if (s1.equals(s2)) ... // true s1.equals(s2) equivale a s2.equals(s1) Llamando a los constructores de una superclase Biped Walker public class Walker extends Biped { // Constructor public Walker(int x, int y, Image leftPic, Image rightPic) { Llama al constructor super(x, y, leftPic, rightPic); de Biped ... } El número y tipo de argumentos debe coincidir } con alguna de los constructores de la superclase Si está presente, debe ser la primera sentencia Llamando a los constructores de una superclase Siempre se llama a uno de los constructores de la superclase, pero no es necesario hacerlo de forma explícita Si no hay una llamada explícita a super, entonces se invoca al constructor por defecto de la superclase sin argumentos Llamando a los constructores de una superclase El constructor de una superclase llama al constructor de su superclase hasta el constructor de Objetc Object super( ) Biped super(...) Walker LLamando métodos de la superclase Walker public class CharlieChaplin CharlieChaplin extends Walker { ... public void nextStep () { turnFeetIn(); Llama al método super.nextStep(); nextStep de Walker turnFeetOut(); } ... super.someMethod se refiere a someMethod } en la clase más cercana en la jerarquía de clases donde someMethod fue definido. Interface DanceFloor DanceGroup ControlPanel Aerobics Interface Dance Waltz Rumba Band Cha-Cha-Cha Dancer Salsa Interface Una interface es un conjunto de declaraciones de métodos Declaración: interface <NombreInterfaz> { <tipo> <nombreMétodo1> ( <args> ); <tipo> <nombreMétodo2> ( <args> ); ... } Una clase que implemente el código de la interfaz debe implementar todos sus métodos class <NombreClase> implements <NombreInterfaz> { <tipo> <nombreMétodo1> ( <args> ) { <código> } <tipo> <nombreMétodo2> ( <args> ) { <código> } ... } Interface Un interface en Java es similar a una clase abstracta que no tiene atributos ni constructores, y todos sus métodos son abstractos public interface Dance { DanceStep getStep (int i); int getTempo (); int getBeat (int i); } Interface Hay que indicar explícitamente que una clase implementa una interface Una clase concreta que implementa una interface debe suplir todos los métodos de dicha interface public class Waltz implements Dance { ... // Methods: public DanceStep getStep (int i) { ... } public int getTempo () { return 750; } public int getBeat (int i) { ... } ... } Interace Las interfaces sirven para: ➔ Declarar métodos que serán implementados por una o más clases ➔ Definir la interface de programación de un objeto, sin mostrar el cuerpo actual de la clase Cada interface debe escribirse en un archivo *.java con el mismo nombre de la interface Interface - abstract interface Interfaz { <tipo> <método1>(); <tipo> <método2>(); ... <tipo> <métodoN>(); } equivale a abstract class Interfaz { abstract <tipo> <método1>(); abstract <tipo> <método2>(); ... abstract <tipo> <métodoN>(); } Interface public interface Edible { String getFoodGroup(); int getCaloriesPerServing(); } public class Pancake implements Edible { ... } public class Breakfast Polimorfismo: el { método correcto private int myTotalCalories = 0; es llamado para ... cada tipo public void eat (Edible obj, int servings) específico de Edible, es decir { Pancake, etc. myTotalCalories += obj.getCaloriesPerServing () * servings; } ... } Array array Un array o arreglo es un bloque de localidades consecutivas de memoria que almacenan valores del mismo tipo de dato Cada localidad individual se le conoce como elemento del arreglo Cuando hablamos de un elemento, hacemos referencia al valor almacenado en dicho elemento 1.39 1.69 1.74 0.0 Un arreglo de doubles array En lugar de tratar cada elemento como una variable por separado, todo el arreglo obtiene un nombre Un elemento específico del arreglo es referenciado usando el nombre del arreglo y el índice del mismo 1.39 1.69 1.74 0.0 c[0] c[1] c[2] c[3] c es el nombre del arreglo array En Java, un índice se escribe entre [ ] El índice puede tomar cualquier valor entero entre 0 y la longitud – 1 del arreglo Se puede usar como índice una variable entera o cualquier expresión que de como resultado un valor entero a [3] a [k] a [k - 2] a [ (int) (6 * Math.random()) ] array En Java, los arreglos se declaran de forma estática, es decir, su tamaño no puede cambiar a tiempo de ejecución El interpretador de Java chequea los valores de los índices y lanza una excepctón ArrayIndexOutOfBoundsException si el índice es negativo o mayor que la longitud – 1 del arreglo array El poder de los arreglos radica en el hecho de que los valores de los índices pueden ser calculado a tiempo de ejecución Sin arrays: 1000 veces! int sum = 0; sum += score0; sum += score1; … sum += score999; Con arrays: int n = 1000; int sum = 0, k; for (k = 0; k < n; k++) sum += scores[k]; array Los arreglos nos permiten un acceso directo a cualquier elemento del mismo sin necesidad de recorrer toda la estructura de datos 1000 veces! Sin arrays: Con arrays: if (k == 0) display (score0); else if (k == 1) display (score1); else … // etc. display (scores[k]); array En Java, un arreglo es un objeto. Si el tipo de sus elementos es anyType, entonces el tipo del objeto arreglo es anyType[ ]. Declaración de arreglos anyType [ ] arrName; Dado que es un objeto, la declaración crea solamente una referncia inicialmente en null. Un arreglo debe ser creado antes de su uso arrName = new anyType [length] ; [ ] en lugar de ( ) array Cuando el arreglo es creado, se le asigna espacio de memoria para almacenar sus elementos. Si no se especifica los valores de los elementos, éstos obtienen el valor por defecto scores = new int [10] ; words = new String [10000]; Longitud 10, todos los valores en 0 longitud 10000, todos los valores en null array Un arreglo puede ser inicializado en la declaración int [ ] scores = new int [10] ; private double [ ] gasPrices = { 3.05, 3.17, 3.59 }; String [ ] words = new String [10000]; String [ ] cities = {"Atlanta", "Boston", "Cincinnati" }; array O puede ser inicializado más adelante durante la ejecución String [ ] words; No inicializado ... words = new String [ console.readInt() ]; No inicializado private double[ ] gasPrices; … gasPrices = new double[ ] { 3.05, 3.17, 3.59 }; array La longitud del arreglo es indicado en el momento de la creación La longitud puede indicarse explícitamente en la declaración o através de la lista de inicialización La longitud de un arreglo arrName es obtenido en el código usando arrName.length. length es un atributo público (no un método) del objeto array array Como cualquier objeto, un arreglo es pasado a un método como una referencia Los elementos del arreglo original no son copiados y pueden ser modificados desde el método // Swaps a [ i ] and a [ j ] public void swap (int [ ] a, int i, int j) { int temp = a [ i ]; a [ i ] = a [ j ]; a [ j ] = temp; } array public double[ ] solveQuadratic (double a, double b, double c) { double d = b * b - 4 * a * c; if (d < 0) return null; d = Math.sqrt(d); double[ ] roots = new double[2]; roots[0] = (-b - d) / (2*a); roots[1] = (-b + d) / (2*a); return roots; } O simplemente return new double[ ] { (-b - d) / (2*a), (-b + d) / (2*a) }; array Arreglos de dos dimensiones son usados para representar matrices Un elemento en una matriz es direccionado usando un par de índices (fila, columna) board [ r ] [ c ] = 'x'; array // 2-D array of char with 5 rows, 7 cols: char[ ] [ ] letterGrid = new char [5][7]; // 2-D array of Color with 1024 rows, 768 cols: Color[ ] [ ] image = new Color [1024][768]; // 2-D array of double with 2 rows and 3 cols: double [ ] [ ] sample = { { 0.0, 0.1, 0.2 }, { 1.0, 1.1, 1.2 } }; Si m es una matriz, entonces m[k] es un arreglo de una dimensión, la k-ésima fila. m.length es el número de filas m[k].length es la longitud de la k-ésima fila array Java permite matrices en donde las filas pueden tener longitudes diferentes En una matriz rectangular, m[0].length puede ser usado para representar el número de columnas. Matriz irregular Matriz rectangular m.length m[3].length m.length m[0].length array Un arreglo de 2-dimensiones puede ser recorrido usando lazos anidados for (int r = 0; r < m.length; r++) { for (int c = 0; c < m[0].length; c++) { ... // process m[ r ][ c ] } } array Transpuesta de una matriz int n = m.length; for (int r = 1; r < n; r++) { for (int c = 0; c < r; c++) { double temp = m [ r ][ c ]; m [ r ][ c ] = m [ c ][ r ]; m [ c ][ r ] = temp; } } El número total de iteraciones a lo largo del lazo interno es : 1 + 2 + 3 + ... + n-1 = n (n - 1) / 2 Colecciones heterogéneas Hasta ahora un array sólo podía contener elementos del mismo tipo (colección homogénea) Utilizando polimorfismo se pueden tener elementos de distinto tipo en un array (colección heterogénea) Se crean utilizando arrays definidos con el tipo superclase Mascota[] listaMascotas = new Mascota[5]; listaMascotas[0] = new Mascota(); listaMascotas[1] = new Gato(); listaMascotas[2] = new Raton(); listaMascotas[3] = new Raton(); listaMascotas[4] = new Gato(); class Empleado { Se consigue tratar a todos los ... elementos por igual, aunque int salario; int calcularVacaciones(){...} alguno tenga un tratamiento } especial class Jefe extends Empleado { int numTrabajadores; int calcularVacaciones(){...} } ... Empleado[] lista = new Empleado[100]; lista[0] = new Empleado(); lista[1] = new Empleado(); ... lista[56] = new Jefe(); ... lista[99] = new Empleado(); for (int i = 0; i < lista.length; i++) { System.out.println(lista[i].calcularVacaciones()); } Clase String La clase String Un objeto de la clase String representa una cadena de caracteres La clase String pertenece al paquete java.lang package que está dentro de Java Como cualquier clase, String tiene constructores y métodos Al contrario de otras clases, String tiene dos operadores , + y += (usados para concatenar) Literal Strings (cont’d) Un texto string puede incluir caracteres de “escape” ➔ \\ se refiere a \ ➔ \n se refiere al caracter de nueva línea String s1 = "Biology”; String s2 = "C:\\jdk1.4\\docs"; String s3 = "Hello\n"; Inmutabilidad Una vez creado, un string no puede ser cambiado: ninguno de los métodos permite hacer cambios A estos objetos se les conoce como inmutables Los objetos inmutables son convenientes porque varias referencias pueden apuntar al mismo objeto de forma segura: no existe peligro de cambiar el objeto a través de una referencia sin que el resto se de cuenta del cambio Inmutabilidad Ventaja: mas eficiente, no necesita hacer copia String s1 = "Sun"; String s2 = s1; s1 String s1 = "Sun"; String s2 = new String(s1); s1 "Sun" s2 "Sun" "Sun" s2 OK Menos eficiente: ocupa más memoria Inmutabilidad Desventaja: menos eficiente— para pequeños cambios necesitas crear un nuevo string y botar el viejo String s = "sun"; char ch = Character.toUpperCase(s.charAt (0)); s = ch + s.substring (1); s "sun" "Sun" Strings vacíos Un string vacío corresponde a una cadena que no tiene caracteres. Su longitud es 0 String s1 = ""; String s2 = new String(); Strings vacíos No debe confundirse con string no inicializado private String errorMsg; errorMsg es null Métodos — length, charAt int length (); char charAt (k); • Devuelve el número de caracteres en el string • Devuelve el k-ésimo char Las posiciones en un string son numeradas desde 0 Retorna: ”Flower".length(); 6 ”Wind".charAt (2); ’n' Método — substring String s2 = s.substring (i, k); devuelve la subcadena de caracteres en las posiciones i hasta k-1 strawberry i k strawberry String s2 = s.substring (i); i devuelve la subcadena desde el iésimo caracter Retorna: ”strawberry".substring (2,5); "unhappy".substring (2); "emptiness".substring (9); "raw" "happy" "" (empty string) Método — Concat String result = s1 + s2; concatena s1 y s2 String result = s1.concat (s2); igual que s1 + s2 result += s3; concatena s3 a result result += num; convierte num a String y lo concatena a result Método — Find (indexOf) 0 8 11 15 String date ="July 5, 2012 1:28:19 PM"; retorna date.indexOf ('J'); 0 date.indexOf ('2'); 8 date.indexOf ("2012"); 8 date.indexOf ('2', 9); 11 date.indexOf ("2020"); -1 date.lastIndexOf ('2'); 15 (empieza a buscar a partir de la posición 9) no encontrado Métodos — Comparaciones boolean b = s1.equals(s2); retorna true si el string s1 es igual a s2 boolean b = s1.equalsIgnoreCase(s2); retorna true si el string s1 matches s2, case-blind int diff = s1.compareTo(s2); retorna la diferencia s1 - s2 int diff = s1.compareToIgnoreCase(s2); retorna la diferencia s1 - s2, case-blind public class Palindrome { public static boolean isPalindrome(String stringToTest) { String workingCopy = removeJunk(stringToTest); String reversedCopy = reverse(workingCopy); return reversedCopy.equalsIgnoreCase(workingCopy); } protected static String removeJunk(String string) { int i, len = string.length(); StringBuffer dest = new StringBuffer(len); char c; for (i = (len - 1); i >= 0; i--) { c = string.charAt(i); if (Character.isLetterOrDigit(c)) { dest.append(c); } } return dest.toString(); } protected static String reverse(String string) { StringBuffer sb = new StringBuffer(string); return sb.reverse().toString(); } public static void main(String[] args) { String string = "Madam, I'm Adam."; System.out.println(); System.out.println( "Testing whether the following " + "string is a palindrome:"); System.out.println(" " + string); System.out.println(); • if (isPalindrome(string)) { System.out.println(“It IS a palindrome!"); } else { System.out.println("It is NOT a palindrome!"); } System.out.println(); } } De diagramas de clase (UML) a Java Transformación de clases para una implementación OO Todo atributo y operación en el diagrama de clases se debe declarar formando parte de su clase correspondiente. class LíneaVenta Línea Venta int cantidad; subtotal( ) {...} cantidad:entero subtotal( ) { LíneaVenta() {...} } Transformación de asociaciones para una implementación OO Una asociación bidireccional es implementada, normalmente, como un atributo de referencia dentro de cada objeto asociado. Si la asociación es unidireccional sólo se necesita añadir un atributo de referencia a una de las clases. Una asociación también se puede implementar como una clase. Transformación de asociaciones para una implementación OO Los atributos de referencia de la clase “uno” son simplemente referencias a un objeto. Los atributos de referencia de la clase “muchos” necesitan un contenedor de objetos. Una asociación cualificada se puede implementar en forma de objeto diccionario. Transformación de asociaciones para una implementación OO 1..* trabajapara 1 Persona Compañía empresario empleado class Persona { } class Compañía { Compañía empresario; Persona[] empleado; Persona( ) { … } Compañía( ) { … } } Transformación de asociaciones para una implementación OO 1..* Edita 1 Libros Editorial class Libro { class Editorial { Libro[] mislibros; Libro( ) { … } Editorial( ) { … } } } Transformación de clase asociación para una implementación OO 0..* Esta autorizado en Usuario 0..* Estación de trabajo Autorización class Usuario { autorización[] miautori; Usuario( ){ … } } class autorización { usuario miusuario; estaciónt miestación; autorización( ){ … } } class estaciónt { autorización[] miautori; estaciónt( ){ … } } Transformación de atributos de enlace para una implementación OO Asociación uno-a-uno: Los atributos de enlace se pueden almacenar como atributos de cualquiera de los objetos. Asociación uno-a-muchos: Los atributos de enlace se pueden almacenar como atributos del objeto “muchos”. Asociación muchos-a-muchos: Se implementa la asociación como una clase. Transformación de agregación para una implementación OO •Se implementa igual que la asociación. computadora 1 1..* monitor teclado class Monitor { Monitor( ) { … } } class Computadora { Monitor[] mismonitores; Teclado miteclado; Computadora( ) { } } class Teclado { Teclado( ) {…} } Transformación de herencia simple para una implementación OO Lámpara Fluorescente Incandescente class Lámpara { Lámpara( ) { … } } class Fluorescente extends Lámpara { Fluorescente( ) {…} } class Incandescente extends Lámpara { Incandescente( ) { … } } Paquetes Paquetes Un paquete es una agrupación de clases (librería) El programador puede crear sus propios paquetes con la sentencia package al principio del archivo fuente package <nombre.paquete>; Ejemplo: package empresa.finanzas; La composición de nombres (separados por puntos) está relacionada con la jerarquía de directorios: CLASSPATH\empresa\finanzas\ Los nombres de los paquetes se suelen escribir en minúsculas Ejemplo de Paquetes Archivo fuente Empleado.java: package empresa.finanzas; public class Empleado { ... } La clase Empleado realmente se llama empresa.finanzas.Empleado Si no se indica la sentencia package, la clase Empleado pertenecerá a un paquete por defecto sin nombre Sentencia import La sentencia import indica al compilador dónde están ubicadas las clases que estamos utilizando Para importar sólo una clase de un paquete: import <nombre.paquete>.<NombreClase>; Para importar todas las clases de un paquete: import <nombre.paquete>.*; El compilador añade a todos los archivos la línea import java.lang.*; El paquete que contiene las clases fundamentales para programar en Java (System, String, Object...) Ejemplo de import import empresa.finanzas.*; public class Jefe extends Empleado { String departamento; Empleado[] subordinados; } Si no se pone el import, deberíamos referirnos a Empleado como empresa.finanzas.Empleado La clase Jefe pertenece al paquete anónimo por defecto String pertenece al paquete java.lang Modificadores de acceso: atributos y métodos Especificador Clase Subclase Paquete Mundo private Si No No No protected Si Si* Si No public Si Si Si Si package Si No Si No La clase Vector La Clase Vector La clase Vector (paquete java.util) representa una colección heterogénea de objetos (referencias a objetos de tipo Object o a cualquiera de sus subclases) El vector al crearse reserva cierta cantidad de memoria, aunque sus elementos sólo utilicen una parte El tamaño del vector se incrementa por bloques cuando se añade y se agota el espacio reservado. El tamaño de incremento se indica en el atributo capacityIncrement El vector se mantiene compacto en todo momento Cada elemento es accesible a través de un índice, pero no con los corchetes, [ ] La Clase Vector Atributos: int capacityIncrement: incremento en la capacidad del vector. Si vale cero, duplica el tamaño actual del vector. int elementCount: número de elementos válidos del vector Object[] elementData: array de objetos donde se guardan los elementos Constructores: Vector(): Crea un vector vacío (capacidad 10, incremento 0) Vector(int initialCapacity): Crea un vector vacío con la capacidad dada (incremento 0) Vector(int initialCapacity, int initialIncrement): Crea un vector vacío con la capacidad y el incremento dados La Clase Vector Métodos: int capacity() devuelve la capacidad que tiene el vector int size() devuelve el número de elementos en el vector boolean contains(Object elem) devuelve true si el vector contiene el objeto especificado int indexOf(Object elem) devuelve la posición de la primera vez que aparece el objeto que se le pasa Object get(int index) devuelve el elemento situado en la posición indicada (*) void set(Object elem,int index) reemplaza el objeto que corresponde al índice por el objeto que se le pasa (*) Los métodos con (*) pueden lanzar la excepción ArrayIndexOutOfBoundsException La Clase Vector Métodos: void removeElementAt(int index) borra el objeto situado en la posición indicada (*) void addElement(Object elem) añade un objeto al final void insertElementAt(Object elem, inserta el objeto que se le pasa en la posición indicada, desplazando el resto de elementos en el vector (*) int index)