Programación de Sistemas de Tiempo Real - Web de ARCOS
Programación de Sistemas de Tiempo Real - Web de ARCOS
Programación de Sistemas de Tiempo Real - Web de ARCOS
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Programación</strong><br />
<strong>de</strong> <strong>Sistemas</strong><br />
<strong>de</strong> <strong>Tiempo</strong> <strong>Real</strong><br />
Java<br />
Java: repaso<br />
http://arcos.inf.uc3m.es/~ii_pstr<br />
Introducción<br />
– ¿Qué?, ¿Dón<strong>de</strong>?,...<br />
Entorno <strong>de</strong> <strong>de</strong>sarrollo.<br />
– Herramienta,pasos a dar, etc.<br />
Sintaxis <strong>de</strong>l lenguaje.<br />
– Tipos, variables, clases, ...<br />
Diseño: mo<strong>de</strong>los y metodologías.<br />
– UML,...,Proceso Unificado,...<br />
1
Introducción<br />
Historia y evolución.<br />
Características.<br />
Etc.<br />
Origen <strong>de</strong> Java<br />
Desarrollado por Sun Microsystems<br />
Finales <strong>de</strong> los 80, James Gosling<br />
– Desarrollo <strong>de</strong> Software portable para<br />
electrodomésticos<br />
Agosto 91. Leguaje OAK<br />
– Pequeño, fiable y in<strong>de</strong>pendiente arquitectura<br />
Marzo 93. World Wi<strong>de</strong> <strong>Web</strong><br />
Primavera 94. OAK se adapta a Internet<br />
Enero 95. OAK pasa a ser JAVA<br />
– Aparece HotJava<br />
Agosto 95. Java en Netscape<br />
...<br />
2
Características <strong>de</strong> Java<br />
Simple<br />
– Funcionalidad <strong>de</strong> un lenguaje potente, sin<br />
características confusas y peligrosas.<br />
– Menos errores al eliminar:<br />
• Punteros, registros, gestión <strong>de</strong> memoria …<br />
– Intérprete <strong>de</strong> tamaño pequeño, muy compacto.<br />
Orientado a Objetos<br />
– Encapsulación, herencia y polimorfismo.<br />
Distribuido<br />
– Bibliotecas y herramientas para hacer programas<br />
distribuidos.<br />
Características <strong>de</strong> Java<br />
In<strong>de</strong>p. Plataforma / Portable<br />
3
Características <strong>de</strong> Java<br />
Robusto<br />
– Comprobación <strong>de</strong> referencias.<br />
– Comprobación <strong>de</strong> límites <strong>de</strong> los vectores.<br />
– Excepciones.<br />
– Verificación <strong>de</strong> byte-co<strong>de</strong>s:<br />
• No <strong>de</strong>sbordamientos <strong>de</strong> pila<br />
• Parámetros conocidos y correctos<br />
• No conversiones ilegales <strong>de</strong> tipos<br />
• Accesos legales a campos/métodos <strong>de</strong> objetos<br />
• No intentos <strong>de</strong> violar normas acceso/seguridad<br />
Características <strong>de</strong> Java<br />
Seguro<br />
– Cargador <strong>de</strong> clases<br />
• Separa el espacio <strong>de</strong> nombres local <strong>de</strong> los recursos<br />
proce<strong>de</strong>ntes <strong>de</strong> la red<br />
• No caballos <strong>de</strong> Troya. Las clases se buscan primero<br />
entre las locales (luego en exteriores)<br />
– Apertura <strong>de</strong> ficheros y arranque <strong>de</strong> otras<br />
aplicaciones en máquina remota, no en local<br />
– Permite <strong>de</strong>sensamblado <strong>de</strong> byte-co<strong>de</strong>s.<br />
Solución programadores (código nativo)<br />
4
Características <strong>de</strong> Java<br />
Dinámico<br />
– Si se ejecuta una aplicación Java sobre red y<br />
encuentra una pieza que no sabe manejar, es<br />
capaz <strong>de</strong> traer automáticamente <strong>de</strong>l servidor<br />
cualquiera <strong>de</strong> las piezas que necesita para<br />
funcionar<br />
Interpretado<br />
– Más lento que C o C++<br />
Características <strong>de</strong> Java<br />
Multihilo (multithread)<br />
– Mejor rendimiento.<br />
– Más interactivo.<br />
– Facilidad <strong>de</strong> <strong>de</strong>sarrollo.<br />
5
Entorno <strong>de</strong> <strong>de</strong>sarrollo<br />
Herramientas <strong>de</strong>l SDK tradicional.<br />
Desarrollo <strong>de</strong> la primera aplicación:<br />
– Edición <strong>de</strong>l holaMundo.java<br />
– Compilación: javac.<br />
– Ejecución: java.<br />
– Depuración: jdb.<br />
JDK: Java Development Kit<br />
editor texto ASCII (fuente X.java)<br />
javac (objeto X.class)<br />
java (ejecución <strong>de</strong> la aplicación)<br />
jdb (<strong>de</strong>puración)<br />
6
JDK: Java Development Kit<br />
editor texto ASCII (fuente X.java)<br />
editor texto ASCII (fuente X.html)<br />
javac (objeto X.class)<br />
appletviewer (ejecución applet)<br />
jdb (<strong>de</strong>puración)<br />
JDK: Java Development Kit<br />
Javadoc (archivos .html)<br />
Jar (archivo .jar)<br />
Javap (archivo .class <strong>de</strong>sensamblado)<br />
...<br />
/tooldocs/tools.html<br />
7
Primera aplicación<br />
HolaMundo.java<br />
public class HolaMundo<br />
{<br />
public static void main (String args[ ] )<br />
{<br />
System.out.println(“¡Hola Mundo!”);<br />
}<br />
}<br />
Primera aplicación: javac<br />
javac [opciones] archivos<br />
– opciones:<br />
• -classpath camino<br />
• -d directorio<br />
• -g<br />
• -help<br />
– archivos<br />
• .java<br />
• @lista_archivos (separados por “ “ o “\n”)<br />
8
Primera aplicación<br />
Ejemplos:<br />
– javac HolaMundo.java<br />
– javac ../../fuentes/*.java<br />
– javac -classpath /java/clases *.java<br />
– javac -d ../clases HolaMundo.java<br />
– Javac –g HolaMundo.java<br />
Primera aplicación: java<br />
java [opciones] archivo [argumentos]<br />
java [opciones] –jar archivo [argumentos]<br />
– opciones:<br />
• -help: lista <strong>de</strong> opciones.<br />
– archivo:<br />
• Nombre archivo sin “.class”/”.jar”.<br />
– argumentos:<br />
• Argumentos para el programa.<br />
9
Primera aplicación<br />
Ejemplos:<br />
– java HolaMundo<br />
– java –classpath X.jar:Y.zip:../clases<br />
HolaMundo<br />
Advertencia:<br />
–En versiones antiguas <strong>de</strong>l jdk, “classpath<br />
” sobrescribe, no aña<strong>de</strong>.<br />
Primera aplicación: jdb<br />
“;” Windows<br />
“:” Linux<br />
jdb [opciones] archivos argumentos<br />
– opciones:<br />
• -help: lista <strong>de</strong> opciones<br />
– archivos<br />
• Nombre archivo sin “.class”<br />
– argumentos:<br />
• Argumentos para el programa.<br />
10
Primera aplicación<br />
jdb HolaMundo<br />
stop at HolaMundo:7<br />
Initializing jdb ...<br />
stop in HolaMundo.main<br />
run<br />
run HolaMundo<br />
VM Started: Set <strong>de</strong>ferred breakpoint HolaMundo.main<br />
Breakpoint hit: "thread=main", HolaMundo.main(),<br />
line=6 bci=0<br />
main[1] _<br />
Primera aplicación<br />
main[1] print args<br />
args = instance of java.lang.String[0] (id=285)<br />
main[1] dump args<br />
args = {<br />
}<br />
main[1] where<br />
[1] HolaMundo.main (HolaMundo.java:7)<br />
main[1] quit<br />
11
Primera aplicación: jdb<br />
– stop at C:22<br />
– stop in C:M<br />
– clear C:22<br />
– run<br />
– cont<br />
– step<br />
– help<br />
– where<br />
– up<br />
– down<br />
– threads<br />
– thread<br />
Sintaxis <strong>de</strong>l lenguaje<br />
Elementos <strong>de</strong> un programa.<br />
Juego <strong>de</strong> caracteres.<br />
I<strong>de</strong>ntificadores.<br />
Comentarios.<br />
Tipos.<br />
Variables.<br />
Literales.<br />
Operadores.<br />
Control <strong>de</strong> flujo.<br />
Estructura <strong>de</strong> un programa.<br />
– print<br />
– dump<br />
– set x=y<br />
12
Elementos <strong>de</strong> un programa<br />
Programa -> 1,n archivos<br />
Archivo -> 1,n paquetes<br />
Paquete -> 1,n (clases,interfaz,import)<br />
Clases o interfaces -> (datos, métodos)<br />
Método -> (variables,sentencias,bloques)<br />
Bloque -> (variable, sentencias,bloques)<br />
– Sentencia -> 1,n expresiones terminadas en “;”<br />
– Expresión -> 1,n (operación,método,expresión)<br />
Juego <strong>de</strong> caracteres<br />
Juego <strong>de</strong> caracteres Unico<strong>de</strong> (16 bits)<br />
Los 128 primeros caracteres equivalentes a ASCII<br />
Pocos editores Unico<strong>de</strong><br />
Los entornos Java aceptan cualquier fichero ASCII<br />
convirtiéndole sobre la marcha a Unico<strong>de</strong><br />
Java acepta \udddd (d es dígito hexa<strong>de</strong>cimal) para<br />
caracteres Unico<strong>de</strong><br />
13
I<strong>de</strong>ntificadores<br />
I<strong>de</strong>ntificador: nombre <strong>de</strong> un elemento que se<br />
utilizan en el lenguaje.<br />
– Etiqueta -> i<strong>de</strong>ntifica una posición <strong>de</strong> una sentencia.<br />
– Nombre -> i<strong>de</strong>ntifica una ‘entidad <strong>de</strong>clarable’ que<br />
pertenece a Java.<br />
Declaración:<br />
– Introducción <strong>de</strong> una ‘entidad’ en un programa Java +<br />
– Dotar <strong>de</strong> un nombre a dicha entidad +<br />
– Asociar un ámbito don<strong>de</strong> se pue<strong>de</strong> usar.<br />
I<strong>de</strong>ntificadores<br />
Construcción <strong>de</strong> los nombres <strong>de</strong> los<br />
elementos que se utilizan en el lenguaje:<br />
– Debe empezar por una letra, subrayado o dólar<br />
pero no con un dígito.<br />
– Las letras mayúsculas y minúsculas son<br />
consi<strong>de</strong>radas como letras distintas.<br />
– Un i<strong>de</strong>ntificador no pue<strong>de</strong> ser una <strong>de</strong> las palabras<br />
reservadas <strong>de</strong>l lenguaje, es <strong>de</strong>cir, palabras que<br />
tienen un significado especial para el lenguaje.<br />
(this, while, volatile....)<br />
14
Convenio para el nombrado<br />
clase -> HolaMundo<br />
método -> getV, setV, isV, toV, ...<br />
dato miembro -> varMiembro<br />
constante (final) -> LIMITE_INFERIOR<br />
parámetro -> i, fichEntrada, ...<br />
Comentarios<br />
– // hasta el final <strong>de</strong> la línea<br />
– /* comentario <strong>de</strong> bloque:<br />
pue<strong>de</strong>n ocupar varias líneas */<br />
– /** comentario <strong>de</strong> bloque java.<br />
Se usa para generar la documentación<br />
automáticamente con javadoc */<br />
/**<br />
* Este es un comentario.<br />
* @see java.lang.Object<br />
*/<br />
15
Tipos<br />
Tipo = <br />
– Nombre: nombre <strong>de</strong>l tipo.<br />
– Valores: conjunto <strong>de</strong> valores válidos (literales)<br />
para una variable <strong>de</strong> dicho tipo.<br />
– Ámbito: zona <strong>de</strong>l código fuente don<strong>de</strong> se pue<strong>de</strong><br />
usar dicho tipo.<br />
Taxonomía:<br />
– Tipos primitivos: asociados a un único valor.<br />
– Tipos referencia: contiene referencia a un valor.<br />
Tipos primitivos<br />
Variables tienen tipo<br />
Numéricos<br />
– byte (entero con signo, 8 bits)<br />
– short (entero con signo, 16 bits)<br />
– int (entero con signo, 32 bits)<br />
– long (entero con signo, 64 bits)<br />
– float (coma flotante, 32 bits)<br />
– double (coma flotante, 64 bits)<br />
No numéricos<br />
– boolean (true o false)<br />
– char (carácter Unico<strong>de</strong>, 16 bits)<br />
16
Tipos referencia<br />
char [] ach; (array)<br />
class x { ... }; (clase)<br />
interface y { ... }; (interfaz)<br />
null (referencia a objeto nulo)<br />
Conversión <strong>de</strong> tipos<br />
Contexto <strong>de</strong> conversión (Don<strong>de</strong>):<br />
– Asignación:<br />
• F_float = I_int<br />
– Invocación a método:<br />
• M(I_int) ; // void M ( long l );<br />
– Promoción numérica:<br />
• F_float * I_int<br />
– Conversión a String:<br />
• system .out.println(“x:” + i + “\n”);<br />
– Cast:<br />
• X_var = (TipoDestino) Y_var ;<br />
• X_obj = (ClaseDestino) Y_obj ;<br />
objetos tienen clase<br />
17
Conversión <strong>de</strong> tipos<br />
Tipo <strong>de</strong> conversión:<br />
– Ancha primitiva:<br />
• L_long = I_int<br />
– Estrecha primitiva:<br />
• I_int = L_long<br />
– Generalización:<br />
• O_base = (ClaseBase) O_<strong>de</strong>rivada<br />
– Especialización:<br />
• O_<strong>de</strong>rivada = (ClaseDerivada) O_base<br />
– String:<br />
• String s_obj = “” + V_var + O_objeto + null ;<br />
Literales<br />
Valor constante que aparecerá en la<br />
<strong>de</strong>scripción <strong>de</strong> una aplicación.<br />
Tipos primitivos:<br />
• Enteros (por <strong>de</strong>fecto int)<br />
– <strong>de</strong>cimal, no comience por 0 (v.g., 284).<br />
– Octal, comenzar por 0 (v.g., 023).<br />
– Hexa<strong>de</strong>cimal, comenzar por 0x (v.g., 0x2A).<br />
– Por <strong>de</strong>fecto, tienen 32 bits, si se quiere utilizar 64<br />
bits incluir el sufijo l o L (v.g., 23L).<br />
• Coma flotante (por <strong>de</strong>fecto double, se pue<strong>de</strong><br />
añadir sufijo f para float: 34.5f)<br />
– Notación estándar (v.g., 3.25).<br />
– Notación científica (v.g., 23E10).<br />
18
Literales (II)<br />
Tipos primitivos:<br />
• Caracteres simples<br />
– Comillas simples (v.g., ‘c’).<br />
– Caracteres no imprimibles: usar secuencias <strong>de</strong><br />
escape:<br />
\ddd Carácter octal<br />
\uxxxx Carácter Unico<strong>de</strong><br />
\n Nueva línea<br />
\’ Comillas simples<br />
\” Comillas doble<br />
\t Tabulador<br />
\\ Barra invertida<br />
\b Retroceso<br />
Literales (III)<br />
Tipos primitivos:<br />
• Lógicos: true/false<br />
– No tienen una representación <strong>de</strong> número entero<br />
Tipos referencia:<br />
• Ca<strong>de</strong>nas <strong>de</strong> caracteres<br />
– Comillas dobles (v.g., “hola”).<br />
• null (objeto no válido o no creado)<br />
19
Variables<br />
Variable: dato almacenado en la computadora<br />
que pue<strong>de</strong> variar a lo largo <strong>de</strong> la ejecución <strong>de</strong><br />
un programa.<br />
Consta <strong>de</strong>:<br />
– I<strong>de</strong>ntificador: ca<strong>de</strong>na <strong>de</strong> caracteres que se utiliza<br />
para i<strong>de</strong>ntificarla.<br />
– Tipo: indica la naturaleza <strong>de</strong>l valor que se va a<br />
almacenar.<br />
– Características: ámbito, valor por <strong>de</strong>fecto,<br />
existencia, etc. (<strong>de</strong>pendientes <strong>de</strong>l ‘contenedor’<br />
subscrito)<br />
Definición <strong>de</strong> variables<br />
public int [] aint;<br />
public int []aint = new int[10];<br />
public char [] achar = { ‘a’, ‘b’ };<br />
<br />
[=new ] ;<br />
20
Características <strong>de</strong> las variables<br />
m ( ...) {<br />
}<br />
for (int i=0; i
Operadores <strong>de</strong> los Tipos Básicos<br />
(Numéricos)<br />
Oper Operación Ejemplo<br />
++ Preincrementa el valor <strong>de</strong> la<br />
variable asociada.<br />
++ Postincrementa el valor <strong>de</strong><br />
la variable asociada.<br />
-- Pre<strong>de</strong>crementa el valor <strong>de</strong> la<br />
variable asociada.<br />
-- Post<strong>de</strong>crementa el valor <strong>de</strong><br />
la variable asociada.<br />
p=5; j=2+(++p); j(8) p(6)<br />
p=5; j=2+(p++);j(7) p(6)<br />
p=5; j=2+(--p); j(6) p(4)<br />
p=5; j=2+(p--);j(7) p(4)<br />
Operadores <strong>de</strong> los Tipos Básicos (bits)<br />
Operador Operación Ejemplo<br />
& 1 en las posiciones en las que<br />
haya dos unos<br />
| 1 en las posiciones en las que<br />
haya al menos un 1<br />
^ 1 en las posiciones en las que<br />
haya un 0 en un operando y un 1 en<br />
el otro<br />
~ Cambiar el valor <strong>de</strong> los bits <strong>de</strong> 0 a<br />
1 y <strong>de</strong> 1 a 0<br />
0004&00040004<br />
0002&00060002<br />
0004|00060006<br />
0002|00050007<br />
0002^00030001<br />
0004^00070003<br />
~00000777<br />
~07030074<br />
>>n Desplaza n bits a la <strong>de</strong>recha. 0004>>20001<br />
0004>>30000<br />
Operadores <strong>de</strong> los Tipos Básicos<br />
(Comparación)<br />
Ope Operación Ejemplo<br />
== true si son iguales x=5;y=5; ¿x==y? True<br />
x=5;y=6; ¿x==y? False<br />
!= true si son distintos y false en caso x=5;y=5; ¿x!=y? False<br />
contrario.<br />
x=5;y=6; ¿x!=y? True<br />
< true si el primero es menor que el x=5; y=5; x=y True<br />
segundo y false en caso contrario. x=7; y=5; x>=y True<br />
Operadores <strong>de</strong> los Tipos Básicos<br />
(Lógicos)<br />
Operad Operación Ejemplo<br />
&& Equivalente al<br />
AND lógico.<br />
|| Equivalente al OR<br />
lógico<br />
x= false; y=true (x&&y) <br />
false<br />
x= false; y=true (x||y) <br />
true<br />
! Negación lógica x= true; (!x) false<br />
23
Operadores <strong>de</strong> los Tipos Básicos<br />
(Ternario)<br />
Sintaxis<br />
(expresion booleana) ? expr1 : expr2<br />
El operador ? Evalua una expresión booleana y si el valor <strong>de</strong><br />
es verda<strong>de</strong>ro <strong>de</strong>vuelve como resultado la expr1, sino <strong>de</strong>vuelve<br />
el valor <strong>de</strong> la expr2<br />
Ejem:<br />
x=2;<br />
y= (x>3) ? 5: x+5;<br />
como x no es mayor <strong>de</strong> 3 la y tomará el valor 7 (x+2)<br />
Prece<strong>de</strong>ncia <strong>de</strong> operadores (I)<br />
– Asociatividad ( )<br />
– Oper. Postfijos: [], ., (params), expr++, expr--<br />
– Oper. Monarios: ++expr, –-expr, +expr, -expr,<br />
– Creación/Conversión new (tipo)expr<br />
– Multiplicación *, /, %<br />
– Suma +, -<br />
– Desplazamiento <br />
– Relacional , =, intanceof<br />
– Igualdad ==, !=<br />
24
Prece<strong>de</strong>ncia <strong>de</strong> operadores (II)<br />
– Y a nivel <strong>de</strong> bits &<br />
– O exclusiva a nivel <strong>de</strong> bits ^<br />
– O inclusiva a nivel <strong>de</strong> bits |<br />
– Y lógica &&<br />
– O lógica ||<br />
– Condicional ?:<br />
– Asignación =, +=, -=, *=, %=,<br />
>>=, >=,<br />
&=, ^=, !=<br />
Control fujo / alternativas / if-else<br />
Sintaxis:<br />
o<br />
if ( expresión_lógica ) sentencia1;<br />
[ else sentencia2 ; ]<br />
if ( expresión_lógica ) {bloque1}<br />
[ else {bloque2} ]<br />
– Si la expresión_lógica es verda<strong>de</strong>ra se ejecuta la<br />
sentencia1 o el bloque1<br />
si es falsa se ejecuta la sentencia 2 o el bloque 2<br />
25
Control fujo / alternativas / switch<br />
Sintaxis:<br />
switch (expresión_<strong>de</strong>_tipo_simple) {<br />
case valor1: [sentencia_1_1;]<br />
[sentencia:1_2;]<br />
...<br />
[break;]<br />
case valor2: [sentencia_2_1;]<br />
...<br />
[break;]<br />
. . .<br />
case valorN: [sentencia_N_1;]<br />
...<br />
[break;]<br />
[<strong>de</strong>fault: [sentencia_D_1;]<br />
... ]<br />
}<br />
switch<br />
El tipo <strong>de</strong> la expresión <strong>de</strong>be ser uno <strong>de</strong> los tipos simples (int, long,<br />
short, byte, char). No pue<strong>de</strong> ser un valor lógico porque los valores<br />
true y false no tienen su correspondiente numérico.<br />
Los valores <strong>de</strong> la selección múltiple (valor1, valor2,…) tienen que<br />
ser constantes, se evalúan en tiempo <strong>de</strong> compilación.<br />
Si la expresión <strong>de</strong> tipo toma el valor1 se ejecutan las sentencias<br />
1_X,<br />
Si toma el valor2 se ejecutan las sentencias_2_X, etc.<br />
Si no toma ninguno <strong>de</strong> los valores indicados y se pone el bloque<br />
<strong>de</strong>fault (que es opcional) se ejecutarán las instrucciones <strong>de</strong>l<br />
mismo.<br />
Si alguna <strong>de</strong> las opciones no contiene el break correspondiente, la<br />
ejecución prosigue con las sentencias <strong>de</strong>l siguiente case<br />
(conviene indicar con un comentario que los case vacíos continúan<br />
en el que les suce<strong>de</strong>).<br />
26
Control fujo / iterativas / while<br />
Sintaxis:<br />
while (expresion-boolean)<br />
sentencia<br />
– Se evalúa la expresión y si es verda<strong>de</strong>ra, se<br />
ejecuta la sentencia/s mientras la expresión siga<br />
siendo verda<strong>de</strong>ra.<br />
– Se utiliza cuando la sentencia tiene que<br />
ejecutarse 0 o varias veces<br />
– Si hay varias sentencias irán entre llaves { }<br />
Control fujo / iterativas / do-while<br />
Sintaxis:<br />
do<br />
sentencia<br />
while (expresion-boolean);<br />
– Se ejecuta la sentencia/s y <strong>de</strong>spués se evalúa la<br />
expresión, mientras esta sea verda<strong>de</strong>ra se<br />
seguirán ejecutando la sentencia/s<br />
– Se utiliza cuando la sentencia tiene que ser<br />
ejecutada al menos 1 vez<br />
– Si hay varias sentencias irán entre llaves { }<br />
27
Control fujo / iterativas / for<br />
Sintaxis:<br />
for ([expr-inic]; [expr-booleana]; [expr-incr])<br />
sentencia;<br />
– expr-inic: expresiones <strong>de</strong> inicialización, se ejecuta sólo 1 vez<br />
antes <strong>de</strong> comenzar el bucle.<br />
– expr-incr: expresión <strong>de</strong> incremento, se ejecuta una vez <strong>de</strong>spués<br />
<strong>de</strong> cada iteración y antes <strong>de</strong> comprobar la expr-booleana.<br />
– expr-booleana: condición <strong>de</strong> finalización <strong>de</strong>l bucle cuando toma<br />
valor falso, Si se omite expr-booleana, se supone true, Se evalua,<br />
<strong>de</strong>spués <strong>de</strong> la inicialización y antes <strong>de</strong> comenzar la siguiente<br />
iteración.<br />
– expr-inic y expr-incr pue<strong>de</strong>n ser compuestos (separados por<br />
coma).<br />
Control fujo / incondicional / break<br />
Sintaxis:<br />
Break [etiqueta];<br />
...<br />
etiqueta: sentencia<br />
– Para salir <strong>de</strong> cualquier bloque <strong>de</strong> sentencias.<br />
– Un break sin etiqueta termina el switch, for, while o<br />
do-while más interno.<br />
– Un break etiqueta, lleva el control hasta la sentencia<br />
externa etiquetada (similar al “goto” <strong>de</strong> otros<br />
lenguajes <strong>de</strong> programación).<br />
28
Control fujo / incondicional / continue<br />
Sintaxis:<br />
{<br />
continue [etiqueta];<br />
...<br />
etiqueta: sentencia<br />
}<br />
– Para continuar la ejecución en otra parte <strong>de</strong>l bucle.<br />
– Un continue sin etiqueta vuelve a evaluar la condición <strong>de</strong><br />
fin <strong>de</strong>l bucle.<br />
– Un continue etiqueta, lleva el control hasta la sentencia<br />
interna al bucle indicada por la etiqueta.<br />
Control fujo / incondicional / ...<br />
Sintaxis:<br />
return [expresion];<br />
– Termina la ejecución <strong>de</strong> un método, <strong>de</strong>volviendo el<br />
control al invocador<br />
– Si se indica una expresión, a<strong>de</strong>más <strong>de</strong>vuelve el<br />
valor resultante <strong>de</strong> la evaluación <strong>de</strong> dicha<br />
expresión.<br />
29
Control fujo / sincronización<br />
Sintaxis:<br />
syncronize ( ) {<br />
}<br />
sentencia<br />
– Adquiere el cerrojo asociado al objeto (o clase) indicada<br />
como ‘parámetro’ antes <strong>de</strong> ejecutar las sentencias <strong>de</strong>l<br />
bloque.<br />
Control fujo / Excepciones<br />
Sintaxis:<br />
try {<br />
...<br />
F();<br />
} catch (Exception e) {<br />
...<br />
} finally {<br />
}<br />
...<br />
public void F ()<br />
throws Xexception {<br />
...<br />
throw new Xexception;<br />
...<br />
}<br />
30
Estructura <strong>de</strong> un programa<br />
Paquete<br />
– Clases<br />
– Interfaces<br />
• Métodos<br />
• Atributos<br />
Paquete<br />
Estructura básica para <strong>de</strong>finir un paquete:<br />
package base.<strong>de</strong>riva1.<strong>de</strong>riva2;<br />
import java.lang.*;<br />
class class1 { ... } ;<br />
class class2 { ... } ;<br />
class class3 { ... } ;<br />
Definición <strong>de</strong> paquete:<br />
I<strong>de</strong>ntificadores separados por ‘.’<br />
Describen la finalidad <strong>de</strong>l paquete, <strong>de</strong> más<br />
a menos.<br />
Convención: usar dirección Internet, al<br />
revés y en mayúsculas.<br />
Existe un paquete anónimo: todo archivo<br />
java no <strong>de</strong>finido como paquete pertenece al<br />
un paquete sin nombre, que se importa<br />
automáticamente.<br />
31
Paquete<br />
Paquetes pre<strong>de</strong>finidos:<br />
– java.lang Clases básicas, importación automática.<br />
– java.io E/S<br />
– java.net Clases para aplicaciones en red<br />
– java.awt Interfaces gráficos.<br />
– java.util Fechas, gran<strong>de</strong>s cantida<strong>de</strong>s <strong>de</strong> texto, etc.<br />
– ...<br />
Ver /api/in<strong>de</strong>x.html<br />
Clases<br />
Estructura básica para <strong>de</strong>finir una clase:<br />
{<br />
abstract<br />
public<br />
final<br />
class nombre [extends cbase]<br />
[final,static,public,...] tipo variable_miembro;<br />
[implements interfaz [,interfaz] ]<br />
[public,abstract,...] tipo funcion_miembro (parametros) (; | {...})<br />
}<br />
1<br />
3<br />
2<br />
atributos<br />
métodos<br />
32
Interfaces<br />
Estructura básica para <strong>de</strong>finir una interfaz:<br />
[public]<br />
{<br />
}<br />
interface nombre [extends Super1 [, Super2]]<br />
[final,static,public] tipo variable_miembro = valor;<br />
[public,abstract] tipo funcion_miembro (parametros) ;<br />
Clases (1)<br />
Modificadores <strong>de</strong> clase:<br />
– Abstract<br />
• Parecido a virtual pura <strong>de</strong> C++<br />
• Necesario si:<br />
– Public<br />
atributos<br />
– Heredo y no implemento métodos abstract<br />
– Tengo 1 ó más métodos abstract<br />
• Accesible <strong>de</strong>s<strong>de</strong> cualquier paquete.<br />
– Final<br />
• No existen subclases.<br />
métodos<br />
33
Clases (2)<br />
Herencia:<br />
– No existe herencia múltiple <strong>de</strong> clases, si <strong>de</strong> interfaces<br />
– Existe una única jerarquía. La raíz es java.lang.Object<br />
Class A {<br />
};<br />
Uno (int );<br />
Uno(char, int);<br />
Dos(char);<br />
Abstract Tres();<br />
Static Cuatro();<br />
Clases (3)<br />
sobrecarga<br />
Datos miembro:<br />
static<br />
final<br />
volatile<br />
trasient<br />
Modificador<br />
sobrescribe<br />
implementa<br />
oculta<br />
Class B extends A {<br />
};<br />
modificación<br />
No pue<strong>de</strong> cambiar su valor<br />
Dos(char);<br />
Tres();<br />
Cuatro();<br />
Compartida por todas las instancias<br />
Accesible don<strong>de</strong> sea accesible la clase<br />
Modificación es atómica (si existen varios<br />
threads)<br />
No pertenece a la parte persistente <strong>de</strong> la<br />
clase<br />
34
Clases (3)<br />
Métodos miembro:<br />
static<br />
final<br />
abstract<br />
native<br />
Modificador<br />
syncronize<br />
Clases (3)<br />
public<br />
private<br />
protect<br />
Sólo pue<strong>de</strong> acce<strong>de</strong>r a variables static<br />
No sobrescribe<br />
modificación<br />
Similar a virtual en C++<br />
Control <strong>de</strong> acceso:<br />
package<br />
Implementado en otro lenguaje<br />
Sólo un thread ejecuta el método al mismo<br />
tiempo<br />
Clase Subclases Paquetes Mundo<br />
*<br />
*<br />
* *<br />
* * *<br />
35
Clases (3)<br />
NOTAS:<br />
– Private -> final<br />
– Native -> ! Abstract<br />
– Abstract -> ! Final, ! Static<br />
– Los modificadores no pertenecen a las señas<br />
<strong>de</strong> un método -> dos métodos con igual señas<br />
es un error aun siendo uno abstract ó ...<br />
Utilización <strong>de</strong> Métodos<br />
Sintáxis <strong>de</strong> invocación <strong>de</strong> un método<br />
[nombre<strong>de</strong>lobjeto.]nombre<strong>de</strong>lmetodo(parametros)<br />
Don<strong>de</strong>:<br />
– nombre<strong>de</strong>lobjeto <strong>de</strong>be ser un i<strong>de</strong>ntificador válido<br />
<strong>de</strong> un objeto creado. Pue<strong>de</strong> omitirse cuando se<br />
invoca al método <strong>de</strong>ntro <strong>de</strong> otro método <strong>de</strong> la<br />
misma clase y para referenciar el mismo objeto que<br />
se estaba tratando.<br />
– Nombre<strong>de</strong>lmetodo: es el nombre <strong>de</strong>l método.<br />
– parametros: <strong>de</strong>ben aparecer tantos como existan<br />
en la <strong>de</strong>claración <strong>de</strong>l método separados por comas.<br />
No se modifica el valor <strong>de</strong> los parámetros pasados<br />
(si el param. es una referencia a un obj. se pue<strong>de</strong><br />
cambiar el contenido <strong>de</strong>l mismo pero no la<br />
referencia).<br />
36
Ejem 1<br />
Uso <strong>de</strong> Métodos<br />
class PasarPorValor {<br />
public static void mitadValor(double d){<br />
d = d / 2.0;<br />
System.out.println(“mitad:d =“+d);<br />
}<br />
}<br />
Ejem 2 :<br />
public static void main (String arg[]) {<br />
double uno = 45.0;<br />
System.out.println(“antes:uno=“+uno);<br />
mitadValor(uno);<br />
System.out.println(“<strong>de</strong>spués: uno=“+uno);<br />
}<br />
Uso <strong>de</strong> Métodos<br />
Resultado<br />
antes:uno=45.0<br />
mitad:d=22.5<br />
Desp.:uno=45.0<br />
class PasarPorReferencia {<br />
double valor=45;<br />
void mitadValor(PasarPorReferencia pr){<br />
pr.valor = pr.valor / 2.0; Resultado<br />
antes:45.0<br />
System.out.println("mitad:"+pr.valor); mitad:22.5<br />
}<br />
<strong>de</strong>sp:22.5<br />
}<br />
class Ejecución {<br />
public static void main (String []args){<br />
PasarPorReferencia pr=new PasarPorReferencia();<br />
System.out.println("antes:"+ pr.valor );<br />
pr.mitadValor(pr);<br />
System.out.println("<strong>de</strong>sp:"+pr.valor);<br />
}<br />
}<br />
37
Método main: Aplicaciones<br />
public static void main (String[]args){<br />
...<br />
...<br />
}<br />
– Debe ser public, static y void (no <strong>de</strong>vuelve nada)<br />
– Acepta un argumento <strong>de</strong> tipo String[ ] que contiene<br />
los parámetros que se pasaron a la aplicación<br />
cuando se invocó <strong>de</strong>s<strong>de</strong> el Sistema Operativo<br />
– Las aplicaciones pue<strong>de</strong>n tener muchos main(uno por<br />
clase). Al ejecutar un programa Java, se ejecuta el<br />
main <strong>de</strong> la clase que se invoca<br />
Ejemplo Método main<br />
class Clase {<br />
public static void main (String arg[]) {<br />
System.out.println(arg.length);<br />
System.out.println(arg[0]);<br />
System.out.println(arg[1]);<br />
}<br />
}<br />
Si la ejecución se invoca con:<br />
java Clase uno dos<br />
el resultado <strong>de</strong> la ejecución es:<br />
2<br />
uno<br />
dos<br />
38
Constructor: Creación <strong>de</strong> objetos<br />
El constructor es una función miembro <strong>de</strong> la<br />
clase que tiene el mismo nombre que la clase.<br />
Admite public o protect.<br />
No se indica tipo <strong>de</strong> retorno.<br />
Admiten parámetros.<br />
Pue<strong>de</strong> haber varios constructores usando<br />
sobrecarga.(1,n).<br />
– Si no se <strong>de</strong>fine ninguno, Java <strong>de</strong>fine el constructor por<br />
<strong>de</strong>fecto (();).<br />
Constructor: Creación <strong>de</strong> objetos<br />
Se ejecuta:<br />
– Al invocarlo con newpara crear un nuevo objeto.<br />
En este caso, se <strong>de</strong>vuelve una referencia al objeto<br />
creado.<br />
– En conversiones.<br />
– Como resultados temporales <strong>de</strong> expresiones.<br />
Esta función miembro no se pue<strong>de</strong> invocar<br />
<strong>de</strong>s<strong>de</strong> los <strong>de</strong>más métodos.<br />
39
Constructor: Creación <strong>de</strong> objetos<br />
No es heredable.<br />
No es método <strong>de</strong> la clase.<br />
No es recursivo.<br />
Pue<strong>de</strong> llamar a otros constructores si no<br />
forman ciclos.<br />
Primero invoca al constructor <strong>de</strong> la superclase:<br />
– Explícitamente: super(3,4,...);<br />
– Implícitamente: super(); // si no se pone una<br />
llamada explícita al principio <strong>de</strong>l constructor.<br />
Constructor: Creación <strong>de</strong> objetos<br />
Para crear objetos hay que:<br />
Ejem:<br />
– Crear una referencia al objeto: Mesa m;<br />
– Crear el objeto (invocar constructor) m=new Mesa();<br />
class Mesa{<br />
Mesa(){ }<br />
}<br />
class otraClase{<br />
Mesa creaUnaMesa(){<br />
Mesa m;<br />
m=new Mesa();<br />
return m;<br />
}<br />
}<br />
40
this<br />
this sirve para referenciar al objeto que esta siendo<br />
utilizado <strong>de</strong>ntro <strong>de</strong> un método. Se pue<strong>de</strong> utilizar:<br />
– Cuando pue<strong>de</strong> existir ambigüedad en la utilización <strong>de</strong> un<br />
atributo (por que su nombre coinci<strong>de</strong> con el <strong>de</strong> un parámetro<br />
por ejemplo) :<br />
this.radio = 2*PI* radio;<br />
– Para invocar a otro método pasándole el objeto como<br />
argumento:<br />
numero.sumar(this)<br />
– Para invocar a otro constructor <strong>de</strong>ntro un constructor:<br />
Clase (int n){ //Constructor que recibe un entero<br />
this ( );//invocación a un constructor sin parámetros<br />
atributo=n;<br />
}<br />
Super<br />
Super sirve para acce<strong>de</strong>r a los miembros <strong>de</strong> la clase<br />
base <strong>de</strong>l objeto. Se pue<strong>de</strong> utilizar:<br />
– Cuando pue<strong>de</strong> existir ambigüedad en la utilización <strong>de</strong> un<br />
atributo (por que su nombre coinci<strong>de</strong> con el <strong>de</strong> la clase base) :<br />
return super.oculto();<br />
– Para invocar a un constructor <strong>de</strong> la clase base <strong>de</strong>ntro un<br />
constructor <strong>de</strong> la clase <strong>de</strong>rivada:<br />
ClaseA (int n){ //Constructor que recibe un entero<br />
}<br />
super(3);//invocación a un constructor sin parámetros<br />
...<br />
41