Java
Java
Java
Agenda
Qu es Java ? Caractersticas generales del lenguaje Variables Tipos de Datos Estructuras de control Orientado a Objeto: Clase, objeto, atributos, mtodos, constructores y mas.
Java
Tecnologa desarrollada por Sun Microsystems para aplicaciones software independiente de la plataforma, que engloba: Lenguaje de programacin Java API Java, proporciona a los programadores un entorno de desarrollo completo, as como una infraestructura. JVM, la mquina virtual que ejecuta bytecode de Java.
Java
Lenguaje de programacin orientado a objetos desarrollado por Sun Microsystems a principios de los 90 Las aplicaciones son compiladas en un bytecode, aunque tambin es posible la compilacin en cdigo de mquina nativo En tiempo de ejecucin, 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 ejecucin ligero y gratuito
Tecnologa Java
La tecnologa Java incluye el lenguaje de programacin y la plataforma
Java es al mismo tiempo compilado e interpretado
Tecnologa Java
Genera byteCode
Tecnologa Java
Compile-time Environment
Class Loader Java Source (.java) Java Bytecodes move locally or through network Bytecode Verifier
Compile-time Environment
Java Class Libraries
Java Interpreter
Java Compiler
Runtime System
Operating System
Hardware
Programa Simple
public class ProgramaSimple { public static void main(String[] args) { System.out.println("Este es + un programa simple"); System.exit(0); } }
Falta
/** * * * * * */
Returns total sales from all vendors; sets <code>totalSales</code> to 0. @return total amount of sales from all vendors
Estilo
Ejemplo javadoc
/** * Inserta un ttulo en la clase descripcin. * Al ser el ttulo obligatorio, si es nulo o vaco se lanzar * una excepcin. * * @param titulo El nuevo ttulo de la descripcin. * @throws IllegalArgumentException Si titulo es null, est vaco o contiene solo espacios. */ public void setTitulo (String titulo) throws IllegalArgumentException { if (titulo == null || titulo.trim().equals("")) { throw new Exception ("El ttulo no puede ser nulo o vaco"); } else { this.titulo = titulo; } }
Compila bien
Ms fcil de leer
Grupo de sentencias
Grupo de sentencias
} else {
amy.stop(); ben.stop(); currentState = State.STOPPED;
Grupo de sentencias
} danceFloor.update(this);
Variables
Variables
Una variable corresponde a una direccin 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 minscula (por convencin)
Variables
Una variable debe ser declarada antes de su uso int count; x, y; go; amy; Nombre(s)
String firstName;
Variables
El operador de asignacin permite cambiar el valor de una variable
count = 5; x = 0; go = new JButton("Go"); firstName = args[0];
Variables Alcance
Cada variable tiene un alcance el rea en el cdigo donde es visible Si usa una variable fuera de su alcance, el compilador reportar un error de sintxis 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 mtodo Las variables locales pierden su valor y son destruidas cuando finaliza el constructor o mtodo El alcance de una variable local es desde su declaracin hasta donde cierra el parntesis del bloque en el cual fue declarado
Variables
public class SomeClass { ... public SomeType SomeMethod (...) {
Variable local declarada
Alcance
{ } } ... }
Variables
Usen variables locales cuando sea apropiado; nunca use atributos cuando debera usar una variable Nmbrelas de manera que puedan ser fcilmente distinguibles de los atributos Use el mismo nombre para variables locales usadas de la misma forma en distintos mtodos (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 sintxis. 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
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' -99, 2010, 0 0.75, -12.3, 8., .5 coin.gif", "1776", "y", "\n"
Tipos de datos
Constantes simblicas son inicializadas como final private final int stepLength = 48; private static final int BUFFER_SIZE = 1024; public static final int PIXELS_PER_INCH = 6;
Operadores Aritmticos
Operadores
Operadores: +, -, /, * , % La precedencia de los operadores y parntesis 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 tambin para los resultados intermedios en una expresin 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/4 3 0
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 ms cercano
Estructuras de Control
if else
Expresiones booleanas
Variables booleanas pueden tener slo 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 expresin booleana El resultado de una expresin booleana es true o false Las expresiones booleanas estn compuestas de variables booleanas y operadores lgicos 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 mtodos equals o equalsIgnoreCase para comparar Strings: o
String cmd = console.readLine(); if ( cmd.equals ("Help") ) ...
Operadores relacionales
Mayor
! * + < && ||
++
-- (cast)
>=
==
!=
Menor
Ms fcil de leer
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 Faltan { }
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: ... }
while
condicion es cualquier expresin lgica
while ( condicion ) { statement1; statement2; ... statementN; } Si el cuerpo tiene solo una sentencia, entonces las { } son opcionales
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; }
for
for es una forma abreviada que combina en una sentencia la inicializacin, la condicin 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 cdigo Se ejecuta al menos una vez
break y continue
El break en una sentencia de iteracin instruye al programa para que termine inmediatamente la iteracin y contine en la primera sentencia despus del lazo return en un lazo indica al programa para que inmediatamente termine la ejecucin del mtodo y retorne al punto donde fue invocado Un break o return debe estar dentro de una clusula 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
Clase
Sintxis
Class <NombreClase> { // Declaracion de atributos <tipo> <var>; // Declaracin de mtodos <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
Creacin de un objeto
Se usa la palabra reservada new <refObjeto> = new <NombreClase>();
Atributos
Atributos o Miembros Los miembros o atributos se declaran fuera de los constructores y mtodos Generalmente su declaracin se agrupa en el tope de la clase o despus de los mtodos El alcance de un atributo es toda la clase
Alcance
O
public class SomeClass { Constructores y mtodos Atributos }
Alcance
Atributos
La definicin de los miembros o atributos de una clase se puede ampliar aadiendo modificadores al principio.:
[modificador]<tipo> <identificador>; [modificador]<tipo> <nombre>(<args>) {...}
Atributos
public. El miembro de la clase es accesible desde cualquier parte del cdigo. private. El miembro de la clase slo es accesible desde cdigo perteneciente a la propia clase. protected(o friendly). Slo las subclases de la clase y nadie ms pueden acceder a las variables y mtodos.
Ejemplo
public class Circulo { // Atributos double radio; String color; // Metodos void asigRadio( ){ } double area( ){} }
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("Mara","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()); } }
Mtodos
Constructores y mtodos pblicos 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 estn ocultos Mtodos Ayudantes que son necesarios slo para la clase se declaran de forma privada
accessor modifier
Generalmente, el programador provee de mtodos accessors que permiten acceder campos privados y mtodos modifiers que permiten modificar el valor de los campos privados Generalmente, el nombre de los mtodos accessor comienzan con get y los modifiers con set
encapsulacin
public class MyClass { // Private fields: private <sometype> myField; ... // Constructors: public MyClass (...) { ... } ... // Public methods: public <sometype> myMethod (...) { ... } ... // Private methods: private <sometype> myMethod (...) { ... } ... }
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 parmetros
Constructores
Si una clase tiene ms de un constructor, entonces deben tener distintos nmeros 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 ( ) { num = 0; No-args denom = 1; constructor } public Fraction (int n) { num = n; denom = 1; Continua } public Fraction (int n, int d) { num = n; denom = d; reduce (); } 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; Objeto Fraction num = 3 denom = 7 Fraction f1 = new Fraction(3,7); Fraction f2 = new Fraction(3,7); objeto Fraction num = 3 denom = 7 objeto Fraction num = 3 denom = 7
f1 f2
f1
f2
Referencia al mismo objeto
Mtodos
public [or private] returnType methodName (type1 name1, ..., typeN nameN)
{
...
}
cuerpo
encabezado
Para definir un mtodo 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 mtodo Escriba el cdigo del mtodo
Paso de argumentos
Cualquier expresin 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);
Paso de argumentos
Los tipos primitivos son siempre pasados por valor, es decir el valor es copiado en el parmetro public class Polynomial
{ double x = 3.0; double y = p.getValue ( x ); copia ... public double getValue (double u) { double v; u actua como una ... variable local en } getValue
x:
3.0
copia
u:
3.0
Paso de argumentos
public class Test { public double square (double x) { x es una copia del parmetro 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); Fraction f3 = f1.add (f2); public Fraction add (Fraction f) { ... } Refiere al } mismo objeto public class Fraction { ... copia referencia
Refiere a
Paso de argumentos
Dentro de un mtodo, this hace referencia al objeto por el cual el mtodo fue invocado this puede ser pasado a otros constructores y mtodos como parmetro
public class ChessGame { ... Player player1 = new Player (this); ... Una referencia a este (this) objeto ChessGame
sentencia return
Un mtodo, a menos que sea void, retorna un valor del tipo especificado por el mtodo Paso de argumentos La sentencia return es usada para terminar el mtodo y devolver un valor
return expresin; El tipo del valor o expresin retornada debe ser del mismo que lo declarado en el mtodo
sentencia return
Un mtodo puede tener varias sentencias return
public someType myMethod (...) { ... if (...) return <expression1>; else if (...) return <expression2>; ... return <expression3>; }
sentencia return
Un mtodo booleano puede retornar true, false, o el resultado de una expresin booleana
public boolean myMethod (...) { ... if (...) return true; ... return n % 2 == 0; }
sentencia return
Un mtodo void puede usar una sentencia de return para finalizar antes el mtodo
public void myMethod (...) { ... if (...) return; ... No hay necesidad } de especificar return al final del mtodo
sentencia return
Si la clase devuelve una clase, entonces el mtodo retornar una referencia a un objeto o null Generalmente el objeto ser creado dentro del mtodo usando new
public Fraction inverse () { if (num == 0) return null; return new Fraction (denom, num); }
El objeto retornado puede tambin venir de un parmetro o de otra llamada a otro mtodo
Sobrecarga de mtodos
Mtodos de la misma clase que tienen el mismo nombre y diferente nmero y/o tipo de argumentos se conocen como mtodos sobrecargados Use sobrecarga de mtodos 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 mtodos
El compilador los trata como mtodos diferentes El compilador sabe cul mtodo ser invocado basado en el nmero 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 mtodos
El tipo devuelto por el mtodo no es suficiente para distinguir mtodos sobrecargados
public class Circle { public void move (int x, int y) { ... } public Point move (int x, int y) { ... } ...
Error de sintxis
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 estadsticas o totales de los objetos de la clase
Campos static
El campo Static es almacenado dentro del cdigo 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 declaracin o en mtodos public static Si una clase tiene solamente campos static, entonces no hay necesidad de crear objetos de dicha clase. Todos seran idnticos Math y System son ejemplos de lo anterior. No poseen constructores pblicos y no pueden ser instanciados
static mtodos
Mtodos static pueden acceder y manipular campos estticos de una clase No pueden acceder campos no estticos o llamar mtodos no estticos de la clase Los mtodos static son llamados usando la notacin punto ClassName.statMethod(...) double x = Math.random(); double y = Math.sqrt (x); System.exit();
static mtodos
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(...); }
Mtodo static
Error!
Mtodos no static
Un mtodo no static puede ser invocado por un objeto usando la notacin punto objName.instMethod(...);
vendor.addMoney(25); die1.roll();
Estos mtodos pueden acceder todos los campos y mtodos de la clase (static o no)
Herencia
Herencia
Superclase (clase base)
Subclass extends Superclass
La herencia representa una relacin de es un entre objetos Un objeto de la subclase es un objeto de la superclase
CharlieChaplin
Herencia
La herencia de clases se lleva a cabo mediante extends Establece una relacin de especializacin -generalizacin entre clases. La subclase puede introducir nuevos mtodos y redefinir mtodos de la superclase.
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 mtodos 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 relacin de herencia es correcta, se plantea la pregunta "la subclase es-una superclase?". La respuesta debe ser "s
Relacin 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 { } class Coche { Motor m; Chasis ch; }
Mtodos virtuales
Una subclase puede modificar los mtodos 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 mtodo correcto ser llamado para un objeto de un tipo especfico, an cuando el objeto es una referencia a un objeto de un tipo genrico, es decir de una superclase Una vez definido una superclase comn, el polimorfismo ya existe, no hay que hacer nada adicional
polimorfismo
El parmetro actual pasado a este mtodo 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 mtodo correcto ser llamado automticamente para cada tipo especfico de creature: mtodos Walker para Walker, mtodos Hopper para Hopper, etc.
Un mtodo con el mismo nombre, tipo de retorno y lista de parmetros puede ser aplicado a objetos de diferentes clases. Uso, trabajar con la clase ms general:
Parmetros polimrficos Colecciones heterogneas
Empleado e1 = new Empleado(); Empleado e2 = new Jefe(); Empleado e1 = new Secretaria(); e2.numSupervisados = 15; // ERROR ((Jefe)e2).numSupervisados = 15;
Parmetros polimrficos
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 mtodos en una clase pueden ser declarados como abstract y slo especificar la firma del mtodo Una clase con uno o ms mtodos 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) { ... } }
Mtodos abstractos
clases abstractas
Clases abstractas sirven como superclases comunes para clases ms especficas Un mtodo abstracto provee una oportunidad al compilador para realizar chequeo adicional de errores Las clases y mtodos abstractos son necesarios para que el polimorfismo funcione Las clases abstractas estn ms cerca de la raz de la jerarqua pues describen objetos abstractos
clases abstractas
Java no nos permite instanciar, es decir crear objetos, de una clase abstracta An cuando la clase abstracta pueda tener constructores, estos pueden ser llamados desde constructores de las subclases Una clase sin mtodos abstractos se conoce concrete
Ejemplo
Jerarqua de figuras geomtricas: 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 implcitamente heredan de la clase Object: raz de la jerarqua. Object define un conjunto de mtodos 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) ... if (s1.equals(s2)) ... // false // true
Biped
super(...)
Walker
Interface
Dance
Interface
Una interface es un conjunto de declaraciones de mtodos Declaracin:
interface <NombreInterfaz> { <tipo> <nombreMtodo1> ( <args> ); <tipo> <nombreMtodo2> ( <args> ); ... }
Una clase que implemente el cdigo de la interfaz debe implementar todos sus mtodos
class <NombreClase> implements <NombreInterfaz> { <tipo> <nombreMtodo1> ( <args> ) { <cdigo> } <tipo> <nombreMtodo2> ( <args> ) { <cdigo> } ... }
Interface
Un interface en Java es similar a una clase abstracta que no tiene atributos ni constructores, y todos sus mtodos son abstractos
public interface Dance { DanceStep getStep (int i); int getTempo (); int getBeat (int i); }
Interface
Hay que indicar explcitamente que una clase implementa una interface Una clase concreta que implementa una interface debe suplir todos los mtodos 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 Definir
mtodos que sern implementados por una o ms clases la interface de programacin 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> <mtodo1>(); <tipo> <mtodo2>(); ... <tipo> <mtodoN>(); } equivale a abstract class Interfaz { abstract <tipo> <mtodo1>(); abstract <tipo> <mtodo2>(); ... abstract <tipo> <mtodoN>(); }
Interface
public interface Edible { String getFoodGroup(); int getCaloriesPerServing(); } public class Pancake implements Edible { ... }
public class Breakfast Polimorfismo: el { mtodo correcto private int myTotalCalories = 0; es llamado para ... cada tipo public void eat (Edible obj, int servings) especfico 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 especfico del arreglo es referenciado usando el nombre del arreglo y el ndice del mismo
1.39 c[0] 1.69 c[1] 1.74 c[2] 0.0 c[3]
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 expresin 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 esttica, es decir, su tamao no puede cambiar a tiempo de ejecucin El interpretador de Java chequea los valores de los ndices y lanza una excepctn 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 ejecucin
Sin arrays: 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];
1000 veces!
array
Los arreglos nos permiten un acceso directo a cualquier elemento del mismo sin necesidad de recorrer toda la estructura de datos Sin arrays: if (k == 0) display (score0); else if (k == 1) display (score1); else // etc. Con arrays: display (scores[k]);
1000 veces!
array
En Java, un arreglo es un objeto. Si el tipo de sus elementos es anyType, entonces el tipo del objeto arreglo es anyType[ ]. Declaracin de arreglos anyType [ ] arrName;
Dado que es un objeto, la declaracin 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
Longitud 10, todos los valores en 0 longitud 10000, todos los valores en null
array
Un arreglo puede ser inicializado en la declaracin
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 ms adelante durante la ejecucin
String [ ] words;
No inicializado
... words = new String [ console.readInt() ]; private double[ ] gasPrices; gasPrices = new double[ ] { 3.05, 3.17, 3.59 };
No inicializado
array
La longitud del arreglo es indicado en el momento de la creacin La longitud puede indicarse explcitamente en la declaracin o atravs de la lista de inicializacin La longitud de un arreglo arrName es obtenido en el cdigo usando arrName.length. length es un atributo pblico (no un mtodo) del objeto array
array
Como cualquier objeto, un arreglo es pasado a un mtodo como una referencia Los elementos del arreglo original no son copiados y pueden ser modificados desde el mtodo
// 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 dimensin, la k-sima fila. m.length es el nmero 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 nmero de columnas.
m[3].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; } }
Colecciones heterogneas
Hasta ahora un array slo poda contener elementos del mismo tipo (coleccin homognea) Utilizando polimorfismo se pueden tener elementos de distinto tipo en un array (coleccin heterognea) 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 mtodos Al contrario de otras clases, String tiene dos operadores , + y += (usados para concatenar)
Inmutabilidad
Una vez creado, un string no puede ser cambiado: ninguno de los mtodos 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 travs 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; String s1 = "Sun"; String s2 = new String(s1);
s1 "Sun" s2 OK
s1 s2
"Sun" "Sun"
Inmutabilidad
Desventaja: menos eficiente para pequeos 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 vacos
Un string vaco corresponde a una cadena que no tiene caracteres. Su longitud es 0
String s1 = ""; String s2 = new String(); Strings vacos
errorMsg es null
Las posiciones en un string son numeradas desde 0 Retorna: Flower".length(); Wind".charAt (2); 6 n'
Mtodo substring
String s2 = s.substring (i, k); devuelve la subcadena de caracteres en las posiciones i hasta k-1 String s2 = s.substring (i);
strawberry i k
strawberry i
Mtodo 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
retorna
date.indexOf ('J'); date.indexOf ('2'); date.indexOf ("2012"); date.indexOf ('2', 9); 0 8 8 11 (empieza a buscar a partir de la posicin 9) no encontrado
-1 15
Mtodos 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(); }
}
trabajapara empresario
1 Compaa
Esta autorizado en
0..*
Estacin de trabajo
1 teclado
class Teclado { Teclado( ) {} }
Fluorescente
class Lmpara { Lmpara( ) { } } class Fluorescente extends Lmpara { Fluorescente( ) {} }
Incandescente
Paquetes
Paquetes
Un paquete es una agrupacin de clases (librera) El programador puede crear sus propios paquetes con la sentencia package al principio del archivo fuente package <nombre.paquete>; Ejemplo: package empresa.finanzas; La composicin de nombres (separados por puntos) est relacionada con la jerarqua de directorios: CLASSPATH\empresa\finanzas\ Los nombres de los paquetes se suelen escribir en minsculas
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 dnde estn ubicadas las clases que estamos utilizando Para importar slo una clase de un paquete: import <nombre.paquete>.<NombreClase>; Para importar todas las clases de un paquete: import <nombre.paquete>.*; El compilador aade a todos los archivos la lnea 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, deberamos referirnos a Empleado como empresa.finanzas.Empleado La clase Jefe pertenece al paquete annimo por defecto String pertenece al paquete java.lang
La clase Vector
La Clase Vector
La clase Vector (paquete java.util) representa una coleccin heterognea 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 slo utilicen una parte El tamao del vector se incrementa por bloques cuando se aade y se agota el espacio reservado. El tamao de incremento se indica en el atributo capacityIncrement El vector se mantiene compacto en todo momento Cada elemento es accesible a travs 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 tamao actual del vector. int elementCount: nmero de elementos vlidos del vector Object[] elementData: array de objetos donde se guardan los elementos Constructores: Vector(): Crea un vector vaco (capacidad 10, incremento 0) Vector(int initialCapacity): Crea un vector vaco con la capacidad dada (incremento 0) Vector(int initialCapacity, int initialIncrement): Crea un vector vaco con la capacidad y el incremento dados
La Clase Vector
Mtodos: int capacity() int size() boolean contains(Object elem) int indexOf(Object elem) Object get(int index) void set(Object elem,int index) devuelve la capacidad que tiene el vector devuelve el nmero de elementos en el vector devuelve true si el vector contiene el objeto especificado devuelve la posicin de la primera vez que aparece el objeto que se le pasa devuelve el elemento situado en la posicin indicada (*) reemplaza el objeto que corresponde al ndice por el objeto que se le pasa (*)
La Clase Vector
Mtodos: void removeElementAt(int index) void addElement(Object elem) void insertElementAt(Object elem, int index) borra el objeto situado en la posicin indicada (*) aade un objeto al final inserta el objeto que se le pasa en la posicin indicada, desplazando el resto de elementos en el vector (*)