Cargando...
Blogger Draft | Edicion Entradas | Configuración | Diseño | Edición HTML | quickEdit OFF | quickEdit ON

domingo, 14 de marzo de 2010

DETECCION DE MOVIMIENTO EN JAVA

3
Motion funciona como la mayoría de los servidores de webcam: se lanza el programa, este detecta la webcam y vuelca las imágenes a través de un puerto indicado en el archivo de configuración para que estas sean accesibles a traves de la web.
La particularidad de Motion es que compara al vuelo las imágenes captadas en busca de cambios entre fotogramas consecutivos. Si la diferencia de pixels modificados entre dos fotogramas es superior al “threshold” (umbral) establecido en el archivo de configuración se disparan los eventos programados.

Normalmente estos eventos suelen consistir en sencillos scripts que ejecutan tareas, del tipo: “Guardar imagen como xxxx.jpg en la carpeta yyy“, “Subir imagen al servidor ftp”, etc… esto solo está sujeto a la imaginación del usuario, las posibilidades son muy extensas: apaga el ordenador si alguien se acerca.
Además, entre otras posibilidades, Motion viene preparado para capturar imágenes de camaras web ajenas, accesibles por internet, de tal manera que podamos “vigilar” lo que muestran otras webcams y programar el ordenador para que actue en consecuencia.


la creacion de este metodo resulto algo laborioso pero ni imposible espero les sirva!

descargar
Leer más »

miércoles, 16 de septiembre de 2009

Controlar el Acceso a los Miembros de la Clase

0
Uno de los beneficos de las clases es que pueden proteger sus variables y métodos miembros
frente al acceso de otros objetos. ¿Por qué es esto importante? Bien, consideremos esto. Se ha
escrito una clase que representa una petición a una base de datos que contiene toda clase de
información secreta, es decir, registros de empleados o proyectos secretos de la compañia.

Ciertas informaciones y peticiones contenidas en la clase, las soportadas por los métodos y
variables accesibles públicamente en su objeto son correctas para el consumo de cualquier otro
objeto del sistema. Otras peticiones contenidas en la clase son sólo para el uso personal de la
clase. Estas otras soportadas por la operación de la clase no deberían ser utilizadas por objetos de
otros tipos. Se querría proteger esas variables y métodos personales a nivel del lenguaje y
prohibir el acceso desde objetos de otros tipos.

En Java se puede utilizar los especificadores de acceso para proteger tanto las variables como los
métodos de la clase cuando se declaran. El lenguaje Java soporta cuatro niveles de acceso para
las variables y métodos miembros: private, protected, public, y, todavía no especificado, acceso
de paquete.

La siguiente tabla le muestra los niveles de acceso pemitidos por cada especificador:
Especificador clase subclase paquete mundo
private X
protected X X* X
public X X X X
package X X

La primera columna indica si la propia clase tiene acceso al miembro definido por el especificador
de acceso. La segunda columna indica si las subclases de la clase (sin importar dentro de que
paquete se encuentren estas) tienen acceso a los miembros. La tercera columna indica si las
clases del mismo paquete que la clase (sin importar su parentesco) tienen acceso a los miembros.
La cuarta columna indica si todas las clases tienen acceso a los miembros.
Observa que la intersección entre protected y subclase tiene un '*' - este caso de acceso particular
tiene una explicación en más detalle más adelante.
Echemos un vistazo a cada uno de los niveles de acceso más detalladamente:

Private
El nivel de acceso más restringido es private. Un miembro privado es accesible sólo para
la clase en la que está definido. Se utiliza este acceso para declarar miembros que sólo
deben ser utilizados por la clase. Esto incluye las variables que contienen informaión
que si se accede a ella desde el exterior podría colocar al objeto en un estado de
inconsistencia, o los métodos que llamados desde el exterior pueden ponen en peligro el
estado del objeto o del programa donde se está ejecutando. Los miembros privados son
como secretos, nunca deben contarsele a nadie.
Para declarar un miembro privado se utiliza la palabra clave private en su declaración.
La clase siguiente contiene una variable miembro y un método privados:

class Alpha {
private int soyPrivado;
private void metodoPrivado() {
System.out.println("metodoPrivado");
}
}

Los objetos del tipo Alpha pueden inspeccionar y modificar la variable soyPrivado y
pueden invocar el método metodoPrivado(), pero los objetos de otros tipos no pueden
acceder. Por ejemplo, la clase Beta definida aquí:

class Beta {
void metodoAccesor() {
Alpha a = new Alpha();
a.soyPrivado = 10; // ilegal
a.metodoPrivado(); // ilegal
}
}
no puede acceder a la variable soyPrivado ni al método metodoPrivado() de un
objeto del tipo Alpha porque Beta no es del tipo Alpha.
Si una clase está intentando acceder a una variable miembro a la que no tiene
acceso--el compilador mostrará un mensaje de error similar a este y no compilará su
programa:
Beta.java:9: Variable iamprivate in class Alpha not accessible from class Beta.
a.iamprivate = 10; // ilegal
^
1 error

Y si un programa intenta acceder a un método al que no tiene acceso, generará un error
de compilación parecido a este:
Beta.java:12: No method matching privateMethod() found in class Alpha.
a.privateMethod(); // ilegal
1 error

Protected
El siguiente especificador de nivel de acceso es 'protected' que permite a la propia clase,
las subclases (con la excepción a la que nos referimos anteriormente), y todas las clases
dentro del mismo paquete que accedan a los miembros. Este nivel de acceso se utiliza
cuando es apropiado para una subclase da la clase tener acceso a los miembros, pero
no las clases no relacionadas. Los miembros protegidos son como secretos familiares -
no importa que toda la familia lo sepa, incluso algunos amigos allegados pero no se
quiere que los extraños lo sepan.
Para declarar un miembro protegido, se utiliza la palabra clave protected. Primero
echemos un vistazo a cómo afecta este especificador de acceso a las clases del mismo
paquete.
Consideremos esta versión de la clase Alpha que ahora se declara para estar incluida en
el paquete Griego y que tiene una variable y un método que son miembros protegidos:
package Griego;
class Alpha {
protected int estoyProtegido;
protected void metodoProtegido() {
System.out.println("metodoProtegido");
}
}
Ahora, supongamos que la clase Gamma, también está declarada como miembro del
paquete Griego (y no es una subclase de Alpha). La Clase Gamma puede acceder
legalmente al miembro estoyProtegido del objeto Alpha y puede llamar legalmente a
su método metodoProtegido():
package Griego;
class Gamma {
void metodoAccesor() {
Alpha a = new Alpha();
a.estoyProtegido = 10; // legal
a.metodoProtegido(); // legal
}
}
Esto es muy sencillo. Ahora, investiguemos cómo afecta el especificador portected a una
subclase de Alpha.
Introduzcamos una nueva clase, Delta, que desciende de la clase Alpha pero reside en
un paquete diferente - Latin. La clase Delta puede acceder tanto a estoyProtegido
como a metodoProtegido(), pero solo en objetos del tipo Delta o sus subclases. La
clase Delta no puede acceder a estoyProtegido o metodoProtegido() en objetos del
tipo Alpha. metodoAccesor() en el siguiente ejemplo intenta acceder a la variable
miembro estoyProtegido de un objeto del tipo Alpha, que es ilegal, y en un objeto del
tipo Delta que es legal. Similarmente, metodoAccesor() intenta invocar a
metodoProtegido() en un objeto del tipo Alpha, que también es ilegal:
import Griego.*;
package Latin;
class Delta extends Alpha {
void metodoAccesor(Alpha a, Delta d) {
a.estoyProtegido = 10; // ilegal
d.estoyProtegido = 10; // legal
a.metodoProtegido(); // ilegal
d.metodoProtegido(); // legal
}
}
Si una clase es una subclase o se cuentra en el mismo paquete de la clase con el
miembro protegido, la clase tiene acceso al miembro protegido.

Public
El especificador de acceso más sencillo es 'public'. Todas las clases, en todos los
paquetes tienen acceso a los miembros públicos de la clase. Los miembros públicos se
declaran ólo si su acceso no produce resultados indeseados si un extraño los utiliza.
Aquí no hay secretos familiares; no importa que lo sepa todo el mundo.
Para declarar un miembro público se utiliza la palabra clave public. Por ejemplo,
package Griego;
class Alpha {
public int soyPublico;
public void metodoPublico() {
System.out.println("metodoPublico");
}
}
Reescribamos nuestra clase Beta una vez más y la ponemos en un paquete diferente
que la clase Alpha y nos aseguramos que no están relacionadas (no es una subclase) de
Alpha:
import Griego.*;
package Romano;
class Beta {
void metodoAccesor() {
Alpha a = new Alpha();
a.soyPublico = 10; // legal
a.metodoPublico(); // legal
}
}
Como se puede ver en el ejemplo anterior, Beta puede inspeccionar y modificar
legalmente la variable soyPublico en la clase Alpha y puede llamar legalmente al
método metodoPublico().

Acceso de Paquete
Y finalmente, el último nivel de acceso es el que se obtiene si no se especifica ningún
otro nivel de acceso a loss miembros. Este nivel de acceso permite que las clases del
mismo paquete que la clase tengan acceso a los miembros. Este nivel de acceso asume
que las clases del mismo paquete son amigas de confianza. Este nivel de confianza es
como la que extiende a sus mejores amigos y que incluso no la tiene con su familia.
Por ejemplo, esta versión de la clase Alpha declara una variable y un método con acceso
de paquete. Alpha reside en el paquete Griego:
package Griego;
class Alpha {
int estoyEmpaquetado;
void metodoEmpaquetado() {
System.out.println("metodoEmpaquetado");
}
}
La clase Alpha tiene acceso a estoyEmpaquetado y a metodoEmpaquetado().
Además, todas las clases declaradas dentro del mismo paquete como Alpha también
tienen acceso a estoyEmpaquetado y metodoEmpaquetado(). Supongamos que
tanto Alpha como Beta son declaradas como parte del paquete Griego:
package Griego;
class Beta {
void metodoAccesor() {
Alpha a = new Alpha();
a.estoyEmpaquetado = 10; // legal
a.metodoEmpaquetado(); // legal
}
}
Entonces Beta puede acceder legalmente a estoyEmpaquetado y
metodoEmpaquetado().
Leer más »

Expresiones

0
Las expresiones realizan el trabajo de un programa Java. Entre otras cosas, las
expresiones se utilizan para calcular y asignar valores a las variables y para
controlar el flujo de un programa Java. El trabajo de una expresión se divide en
dos partes: realizar los cálculos indicados por los elementos de la expresión y
devolver algún valor.
Definición: Una expresión es una serie de variables, operadores y llamadas a
métodos (construida de acuerdo a la sintaxis del lenguaje) que evalúa a un valor
sencillo.

El tipo del dato devuelto por una expresión depende de los elementos utilizados en
la expresión. La expresión count++ devuelve un entero porque ++ devuelve un
valor del mismo tipo que su operando y count es un entero. Otras expresiones
devuelven valores booleanos, cadenas, etc...
Una expresión de llamada a un método devuelve el valor del método; así el tipo de
dato de una expresión de llamada a un método es el mismo tipo de dato que el
valor de retorno del método. El método System.in.read() se ha declarado como
un entero, por lo tanto, la expresión System.in.read() devuelve un entero.
La segunda expresión contenida en la sentencia System.in.read() != -1 utiliza el
operador !=. Recuerda que este operador comprueba si los dos operandos son
distintos. En esta sentencia los operandos son System.in.read() y -1.
System.in.read() es un operando válido para != porque devuelve un entero. Así
System.in.read() != -1 compara dos enteros, el valor devuelto por
System.in.read() y -1. El valor devuelto por != es true o false dependiendo de
la salida de la comparación.
Como has podido ver, Java te permite construir expresiones compuestas y
sentencias a partir de varias expresiones pequeñas siempre que los tipos de datos
requeridos por una parte de la expresión correspondan con los tipos de datos de la
otra. Tambíen habrás podido concluir del ejemplo anterior, el orden en que se
evalúan los componentes de una expresión compuesta.

Por ejemplo, toma la siguiente expresión compuesta:
x * y * z
En este ejemplo particular, no importa el orden en que se evalúe la expresión
porque el resultado de la multiplicación es independiente del orden. La salida es
siempre la misma sin importar el orden en que se apliquen las multiplicaciones. Sin
embargo, esto no es cierto para todas las expresiones. Por ejemplo, esta expresión
obtiene un resultado diferente dependiendo de si se realiza primero la suma o la
división:
x + y / 100
Puedes decirle directamente al compilador de Java cómo quieres que se evalúe una
expresión utilizando los paréntesis ( y ). Por ejemplo, para aclarar la sentencia
anterior, se podría escribir: (x + y)/ 100.
Si no le dices explícitamente al compilador el orden en el que quieres que se
realicen las operaciones, él decide basándose en la precedencia asignada a los
operadores y otros elementos que se utilizan dentro de una expresión.
Los operadores con una precedencia más alta se evalúan primero. Por ejemplo. el
operador división tiene una precedencia mayor que el operador suma, por eso, en
la expresión anterior x + y / 100, el compilador evaluará primero y / 100. Así
x + y / 100
es equivalente a:
x + (y / 100)
Para hacer que tu código sea más fácil de leer y de mantener deberías explicar e
indicar con parétesis los operadores que se deben evaluar primero.
La tabla siguiente muestra la precedencia asignada a los operadores de Java. Los
operadores se han listado por orden de precedencia de mayor a menor. Los
operadores con mayor precedencia se evalúan antes que los operadores con un
precedencia relativamente menor. Lo operadores con la misma precedencia se
evalúan de izquierda a derecha.

Precedencia de Operadores en Java
operadores sufijo [] . (params) expr++ expr--
operadores unarios ++expr --expr +expr -expr ~ !
creación o tipo new (type)expr
multiplicadores * / %
suma/resta + -
desplazamiento << >> >>>
relacionales < > <= >= instanceof
igualdad == !=
bitwise AND &
bitwise exclusive OR ^
bitwise inclusive OR |
AND lógico &&
OR lógico ||
condicional ? :
asignación = += -= *= /= %= ^= &= |= <<=
>>= >>>=
Leer más »

Arrays y Cadenas

0
Al igual que otros lenguajes de programación, Java permite juntar y manejar múltiples
valores a través de un objeto array (matriz). También se pueden manejar datos
compuestos de múltiples caracteres utilizando el objeto String (cadena).
Arrays
Esta sección te enseñará todo lo que necesitas para crear y utilizar arrays en
tus programas Java.
Como otras variables, antes de poder utilizar un array primero se debe
declarar. De nuevo, al igual que otras variables, la declaración de un array
tiene dos componentes primarios: el tipo del array y su nombre. Un tipo de
array incluye el tipo de dato de los elementos que va contener el array. Por
ejemplo, el tipo de dato para un array que sólo va a contener elementos
enteros es un array de enteros. No puede existir un array de tipo de datos
genérico en el que el tipo de sus elementos esté indefinido cuando se declara
el array. Aquí tienes la declaración de un array de enteros:
int[] arrayDeEnteros;
La parte int[] de la declaración indica que arrayDeEnteros es un array de
enteros. La declaración no asigna ninguna memoria para contener los
elementos del array.
Si se intenta asignar un valor o acceder a cualquier elemento de
arrayDeEnteros antes de haber asignado la memoria para él, el compilador
dará un error como este y no compilará el programa:
testing.java:64: Variable arraydeenteros may not have been initialized.
Para asignar memoria a los elementos de un array, primero se debe
ejemplarizar el array. Se puede hacer esto utilizando el operador new de Java.
(Realmente, los pasos que se deben seguir para crear un array son similares a
los se deben seguir para crear un objeto de una clase: declaración,
ejemplarización e inicialización.
La siguiente sentencia asigna la suficiente memoria para que arrayDeEnteros
pueda contener diez enteros.
int[] arraydeenteros = new int[10]
En general, cuando se crea un array, se utiliza el operador new, más el tipo
de dato de los elementos del array, más el número de elementos deseados
encerrado entre cochetes cuadrados ('[' y ']').
TipodeElemento[] NombredeArray = new TipodeElementos[tamanoArray]
Ahora que se ha asignado memoria para un array ya se pueden asignar
valores a los elemetos y recuperar esos valores:
for (int j = 0; j < arrayDeEnteros.length; j ++) {
arrayDeEnteros[j] = j;
System.out.println("[j] = " + arrayDeEnteros[j]);
}
Como se puede ver en el ejemplo anterior, para referirse a un elemento del
array, se añade corchetes cuadrados al nombre del array. Entre los corchetes
caudrados se indica (bien con una variable o con una expresión) el índice del
elemento al que se quiere acceder. Observa que en Java, el índice del array
empieza en 0 y termina en la longitud del array menos uno.
Hay otro elemento interesante en el pequeño ejemplo anterior. El bucle for
itera sobre cada elemento de arrayDeEnteros asignándole valores e
imprimiendo esos valores. Observa el uso de arrayDeEnteros.length para
obtener el tamaño real del array. length es una propiedad proporcionada para
todos los arrays de Java.
Los arrays pueden contener cualquier tipo de dato legal en Java incluyendo los
tipos de referencia como son los objetos u otros array. Por ejemplo, el
siguiente ejemplo declara un array que puede contener diez objetos String.
String[] arrayDeStrings = new String[10];
Los elementos en este array son del tipo referencia, esto es, cada elemento
contiene una referencia a un objeto String. En este punto, se ha asignado
suficiente memoria para contener las referencias a los Strings, pero no se ha
asignado memoria para los propios strings. Si se intenta acceder a uno de los
elementos de arraydeStrings obtendrá una excepción 'NullPointerException'
porque el array está vacio y no contiene ni cadenas ni objetos String. Se debe
asignar memoria de forma separada para los objetos String:
for (int i = 0; i < arraydeStrings.length; i ++) {
arraydeStrings[i] = new String("Hello " + i);
}
Strings
Una secuencia de datos del tipo carácter se llama un string (cadena) y en el
entorno Java está implementada por la clase String (un miembro del paquete
java.lang).
String[] args;
Este código declara explícitamente un array, llamado args, que contiene
objetos del tipo String. Los corchetes vacios indican que la longitud del array
no se conoce en el momento de la compilación, porque el array se pasa en el
momento de la ejecución.
El segundo uso de String es el uso de cadenas literales (una cadena de
caracteres entre comillas " y "):
"Hola mundo!"
El compilador asigna implicitamente espacio para un objeto String cuando
encuentra una cadena literal.
Los objetos String son inmutables - es decir, no se pueden modificar una vez
que han sido creados. El paquete java.lang proporciona una clase diferente,
StringBuffer, que se podrá utilizar para crear y manipular caracteres al vuelo.
Concatenación de Cadenas
Java permite concatenar cadenas facilmente utilizando el operador
+. El siguiente fragmento de código concatena tres cadenas para
producir su salida:
"La entrada tiene " + contador + " caracteres."
Dos de las cadenas concatenadas son cadenas literales: "La
entrada tiene " y " caracteres.". La tercera cadena - la del medioes
realmente un entero que primero se convierte a cadena y luego
se concatena con las otras.
Leer más »

Sentencias de Control de Flujo

0
Las sentencias de control de flujo determinan el orden en que se ejecutarán las otras sentencias
dentro del programa. El lenguaje Java soporta varias sentencias de control de flujo, incluyendo:
Sentencias palabras clave
toma de decisiones if-else, switch-case
bucles for, while, do-while
excepciones try-catch-finally, throw
miscelaneas break, continue, label:, return
Nota: Aunque goto es una palabra reservada, actualmente el lenguaje Java no la soporta.
Podemos utilizar las rupturas etiquetadas en su lugar.
La sentencia if-else
La sentencia if-else de java proporciona a los programas la posibilidad de ejecutar
selectivamente otras sentencias basándose en algún criterio. Por ejemplo, supon que
tu programa imprime información de depurado basándose en el valor de una variable
booleana llamada DEBUG. Si DEBUG fuera verdadera true, el programa imprimiría la
información de depurado, como por ejemplo, el valor de una variable como x. Si
DEBUG es false el programa procederá normalmente. Un segmento de código que
implemente esto se podría parecer a este:
. . .
if (DEBUG)
System.out.println("DEBUG: x = " + x);
. . .
Esta es la versión más sencilla de la sentencia if: la sentencia gobernada por if se
ejecuta si alguna codición es verdadera. Generalmente, la forma sencilla de if se puede
escribir así:
if (expresión)
sentencia
Pero, ¿y si quieres ejecutar un juego diferente de sentencias si la expresión es falsa?
Bien, puedes utilizar la sentencia else. Echemos un vistazo a otro ejemplo. Supon que
tu programa necesita realizar diferentes acciones dependiendo de que el usuario pulse
el botón OK o el botón Cancel en un ventana de alarma. Se podría hacer esto
utilizando una sentencia if:
. . .
// Respuesta dependiente del botoón que haya pulsado el usuario
// OK o Cancel
. . .
if (respuesta == OK) {
. . .
// Código para la acción OK
. . .
} else {
. . .
// código para la acción Cancel
. . .
}
Este uso particular de la sentencia else es la forma de capturarlo todo. Existe otra
forma de la sentecia else, else if que ejecuta una sentencia basada en otra expresión.
Por ejemplo, supon que has escrito un programa que asigna notas basadas en la
puntuación de un examen, un Sobresaliente para una puntuación del 90% o superior,
un Notable para el 80% o superior y demás. odrías utilizar una sentencia if con una
serie de comparaciones else if y una setencia else para escribir este código:
int puntuacion;
String nota;
if (puntuacion >= 90) {
nota = "Sobresaliente";
} else if (puntuacion >= 80) {
nota = "Notable";
} else if (puntuacion >= 70) {
nota = "Bien";
} else if (puntuacion >= 60) {
nota = "Suficiente";
} else {
nota = "Insuficiente";
}
Una sentencia if puede tener cualquier número de sentencias de acompañamiento else
if. Podrías haber observado que algunos valores de puntuacion pueden satisfacer más
una de las expresiones que componen la sentencia if. Por ejemplo, una puntuación de
76 podría evaluarse como true para dos expresiones de esta sentencia:puntuacion
>= 70 y puntuacion >= 60. Sin embargo, en el momento de ejecución, el sistema
procesa una sentencia if compuesta como una sóla; una vez que se ha satisfecho una
condición (76 >= 70), se ejecuta la sentencia apropiada (nota = "Bien";), y el control
sale fuera de la sentencia if sin evaluar las condiciones restantes.
La sentencia switch
La sentencia switch se utiliza para realizar sentencias condicionalmente basadas en
alguna expresión. Por ejemplo, supon que tu programa contiene un entero llamado
mes cuyo valor indica el mes en alguna fecha. Supon que también quieres mostrar el
nombre del mes basándose en su número entero equivalente. Podrías utilizar la
sentencia switch de Java para realizar esta tarea:
int mes;
. . .
switch (mes) {
case 1: System.out.println("Enero"); break;
case 2: System.out.println("Febrero"); break;
case 3: System.out.println("Marzo"); break;
case 4: System.out.println("Abril"); break;
case 5: System.out.println("May0"); break;
case 6: System.out.println("Junio"); break;
case 7: System.out.println("Julio"); break;
case 8: System.out.println("Agosto"); break;
case 9: System.out.println("Septiembre"); break;
case 10: System.out.println("Octubre"); break;
case 11: System.out.println("Noviembre"); break;
case 12: System.out.println("Diciembre"); break;
}
La sentencia switch evalúa su expresión, en este caso el valor de mes, y ejecuta la
sentencia case apropiada. Decidir cuando utilizar las sentencias if o switch dependen
del juicio personal. Puedes decidir cual utilizar basándose en la buena lectura del
código o en otros factores.
Cada sentencia case debe ser única y el valor proporcionado a cada sentencia case
debe ser del mismo tipo que el tipo de dato devuelto por la expresión proporcionada a
la sentencia switch.
Otro punto de interes en la sentencia switch son las sentencias break después de
cada case. La sentencia break hace que el control salga de la sentencia switch y
continúe con la siguiente línea. La sentencia break es necesaria porque las sentencias
case se siguen ejecutando hacia abajo. Esto es, sin un break explícito, el flujo de
control seguiría secuencialmente a través de las sentencias case siguientes. En el
ejemplo anterior, no se quiere que el flujo vaya de una sentencia case a otra, por eso
se han tenido que poner las sentencias break. Sin embargo, hay ciertos escenario en
los que querrás que el control proceda secuencialmente a través de las sentencias
case. Como este código que calcula el número de días de un mes de acuerdo con el
ritmico refrán que dice "Treinta tiene Septiembre...".
int mes;
int numeroDias;
. . .
switch (mes) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numeroDias = 31;
break;
case 4:
case 6:
case 9:
case 11:
numeroDias = 30;
break;
case 2:
if ( ((ano % 4 == 0) && !(ano % 100 == 0)) || ano % 400 == 0) )
numeroDias = 29;
else
numeroDias = 28;
break;
}
Finalmente, puede utilizar la sentencia default al final de la sentencia switch para
manejar los valores que no se han manejado explícitamente por una de las sentencias
case.
int mes;
. . .
switch (mes) {
case 1: System.out.println("Enero"); break;
case 2: System.out.println("Febrero"); break;
case 3: System.out.println("Marzo"); break;
case 4: System.out.println("Abril"); break;
case 5: System.out.println("Mayo"); break;
case 6: System.out.println("Junio"); break;
case 7: System.out.println("Julio"); break;
case 8: System.out.println("Agosto"); break;
case 9: System.out.println("Septiembre"); break;
case 10: System.out.println("Octubre"); break;
case 11: System.out.println("Noviembre"); break;
case 12: System.out.println("Diciembre"); break;
default: System.out.println("Ee, no es un mes válido!");
break;
}
Sentencias de Bucle
Generalmente hablando, una sentencia while realiza una acción mientras se cumpla
una cierta condición. La sintaxis general de la sentencia while es:
while (expresión)
sentencia
Esto es, mientras la expresión sea verdadera, ejecutará la sentencia.
sentencia puede ser una sóla sentencia o puede ser un bloque de sentencias. Un
bloque de sentencias es un juego de sentencias legales de java contenidas dentro de
corchetes('{'y '}'). Por ejemplo, supon que además de incrementar contador dentro
de un bucle while también quieres imprimir el contador cada vez que se lea un
carácter. Podrías escribir esto en su lugar:
. . .
while (System.in.read() != -1) {
contador++;
System.out.println("Se ha leido un el carácter = " + contador);
}
. . .
Por convención el corchete abierto '{' se coloca al final de la misma línea donde se
encuentra la sentencia while y el corchete cerrado '}' empieza una nueva línea
indentada a la línea en la que se encuentra el while.
Además de while Java tiene otros dos constructores de bucles que puedes utilizar en
tus programas: el bucle for y el bucle do-while.
Primero el bucle for. Puedes utilizar este bucle cuando conozcas los límites del bucle
(su instrucción de inicialización, su criterio de terminación y su instrucción de
incremento). Por ejemplo, el bucle for se utiliza frecuentemente para iterar sobre los
elementos de un array, o los caracteres de una cadena.
// a es un array de cualquier tipo
. . .
int i;
int length = a.length;
for (i = 0; i < length; i++) {
. . .
// hace algo en el elemento i del array a
. . .
}
Si sabes cuando estas escribiendo el programa que quieres empezar en el inicio del
array, parar al final y utilizar cada uno de los elementos. Entonces la sentencia for es
una buena elección. La forma general del bucle for puede expresarse asi:
for (inicialización; terminación; incremento)
sentencias
inicialización es la sentencia que inicializa el bucle -- se ejecuta una vez al iniciar el
bucle.
terminación es una sentecia que determina cuando se termina el bucle. Esta expresión
se evalúa al principio de cada iteracción en el bucle. Cuando la expreión se evalúa a
false el bucle se termina.
Finalmente, incremento es una expresión que se invoca en cada interacción del bucle.
Cualquiera (o todos) de estos componentes puden ser una sentencia vacía (un punto y
coma).
Java proporciona otro bucle, el bucle do-while,que es similar al bucle while que se
vió al principio, excepto en que la expresión se avalú al final del bucle:
do {
sentencias
} while (Expresión Booleana);
La sentencia do-while se usa muy poco en la construcción de bucles pero tiene sus
usos. Por ejemplo, es conveniente utilizar la sentencia do-while cuando el bucle debe
ejecutarse al menos una vez. Por ejemplo, para leer información de un fichero,
sabemos que al menos debe leer un carácter:
int c;
InputStream in;
. . .
do {
c = in.read();
. . .
} while (c != -1);
Sentencias de Manejo de Excepciones
Cuando ocurre un error dentro de un método Java, el método puede lanzar una
excepción para indicar a su llamador que ha ocurrido un error y que el error está
utilizando la sentencia throw. El método llamador puede utilizar las sentencias try,
catch, y finally para capturar y manejar la excepción. Puedes ver Manejar Errores
Utilizando Excepciones para obtener más información sobre el lanzamiento y manejo
de excepciones.
Sentencias de Ruptura
Ya has visto la sentencia break en acción dentro de la sentencia switch
anteriormente. Como se observó anteriormente, la sentencia break hace que el
control del flujo salte a la sentencia siguiente a la actual.
Hay otra forma de break que hace que el flujo de control salte a una sentencia
etiquetada. Se puede etiquetar una sentencia utilizando un identificador legal de Java
(la etiqueta) seguido por dos puntos (:) antes de la sentencia:
SaltaAqui: algunaSentenciaJava
Para saltar a la sentencia etiquetada utilice esta forma de la sentencia break.
break SaltaAqui;
Las rupturas etiquetadas son una alternativa a la sentencia goto que no está
soportada por el lenguaje Java.
Se puede utiliza la sentencia continue dentro de un bucle para saltar de la sentencia
actual hacia el principio del bucle o a una sentencia etiquetada. Considera esta
implementación del método indexOf() de la clase String que utiliza la forma de
continue que continúa en una sentencia etiquetada:
public int indexOf(String str, int fromIndex) {
char[] v1 = value;
char[] v2 = str.value;
int max = offset + (count - str.count);
test:
for (int i = offset + ((fromIndex < 0) ? 0 : fromIndex); i <= max ; i++) {
int n = str.count;
int j = i;
int k = str.offset;
while (n-- != 0) {
if (v1[j++] != v2[k++]) {
continue test;
}
}
return i - offset;
}
return -1;
}
Nota: Sólo se puede llamar a la sentencia continue desde dentro de un bucle.
Y finalmente la sentencia return. Esta sentencia se utiliza para salir del método actual
y volver a la sentencia siguiente a la que originó la llamada en el método original.
Existen dos formas de return: una que devuelve un valor y otra que no lo hace. Para
devolver un valor, simplemente se pone el valor (o una expresión que calcule el valor)
detrás de la palabra return:
return ++count;
El valor devuelto por return debe corresponder con el tipo del valor de retorno de la
declaración del método.
Cuando un método se declara como void utiliza la forma de return que no devuelve
ningún valor:
return;
Leer más »

Implementación de Métodos

0
Similarmente a la implementación de una clase, la implementación de un método consiste en dos
partes, la declaración y el cuerpo del método.
declaracióndeMétodo {
cuerpodeMétodo
}
La Declaración de Método
Una declaración de método proporciona mucha información sobre el método al
compilador, al sistema en tiempo de ejecución y a otras clases y objetos. Junto con el
nombre del método, la declaración lleva información como el tipo de retorno del
método, el número y el tipo de los argumentos necesarios, y qué otras clases y objetos
pueden llamar al método.
Los únicos elementos necesarios una declaración de método son el nombre y el tipo de
retorno del método. Por ejemplo, el código siguiente declara un método llamado
estaVacio() en la clase Pila que devuelve un valor booleano (true o false):
class Pila {
. . .
boolean estaVacio() {
. . .
}
}
Devolver un Valor desde un Método
Java necesita que un método declare el tipo de dato del valor que devuelve. Si un
método no devuelve ningún valor, debe ser declarado para devolver void (nulo).
Los métodos pueden devolver tipos de datos primitivos o tipos de datos de referencia. El
método estaVacio() de la clase Pila devuelve un tipo de dato primitivo, un valor
booleano:
class Pila {
static final int PILA_VACIA = -1;
Object[] stackelements;
int topelement = PILA_VACIA;
. . .
boolean estaVacio() {
if (topelement == PILA_VACIA)
return true;
else
return false;
}
}
Sin embargo, el método pop de la clase PILA devuelve un tipo de dato de referencia: un
objeto.
class Pila {
static final int PILA_VACIA = -1;
Object[] stackelements;
int topelement = PILA_VACIA;
. . .
Object pop() {
if (topelement == PILA_VACIA)
return null;
else {
return stackelements[topelement--];
}
}
}
Los métodos utilizan el operador return para devolver un valor. Todo método que no
sea declarado como void debe contener una sentencia return.
El tipo de dato del valor devuelto por la sentencia return debe corresponder con el tipo
de dato que el método tiene que devolver; no se puede devolver un objeto desde un
método que fue declarado para devolver un entero.
Cuando se devuelva un objeto, el tipo de dato del objeto devuelto debe ser una
subclase o la clase exacta indicada. Cuando se devuelva un tipo interface, el objeto
retornado debe implementar el interface especificado.
Un Nombre de Método
Un nombre de método puede ser cualquier indentificador legal en Java. Existen tres
casos especiales a tener en cuenta con los nombres de métodos:
Java soporta la sobrecarga de métodos, por eso varios métodos pueden compartir
el mismo nombre. Por ejemplo, supon que se ha escrito una clase que puede
proporcionar varios tipos de datos (cadenas, enteros, etc...) en un área de dibujo.
Se podría escribir un método que supiera como tratar a cada tipo de dato. En otros
lenguajes, se tendría que pensar un nombre distinto para cada uno de los
métodos. dibujaCadena(), dibujaEntero, etc... En Java, se puede utilizar el
mismo nombre para todos los métodos pasándole un tipo de parámetro diferente a
cada uno de los métodos. Entonces en la clase de dibujo, se podrán declarar tres
métodos llamados draw<() y que cada uno aceptara un tipo de parámetro
diferente:
class DibujodeDatos {
void draw(String s) {
. . .
}
void draw(int i) {
. . .
}
void draw(float f) {
. . .
}
}
Nota: La información que hay dentro de los paréntesis de la declaración son los
argumentos del método. Los argumentos se cubren en la siguiente página: Pasar
Información a un Método.
Los métodos son diferenciados por el compilador basándose en el número y tipo de
sus argumentos. Así draw(String s)y draw(int i) son métodos distintos y únicos.
No se puede declarar un método con la misma firma: draw(String s)y
draw(String t) son idénticos y darán un error del compilador.
Habrás observado que los métodos sobrecargados deben devolver el mismo tipo de
1.
dato, por eso void draw(String s) y int draw(String t) declarados en la misma
clase producirán un error en tiempo de compilación.
Todo método cuyo nombre sea igual que el de su clase es un constructor y tiene
una tarea especial que realizar. Los constructores se utilizan para inicializar un
objeto nuevo del tipo de la clase. Los constructores sólo pueden ser llamados con
el operador new. Para aprender cómo escribir un constructor, puedes ver Escribir
un Método Constructor.
2.
Una clase puede sobreescribir un método de sus superclases. El método que
sobreescribe debe tener el mismo, nombre, tipo de retorno y lista de parámetros
que el método al que ha sobreescrito. Sobreescribir Métodos te enseñará como
sobreescribir los métodos de una superclase.
3.
Caractersiticas Avanzadas de la Declaración de Métodos
Junto con los dos elementos necesarios, una declaración de método puede contener
otros elementos. Estos elementos declaran los argumentos aceptados por el método, si
el método es un método de clase, etc...
Juntándolo todo, una declaración de método se parecería a esto:
[especificadordeAcceso] [static] [abstract] [final] [native] [synchronized]
tipodeRetorno nombredelMétodo ([listadeparámetros]) [throws listadeExcepciones]
Cada uno de estos elementos de una declaración se cubre en alguna parte de este
tutorial.
Leer más »

Crear Objetos

0
En Java, se crea un objeto mediante la creacción de un objeto de una clase o, en
otras palabras, ejemplarizando una clase. Aprenderás cómo crear una clase más
adelante en Crear Clases. Hasta entonces, los ejemplos contenidos aquí crean
objetos a apartir de clases que ya existen en el entorno Java.
Frecuentemente, se verá la creacción de un objeto Java con un sentencia como
esta:
Date hoy = new Date();
Esta sentencia crea un objeto Date (Date es una clase del paquete java,util). Esta
sentencia realmente realiza tres acciones: declaración, ejemplarización e
inicialización. Date hoy es una declaración de variable que sólo le dice al
compilador que el nombre hoy se va a utilizar para referirse a un objeto cuyo tipo
es Date, el operador new ejemplariza la clase Date (creando un nuevo objeto
Date), y Date() inicializa el objeto.
Declarar un Objeto
Ya que la declaración de un objeto es una parte innecesaria de la
creacción de un objeto, las declaraciones aparecen frecuentemente en la
misma línea que la creacción del objeto. Como cualquier otra declaración
de variable, las declaraciones de objetos pueden aparecer solitarias como
esta:
Date hoy;
De la misma forma, declarar una variable para contener un objeto es
exactamente igual que declarar una variable que va a contener un tipo
primitivo:
tipo nombre
donde tipo es el tipo de dato del objeto y nombre es el nombre que va a
utilizar el objeto. En Java, las clases e interfaces son como tipos de
datos. Entonces tipo puede ser el nombre de una clase o de un interface.
Las declaraciones notifican al compilador que se va a utilizar nombre
para referirse a una variable cuyo tipo es tipo. Las declaraciones no
crean nuevos objetos. Date hoy no crea un objeto Date, sólo crea un
nombre de variable para contener un objeto Date. Para ejemplarizar la
clase Date, o cualquier otra clase, se utiliza el operador new.
Ejemplarizar una Clase
El operador new ejemplariza una clase mediante la asignación de
memoria para el objeto nuevo de ese tipo. new necesita un sólo
argumento: una llamada al método constructor. Los métodos
constructores son métodos especiales proporcionados por cada clase
Java que son reponsables de la inicialización de los nuevos objetos de
ese tipo. El operador new crea el objeto, el constructor lo inicializa.
Aquí tienes un ejemplo del uso del operador new para crear un objeto
Rectangle (Rectangle es una clase del paquete java.awt):
new Rectangle(0, 0, 100, 200);
En el ejemplo, Rectangle(0, 0, 100, 200) es una llamada al
constructor de la clase Rectangle.
El operador new devuelve una referencia al objeto recien creado. Esta
referencia puede ser asignada a una variable del tipo apropiado.
Rectangle rect = new Rectangle(0, 0, 100, 200);
(Recuerda que una clase escencialmente define un tipo de dato de
referencia. Por eso, Rectangle puede utilizarse como un tipo de dato en
los programas Java. El valor de cualquier variable cuyo tipo sea un tipo
de referencia, es una referencia (un puntero) al valor real o conjunto de
valores representado por la variable.
Inicializar un Objeto
Como mencioné anteriormente, las clases porporcionan métodos
constructores para incializar los nuevos objetos de ese tipo. Una clase
podría proporcionar múltiples constructores para realizar diferentes tipos
de inicialización en los nuevos objetos. Cuando veas la implementación
de una clase, reconocerás los constructores porque tienen el mismo
nombre que la clase y no tienen tipo de retorno. Recuerda la creacción
del objeto Date en el sección inicial. El constructor utilizado no tenía
ningún argumento:
Date()
Un constructor que no tiene ningún argumento, como el mostrado arriba,
es conocido como constructor por defecto. Al igual que Date, la mayoría
de las clases tienen al menos un constructor, el constructor por defecto.
Si una clase tiene varios constructores, todos ellos tienen el mismo
nombre pero se deben diferenciar en el número o el tipo de sus
argmentos. Cada constructor inicializa el nuevo objeto de una forma
diferente. Junto al constructor por defecto, la clase Date proporciona otro
constructor que inicializa el nuevo objeto con un nuevo año, mes y dia:
Date cumpleaños = new Date(1963, 8, 30);
El compilador puede diferenciar los constructores a través del tipo y del
número de sus argumentos.
Leer más »
 
arriba
free counters
Ir Arriba