1 Tutorial Java Basico de OZITO
1 Tutorial Java Basico de OZITO
Tutoriales Utilidades
● Expresiones Java
❍ Definicion de Expresión Patrocinados
❍ Precedencia de Operadores en Java
❍ Concatenación de Cadenas
❍ Inicializar un Objeto
❍ Un Nombre de Método
de Métodos
● Pasar Información a un Método
❍ Tipos de Argumentos
❍ Nombres de Argumentos
● El Cuerpo de un Método
❍ this
❍ super
❍ Variables Locales
❍ Protected
❍ Public
❍ Acceso de Paquete
● Constructores
● Escribir un Método finalize()
● Subclases, Superclases y Herencia
● Crear Subclases
❍ ¿Qué variables miembro hereda una subclase?
❍ Sobreescribir Métodos
● Sobreescribir Métodos
❍ Reemplazar la Implementación de un Método
de una Superclase
❍ Añadir Implementación a un Método de la
Superclase
❍ Métodos que una Subclase no Puede
Sobreescibir
❍ Métodos que una Subclase debe Sobreescribir
● La Clase Object
❍ El método equals()
❍ El método getClass()
❍ El método toString()
❍ Otros métodos de Object cubiertos en otras
lecciones o secciones
● ¿Qué es un Interface
❍ Los Interfaces No Proporcionan Herencia
Múltiple
● Definir un Interface
❍ La Declaración de Interface
● Utilizar un Interface
● Utilizar un Interface como un Tipo
● Crear Paquetes
❍ CLASSPATH
● Utilizar Paquetes
● Los Paquetes Java
❍ El Paquete de Lenguaje Java
❍ El Paquete Applet
Abstractas
● Cambios en el JDK 1.1 que afectan a Objetos, Clases e
Interfaces
● Cambios en el JDK 1.1: Clases Internas
● Cambios en el JDK 1.1: Cambios en los Paquetes Java
❍ Nuevos Paquetes java.*
❍ Crear un StringBuffer
● Métodos Accesores
❍ Más Métodos Accesores
● Modificar un StringBuffer
❍ Insertar Caracteres
❍ Seleccionar Caracteres
❍ El Método valueOf()
❍ Concatenación y el Operador +
❍ Nuevos métodos
❍ Convenciones
❍ Banderas
Seguridad
● Cambios en el JDK 1.1: Utilizar los Recursos del
Sistema
❍ Métodos Misceláneos del Sistema
❍ Nuevos métodos
Últimos comentarios
Últimos 5 comentarios
Tutoriales Utilidades
Servicios
Registro
¿Qué son las clases?
Buscador
Una CLASE es un proyecto, o prototipo, que define las variables
y los métodos comunes a un cierto tipo de objetos.
Un poco más sencillo: las clases son las matrices de las que
luego se pueden crear múltiples objetos del mismo tipo. La clase
define las variables y los métodos comunes a los objetos de ese
tipo, pero luego, cada objeto tendrá sus propios valores y
compartirán las mismas funciones.
¿Qué es la herencia?
Tutoriales Utilidades
Nombres de Variables
Un programa se refiere al valor de una variable por su nombre.
Por convención, en Java, los nombres de las variables empiezan
con una letra minúscula (los nombres de las clases empiezan
con una letra mayúscula).
Tutoriales Utilidades
Patrocinados
Los operadores que requieren dos operandos se llaman
operadores binarios. El operador = es un operador binario que
¡Colabora!
asigna un valor del operando derecho al operando izquierdo.
Envía código fuente
Envía una noticia
Añade una dirección Los operadores unarios en Java pueden utilizar la notación de
Publica un curso prefijo o de sufijo. La notación de prefijo significa que el operador
Publica un artículo aparece antes de su operando.
operando operador
Operadores Aritméticos
sumaEsto + aEsto
divideEsto % porEsto
Operadores de Desplazamiento
13 >> 1;
12 & 13
1101
& 1100
------
1100
Operadores de Asignación
i = i + 2;
i += 2;
x*y*z
x + y / 100
x + y / 100
es equivalente a.
x + (y / 100)
[] . (params) expr++
operadores sufijo
expr--
++expr --expr +expr -
operadores unarios
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
= <<= >>= >>>=
Patrocinados
Sentencias palabras clave
¡Colabora!
Envía código fuente toma de decisiones if-else, switch-case
Envía una noticia
Añade una dirección bucles for, while, do-while
Publica un curso
Publica un artículo excepciones try-catch-finally, throw
miscelaneas break, continue, label:, return
Ganamos
La sentencia if-else
if (expresión)
sentencia
...
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;
La sentencia switch
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;
}
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 dias 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;
}
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
while (expresión)
sentencia
...
while (System.in.read() != -1) {
contador++;
System.out.println("Se ha leido un el carácter = " + contador);
}
...
Además de while Java tiene otros dos constructores de bucles que puedes
utilizar en tus programas.
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.
do {
sentencias
} while (Expresión Booleana);
int c;
InputStream in;
...
do {
c = in.read();
...
} while (c != -1);
El método llamador puede utilizar las sentencias try, catch, y finally para
capturar y manejar la excepción.
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.
SaltaAqui: algunaSentenciaJava
break SaltaAqui;
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.
return ++count;
El valor devuelto por return debe corresponder con el tipo del valor de
retorno de la declaración del método.
return;
Arrays Patrocinados
¡Colabora! Esta sección te enseñará todo lo que necesitas para crear y utilizar arrays en tus
Envía código fuente programas Java.
Envía una noticia
Añade una dirección
Como otras variables, antes de poder utilizar un array primero se debe declarar.
Publica un curso
De nuevo, al igual que otras variables, la declaración de un array tiene dos
Publica un artículo
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
Ganamos 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;
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.
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.
Strings
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.
"Hola mundo!"
Los objetos String son inmutables - es decir, no se pueden modificar una vez que
han sido creados.
Concatenación de Cadenas
Dos de las cadenas concatenadas son cadenas literales: "La entrada tiene " y
" caracteres.". La tercera cadena - la del medio- es realmente un entero que
primero se convierte a cadena y luego se concatena con las otras.
Servicios
Registro Declarar un Objeto
Buscador
Ya que la declaración de un objeto es una parte innecesaria de
la creación de un objeto, las declaraciones aparecen
frecuentemente en la misma línea que la creación del objeto.
Como cualquier otra declaración de variable, las declaraciones
de objetos pueden aparecer solitarias como esta.
Date hoy;
tipo nombre
Aquí tienes un ejemplo del uso del operador new para crear un
objeto Rectangle (Rectangle es una clase del paquete java.awt).
Inicializar un Objeto
Date()
¡Colabora!
Envía código fuente 1. Manipular directamente las variables x e y del objeto.
Envía una noticia 2. Llamar el método move().
Añade una dirección
Publica un curso La opción 2 se considera "más orientada a objetos" y más
Publica un artículo segura porque se manipulan las variables del objeto
indirectamente a través de una capa protectora de métodos, en
vez de manejarlas directamente. Manipular directamente las
Ganamos
variables de un objeto se considera propenso a errores; se
podría colocar el objeto en un estado de inconsistencia.
objetoReferenciado.variable
objetoReferenciado.nombreMétodo(listaArgumentos);
o
objetoReferenciado.nombreMétodo();
rect.move(15, 37);
rect.x = 15;
rect.y = 37;
cubo.move(244, 47);
if (rect.inside(mouse.x, mouse.y)) {
...
// ratón dentro del rectángulo
...
} else {
...
// ratón fuera del rectángulo
...
}
rect.inside(mouse.x, mouse.y)
Recolector de Basura
Servicios
Registro El recolector de basura de Java es un barredor de marcas que
escanea dinámicamente la memoria de Java buscando objetos,
Buscador marcando aquellos que han sido referenciados. Después de
investigar todos los posibles paths de los objetos, los que no
están marcados (esto es, no han sido referenciados) se les
conoce como basura y son eliminados.
Finalización
Una clase es un proyecto o prototipo que se puede utilizar para crear muchos objetos. Patrocinados
La implementación de una clase comprende dos componentes: la declaración y el
¡Colabora! cuerpo de la clase.
Envía código fuente
Envía una noticia DeclaraciónDeLaClase {
Añade una dirección CuerpoDeLaClase
Publica un curso }
Publica un artículo
La Declaración de la Clase
Ganamos
Como mínimo, la declaración de una clase debe contener la palabra clave class y el
nombre de la clase que está definiendo. Así la declaración más sencilla de una clase se
parecería a esto.
class NombredeClase {
...
}
Servicios
Registro Por ejemplo, esta clase declara una nueva clase llamada NumeroImaginario.
Buscador
class NumeroImaginario {
...
}
Los nombres de las clases deben ser un identificador legal de Java y, por convención,
deben empezar por una letra mayúscula. Muchas veces, todo lo que se necesitará será
una declaración mínima. Sin embargo, la declaración de una clase puede decir más
cosas sobre la clase. Más especificamente, dentro de la declaración de la clase se
puede.
● declarar cual es la superclase de la clase.
● listar los interfaces implementados por la clase
● declarar si la clase es pública, abstracta o final
En Java, todas las clases tienen una superclase. Si no se especifica una superclase
para una clase, se asume que es la clase Object (declarada en java.lang). Entonces la
superclase de NumeroImaginario es Object porque la declaración no explicitó ninguna
otra clase. Para obtener más información sobre la clase Object, puede ver La clase
Object.
Por ejemplo, supon que quieres que la superclase de NumeroImaginario sea la clase
Number en vez de la clase Object. Se podría escribir esto.
Crear una subclase puede ser tan sencillo como incluir la clausula extends en su
declaración de clase. Sin embargo, se tendrán que hacer otras provisiones en su código
cuando se crea una subclase, como sobreescribir métodos. Para obtener más
información sobre la creación de subclases, puede ver Subclases, Superclases, y
Herencia.
Cuando se declara una clase, se puede especificar que interface, si lo hay, está
implementado por la clase. Pero, ¿Qué es un interface? Un interface declara un conjunto
de métodos y constantes sin especificar su implementación para ningún método.
Cuando una clase exige la implementación de un interface, debe proporcionar la
implementación para todos los métodos declarados en el interface.
Para declarar que una clase implementa uno o más interfaces, se debe utilizar la palabra
clave implements seguida por una lista de los interfaces implementados por la clase
delimitados por comas. Por ejemplo, imagina un interface llamado Aritmetico que define
los métodos llamados suma(), resta(), etc... La clase NumeroImaginario puede
declarar que implementa el interface Aritmetico de esta forma.
se debe garantizar que propociona la implementación para los métodos suma(), resta
() y demás métodos declarados en el interface Aritmetico. Si en NumeroImaginario falta
alguna implementación de los métodos definidos en Aritmetico, el compilador mostrará
un mensaje de error y no compilará el programa.
Observa que las firmas de los métodos declarados en el interface Aritmetico deben
corresponder con las firmas de los métodos implementados en la clase
NumeroImaginario. Tienes más información sobre cómo crear y utilizar interfaces en
Crear y Utilizar Interfaces.
Se puede utilizar uno de estos tres modificadores en una declaración de clase para
declarar que esa clase es pública, abstracta o final. Los modificadores van delante de la
palabra clave class y son opcionales.
El modificador public declara que la clase puede ser utilizada por objetos que estén
fuera del paquete actual. Por defecto, una clase sólo puede ser utilizada por otras clases
del mismo paquete en el que están declaradas.
El modificador abstract declara que la clase es una clase abstracta. Una clase
abstracta podría contener métodos abstractos (métodos sin implementación). Una clase
abstracta está diseñada para ser una superclase y no puede ejemplarizarse. Para una
discusión sobre las clases abstractas y cómo escribirlas puedes ver Escribir Clases y
Métodos Abstractos.
Utilizando el modificador final se puede declarar que una clase es final, que no puede
tener subclases. Existen (al menos) dos razones por las que se podría querer hacer
esto: razones de seguridad y razones de diseño. Para una mejor explicación sobre las
clases finales puedes ver Escribir Clases y Métodos Finales.
Observa que no tiene sentido para una clase ser abstracta y final. En otras palabras, una
clase que contenga métodos no implementados no puede ser final. Intentar declarar una
clase como final y abstracta resultará en un error en tiempo de compilación.
Los puntos entre [ y ] son opcionales. Una declaración de clase define los siguientes
aspectos de una clase.
● modificadores declaran si la clase es abstracta, pública o final.
● NombredeClase selecciona el nombre de la clase que está declarando
● NombredeSuperClase es el nombre de la superclase de NombredeClase
● NombredeInterface es una lista delimitada por comas de los interfaces
implementados por NombredeClase
De todos estos items, sólo la palabra clave class y el nombre de la clase son
necesarios. Los otros son opcionales. Si no se realiza ninguna declaración explícita para
los items opcionales, el compilador Java asume ciertos valores por defecto (una
subclase de Object no final, no pública, no obstracta y que no implementa interfaces).
DeclaracióndeClase {
DeclaracionesdeVariablesMiembros
DeclaracionesdeMétodos
}
Servicios
Registro Aquí tienes una pequeña clase que declara tres variables miembro
Buscador y un método.
class Ticket {
Float precio;
String destino;
Date fechaSalida;
void firma(Float forPrecio, String forDestino, Date forFecha) {
precio = forPrecio;
destino = forDestino;
fechaSalida = forFecha;
}
}
Una declaración mínima de variable miembro es como la declaración de variables que Patrocinados
se escribe en cualquier otro lugar de un programa Java, como las variables locales o
¡Colabora! los parámetros de los métodos. El siguiente código declara una variable miembro
Envía código fuente entera llamada unEntero dentro de la clase ClaseEnteros.
Envía una noticia
Añade una dirección
class ClaseEnteros {
Publica un curso
int unEntero;
Publica un artículo
...
// define los métodos aquí
Ganamos ...
}
Al igual que otras variables en Java, las variables miembro deben tener un tipo. Un tipo
de variable determina los valores que pueden ser asignados a las variables y las
Servicios operaciones que se pueden realizar con ellas. Ya deberías estar familiarizado con los
Registro tipos de datos en Java mediante la lectura de la lección anterior: Variables y Tipos de
Buscador Datos.
Un nombre de una variable miembro puede ser cualquier identificador legal de Java y
por convención empieza con una letra minúscula (los nombres de clase típicamente
empiezan con una letra mayúscula). No se puede declarar más de una variable con el
mismo nombre en la misma clase. Por ejemplo, el siguiente código es legal.
class ClaseEnteros {
int unEntero;
int unEntero() { // un método con el mismo nombre que una variable
...
}
}
Junto con el nombre y el tipo, se pueden especificar varios atributos para las variables
miembro cuando se las declara: incluyendo si los objetos pueden acceder a la variable,
si la variable es una variable de clase o una variable de ejemplar, y si la variable es una
constante.
Los puntos entre [ y ] son opcionales. Los items en negrita se deben reemplazar por
palabras clave o por nombres.
Declarar Constantes
Para crear una variable miembro constante en Java se debe utilizar la palabra clave
final en su declaración de variable. La siguiente declaración define una constante
llamada AVOGADRO cuyo valor es el número de Avogadro (6.023 x 10^23) y no puede
ser cambiado.
class Avo {
final double AVOGADRO = 6.023e23;
}
Por defecto, las variables miembro son una parte persistente del estado de un objeto,
Las variables que forman parte persistente del estado del objeto deben guardarse
cuando el objeto se archiva. Se puede utilizar la palabra clave transient para indicar
a la máquina virtual Java que la variable indicada no es una parte persistente del
objeto.
class TransientExample {
transient int hobo;
...
}
Este ejemplo declara una variable entera llamada hobo que no es una parte
persistente del estado de la claseTransientExample.
Si una clase contiene una variable miembro que es modificada de forma asíncrona,
mediante la ejecución de threads concurrentes, se puede utilizar la palabra clave
volatile de Java para notificar esto al sistema Java.
class VolatileExample {
volatile int contador;
...
}
Ganamos 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 para 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 {
Servicios ...
Registro boolean estaVacio() {
Buscador ...
}
}
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.
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.
Habrás observado que los métodos sobrecargados deben devolver el mismo tipo
de dato, por eso void draw(String s) e int draw(String t) declarados en la
misma clase producirán un error en tiempo de compilación.
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...
Cada uno de estos elementos de una declaración se cubre en alguna parte de este
tutorial.
Este método toma cuatro argumentos: la cantidad prestada, el interés, el valor futuro y el
número de meses. Los tres primeros son números de coma flotante de doble precisión y
el cuarto es un entero.
Al igual que este método, el conjunto de argumentos de cualquier método es una lista de
declaraciones de varibales delimitadas por comas donde cada declaración de variable es
un par tipo/nombre.
Servicios
Registro
Buscador tipo nombre
Como has podido ver en el ejemplo anterior, sólo tienes que utilizar el nombre del
argumento para referirte al valor del argumento.
Tipos de Argumentos
En Java, se puede pasar como argumento a un método cualquier tipo de dato válido en
Java. Esto incluye tipos primitivos, como enteros, dobles, etc.. y tipos de referencia como
arrays, objetos, etc...
Aquí tienes un ejemplo de un constructor que acepta un array como argumento. En este
ejemplo el constructor inicializa un objeto Polygon a partir de una lista de puntos (Point es
una clase del paquete java.awt que representa una coordenada xy).
Nombres de Argumentos
Un argumento de un método puede tener el mismo nombre que una variable de la clase.
En este caso, se dice que el argumento oculta a la variable miembro. Normalmente los
argumentos que ocultan una variable miembro se utilizan en los constructores para
inicializar una clase. Por ejemplo, observa la clase Circle y su constructor.
class Circle {
int x, y, radius;
public Circle(int x, int y, int radius) {
...
}
}
Los nombres de argumentos ocultan los nombres de las variables miembro. Por eso
utilizar x, y o radius dentro del cuerpo de la función, se refiere a los argumentos, no a
las variables miembro. Para acceder a las variables miembro, se las debe referenciar a
través de this--el objeto actual.
class Circle {
int x, y, radius;
public Circle(int x, int y, int radius) {
this.x = x;
this.y = y;
this.radius = radius;
}
}
Los nombres de los argumentos de un método no pueden ser el mismo que el de otros
argumentos del mismo método, el nombre de cualquier variable local del método o el
nombre de cualquier parámetro a una clausula catch() dentro del mismo método.
En los métodos Java, los argumentos son pasados por valor. Cuando se le llama, el
método recibe el valor de la variable pasada. Cuando el argumento es de un tipo
primitivo, pasar por valor significa que el método no puede cambiar el valor. Cuando el
argumento es del tipo de referencia, pasar por valor significa que el método no puede
cambiar el objeto referenciado, pero si puede invocar a los métodos del objeto y puede
modificar las variables accesibles dentro del objeto.
Consideremos esta serie de sentencias Java que intentan recuperar el color actual de un
objeto Pen en una aplicación gráfica.
...
int r = -1, g = -1, b = -1;
pen.getRGBColor(r, g, b);
System.out.println("red = " + r + ", green = " + g + ", blue = " + b);
...
Sin embargo, el sistema Java pasa los valores de las variables(-1) al método
getRGBColor(); no una referencia a las variables r, g, y b.
Cuando el control pasa dentro del método getRGBColor(), los argumentos entran
dentro del ámbito (se les asigna espacio) y son inicializados a los valores pasados al
método.
class Pen {
int valorRojo, valorVerde, valorAzul;
void getRGBColor(int rojo, int verde, int azul) {
// rojo, verde y azul han sido creados y sus valores son -1
...
}
}
Con esto getRGBColor() obtiene acceso a los valores de r, g, y b del llamador a tavés
de sus argumentos rojo, verde, y azul, respectivamente.
El método obtiene su propia copia de los valores para utilizarlos dentro del ámbito del
método. Cualquier cambio realizado en estas copias locales no sera reflejado en las
variables originales del llamador.
class Pen {
int valorRojo, valorVerde, valorAzul;
...
// Este método no trabaja como se espera
void getRGBColor(int rojo, int verde, int azul) {
rojo = valorRojo;
verde=valorVerde;
azul=valorAzul;
}
}
Este método no trabajará como se espera. Cuando el control llega a la sentencia println
() en el siguiente fragmento de código, los argumentos rojo, verde y azul de
getRGBColor() ya no existen. Por lo tanto las asignaciones realizadas dentro del
método no tendrán efecto; r, g, y b seguiran siendo igual a -1.
...
int r = -1, g = -1, b = -1;
pen.getRGBColor(r, g, b);
System.out.println("rojo = " + r + ", verde = " + g + ", azul = " + b);
...
El paso de las varibales por valor le ofrece alguna seguridad a los programadores: los
métodos no puede modificar de forma no intencionada una variable que está fuera de su
ámbito.
Sin embargo, alguna vez se querrá que un método modifique alguno de sus argumentos.
El metodo getRGBColor() es un caso apropiado. El llamador quiere que el método
devuelva tres valores a través de sus argumentos. Sin embargo, el método no puede
modificar sus argumentos, y, además, un método sólo puede devolver un valor a través
de su valor de retorno. Entonces, ¿cómo puede un método devolver más de un valor, o
tener algún efecto (modificar algún valor) fuera de su ámbito?
Para que un método modifique un argumento, debe ser un tipo de referencia como un
objeto o un array. Los objetos y arrays también son pasados por valor, pero el valor de un
objeto es una referencia. Entonces el efecto es que los argumentos de tipos de referencia
son pasados por referencia. De aquí el nombre. Una referencia a un objeto es la dirección
del objeto en la memoria. Ahora, el argumento en el método se refiere a la misma
posición de memoria que el llamador.
class RGBColor {
public int rojo, verde, azul;;
}
Ahora podemos reescribir getRGBColor() para que acepte un objeto RGBColor como
argumento. El método getRGBColor() devuelve el color actual de lápiz, en los valores
de las variables miembro rojo, verde y azul de su argumento RGBColor.
class Pen {
int valorRojo, valorVerde, valorAzul;
void getRGBColor(RGBColor unColor) {
unColor.rojo = valorRojo;
unColor.verde = valorVerde;
unColor.azul = valorAzul;
}
}
...
RGBColor penColor = new RGBColor();
pen.getRGBColor(penColor);
System.out.println("ojo = " + penColor.rojo + ", verde = " + penColor.verde + ",
azul = " + penColor.azul);
...
El objeto actual es el objeto del que uno de cuyos miembros está siendo
llamado. También se puede utilizar super para referirse a los miembros
de la superclase que el objeto actual haya ocultado mediante la
sobreescritura. Un cuerpo de método también puede contener
declaraciones de variables que son locales de ese método.
this
class HSBColor {
int hue, saturacion, brillo;
HSBColor (int luminosidad, int saturacion, int brillo) {
this.luminosidad = luminosidad;
this.saturacion = saturacion;
this.brillo = brillo;
}
}
También se puede utilizar this para llamar a uno de los métodos del
objeto actual. Esto sólo es necesario si existe alguna ambigüedad con el
nombre del método y se utiliza para intentar hacer el código más claro.
super
class MiClase {
boolean unaVariable;
void unMetodo() {
unaVariable = true;
}
}
y una subclase que oculta unaVariable y sobreescribe unMetodo().
super.unMetodo();
false
true
Variables Locales
Las variables de ejemplar están en constraste con las variables de clase (que se declaran utilizando el
¡Colabora! modificador static). El sistema asigna espacio para las variables de clase una vez por clase, sin importar el
Envía código fuente número de ejemplares creados de la clase. Todos los objetos creados de esta clase comparten la misma
Envía una noticia copia de las variables de clase de la clase, se puede acceder a las variables de clase a través de un ejemplar
Añade una dirección o a través de la propia clase.
Publica un curso
Publica un artículo
Los métodos son similares: una clase puede tener métodos de ejemplar y métodos de clase. Los métodos de
ejemplar operan sobre las variables de ejemplar del objeto actual pero también pueden acceder a las
Ganamos variables de clase. Por otro lado, los métodos de clase no pueden acceder a las variables del ejemplar
declarados dentro de la clase (a menos que se cree un objeto nuevo y acceda a ellos a través del objeto).
Los métodos de clase también pueden ser invocados desde la clase, no se necesita un ejemplar para llamar
a los métodos de la clase.
Por defecto, a menos que se especifique de otra forma, un miembro declarado dentro de una clase es un
miembro del ejemplar. La clase definida abajo tiene una variable de ejemplar -- un entero llamado x -- y dos
métodos de ejemplar -- x() y setX() -- que permite que otros objetos pregunten por el valor de x.
Cada vez que se ejemplariza un objeto nuevo desde una clase, se obtiene una copia de cada una de las
variables de ejemplar de la clase. Estas copias están asociadas con el objeto nuevo. Por eso, cada vez que
se ejemplariza un nuevo objeto UnEnteroLlamadoX de la clase, se obtiene una copia de x que está asociada
con el nuevo objeto UnEnteroLlamadoX.
Todos los ejemplares de una clase comparten la misma implementación de un método de ejemplar; todos los
ejemplares de UnEnteroLlamadoX comparten la misma implementación de x() y setX(). Observa que estos
métodos se refieren a la variable de ejemplar del objeto x por su nombre. "Pero, ¿si todos los ejemplares de
UnEnteroLlamadoX comparten la misma implementación de x() y setX() esto no es ambigüo?" La respuesta
es no. Dentro de un método de ejemplar, el nombre de una variable de ejemplar se refiere a la variable de
ejemplar del objeto actual (asumiendo que la variable de ejemplar no está ocultada por un parámetro del
método). Ya que, dentro de x() y setX(), x es equivalente a this.x.
Los objetos externos a UnEnteroLlamadoX que deseen acceder a x deben hacerlo a través de un ejemplar
particular de UnEnteroLlamadoX. Supongamos que este código estuviera en otro método del objeto. Crea
dos objetos diferentes del tipo UnEnteroLlamadoX, y selecciona sus valores de x a diferente valores y luego
lo muestra:
...
UnEnteroLlamadoX miX = new UnEnteroLlamadoX();
UnEnteroLlamadoX otroX = new UnEnteroLlamadoX();
miX.setX(1);
otroX.x = 2;
System.out.println("miX.x = " + miX.x());
System.out.println("otroX.x = " + otroX.x());
...
Observa que el código utilizado en setX() para seleccionar el valor de x para miX pero sólo asignando el
valor otroX.x directamente. De otra forma, el código manipula dos copias diferentes de x: una contenida en
el objeto miX y la otra en el objeto otroX. La salida producida por este código es.
miX.x = 1
otroX.x = 2
mostrando que cada ejemplar de la clase UnEnteroLlamadoX tiene su propia copia de la variable de ejemplar
x y que cada x tiene un valor diferente.
Cuando se declara una variable miembro se puede especificar que la variable es una variable de clase en
vez de una variable de ejemplar. Similarmente, se puede especificar que un método es un método de clase
en vez de un método de ejemplar. El sistema crea una sola copia de una variable de clase la primera vez que
encuentra la clase en la que está definida la variable. Todos los ejemplares de esta clase comparten la
misma copia de las variables de clase. Los métodos de clase sólo pueden operar con variables de clase -- no
pueden acceder a variables de ejemplar definidas en la clase.
Para especificar que una variable miembro es una variable de clase, se utiliza la palabra clave static. Por
ejemplo, cambiemos la clase UnEnteroLlamadoX para que su variable x sea ahora una variable de clase.
class UnEnteroLlamadoX {
static int x;
public int x() {
return x;
}
public void setX(int newX) {
x = newX;
}
}
Ahora veamos el mismo código mostrado anteriormente que crea dos ejemplares de UnEnteroLlamadoX,
selecciona sus valores de x, y muestra esta salida diferente.
miX.x = 2
otroX.x = 2
La salida es diferente porque x ahora es una variable de clase por lo que sólo hay una copia de la variable y
es compartida por todos los ejemplares de UnEnteroLlamadoX incluyendo miX y otroX.
Cuando se llama a setX() en cualquier ejemplar, cambia el valor de x para todos los ejemplares de
UnEnteroLlamadoX.
Las variables de clase se utilizan para aquellos puntos en los que se necesite una sola copia que debe estar
accesible para todos los objetos heredados por la clase en la que la variable fue declarada. Por ejemplo, las
variables de clase se utilizan frecuentemente con final para definir constantes (esto es más eficiente en el
consumo de memoria, ya que las constantes no pueden cambiar y sólo se necesita una copia).
Similarmente, cuando se declare un método, se puede especificar que el método es un método de clase en
vez de un método de ejemplar. Los métodos de clase sólo pueden operar con variables de clase y no pueden
acceder a las variables de ejemplar definidas en la clase.
Para especificar que un método es un método de clase, se utiliza la palabra clave static en la declaración
de método. Cambiemos la clase UnEnteroLlamadoX para que su variable miembro x sea de nuevo una
variable de ejemplar, y sus dos métodos sean ahora métodos de clase.
class UnEnteroLlamadoX {
private int x;
static public int x() {
return x;
}
static public void setX(int newX) {
x = newX;
}
}
Esto es porque los métodos de la clase no pueden acceder a variables de ejemplar a menos que el método
haya creado un ejemplar de UnEnteroLlamadoX primero y luego acceda a la variable a través de él.
Construyamos de nuevo UnEnteroLlamadoX para hacer que su variable x sea una variable de clase.
class UnEnteroLlamadoX {
static private int x;
static public int x() {
return x;
}
static public void setX(int newX) {
x = newX;
}
}
Ahora la clase se compilará y el código anterior que crea dos ejemplares de UnEnteroLlamadoX, selecciona
sus valores x, y muestra en su salida los valores de x.
miX.x = 2
otroX.x = 2
De nuevo, cambiar x a través de miX también lo cambia para los otros ejemplares de UnEnteroLlamadoX.
Otra diferencia entre miembros del ejemplar y de la clase es que los miembros de la clase son accesibles
desde la propia clase. No se necesita ejemplarizar la clase para acceder a los miembros de clase.
Reescribamos el código anterior para acceder a x() y setX() directamente desde la clase
UnEnteroLlamadoX.
...
UnEnteroLlamadoX.setX(1);
System.out.println("UnEnteroLlamadoX.x = " + UnEnteroLlamadoX.x());
...
Observa que ya no se tendrá que crear miX u otroX. Se puede seleccionar x y recuperarlo directamente
desde la clase UnEnteroLlamadoX. No se puede hacer esto con miembros del ejemplar. Solo se puede
invocar métodos de ejemplar a través de un objeto y sólo puede acceder a las variables de ejemplar desde
un objeto. Se puede acceder a las variables y métodos de clase desde un ejemplar de la clase o desde la
clase misma.
Ganamos En Java se pueden 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 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.
Private
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
}
}
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
Protected
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
}
}
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.
package Latin;
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 só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");
}
}
import Griego.*;
package Romano;
class Beta {
void metodoAccesor() {
Alpha a = new Alpha();
a.soyPublico = 10; // legal
a.metodoPublico(); // legal
}
}
Acceso de Paquete
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");
}
}
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
}
}
public Rectangle()
public Rectangle(int width, int height)
public Rectangle(int x, int y, int width, int height)
public Rectangle(Dimension size)
public Rectangle(Point location)
public Rectangle(Point location, Dimension size)
super("AnimationThread");
this.framesPerSecond = fps;
this.numImages = num;
super("AnimationThread");
private
Niguna otra clase puede crear un objeto de su clase.
protected
Sólo las subclases de la clase pueden crear ejemplares
de ella.
public
Cualquiera puede crear un ejemplar de la clase.
package-access
Nadie externo al paquete puede construir un ejemplar
de su clase.
Esto es muy útil si se quiere que las clases que
tenemos en un paquete puedan crear ejemplares de la
clase pero no se quiere que lo haga nadie más.
Patrocinados
protected void finalize () throws throwable
¡Colabora!
Envía código fuente Esta clase abre un fichero cuando se construye.
Envía una noticia
Añade una dirección
class AbrirUnFichero {
Publica un curso
FileInputStream unFichero = null;
Publica un artículo
AbrirUnFichero (String nombreFichero) {
try {
Ganamos unFichero = new FileInputStream(nombreFichero);
} catch (java.io.FileNotFoundException e) {
System.err.println("No se pudo abrir el fichero " + nombreFichero);
}
}
}
¡Colabora!
Las subclases heredan el estado y el comportamiento en forma
Envía código fuente
de las variables y los métodos de su superclase. La subclase
Envía una noticia
puede utilizar los ítems heredados de su superclase tal y como
Añade una dirección
son, o puede modificarlos o sobreescribirlos. Por eso, según se
Publica un curso va bajando por el árbol de la herencia, las clases se convierten
Publica un artículo en más y más especializadas.
Ganamos
Servicios
Registro
Buscador
Definición:
Patrocinados
class SubClass extends SuperClass {
¡Colabora! ...
Envía código fuente }
Envía una noticia
Añade una dirección Esto declara que SubClase es una subclase de SuperClase. Y
Publica un curso también declara implícitamene que SuperClase es la superclase
Publica un artículo de SubClase. Una subclase también hereda variables y
miembros de las superclases de su superclase, y así a lo largo
Ganamos del árbol de la herencia. Para hacer esta explicación un poco
más sencilla, cuando este tutorial se refiere a la superclase de
una clase significa el ancestro más directo de la clase así como
a todas sus clases ascendentes.
Una clase Java sólo puede tener una superclase directa. Java
no soporta la herencia múltiple.
Regla:
class Super {
Number unNumero;
}
class Sub extends Super {
Float unNumero;
}
La variable unNumero de Sub oculta a la variable unNumero
de Super. Pero se puede acceder a la variable de la superclase
utilizando.
super.unNumero
Regla:
Sobreescribir Métodos
Supongamos que queremos crear una subclase de la clase Windows del paquete
java.awt. La clase Windows tiene un constructor que requiere un argumento del tipo
Frame que es el padre de la ventana.
Este constructor realiza alguna inicialización en la ventana para que trabaje dentro
del sistema de ventanas. Para asegurarnos de que una subclase de Windows
también trabaja dentro del sistema de ventanas, deberemos proporcionar un
constructor que realice la misma inicialización.
Mucho mejor que intentar recrear el proceso de inicialización que ocurre dentro del
constructor de Windows, podríamos utilizar lo que la clase Windows ya hace. Se
puede utilizar el código del constructor de Windows llamámdolo desde dentro del
constructor de la subclase Window.
Para una explicación sobre los métodos finales, puedes ver: Escribir
Métodos y Clases Finales.
Diseño: Otra razón por la que se podría querer declarar una clase
Servicios final son razones de diseño orientado a objetos. Se podría pensar que
Registro una clase es "perfecta" o que, conceptualmente hablando, la clase no
Buscador debería tener subclases.
Para especificar que una clase es una clase final, se utiliza la palabra
clave final antes de la palabra clave class en la declaración de la
clase. Por ejemplo, si quisieramos declarar AlgoritmodeAjedrez como
una clase final (perfecta), la declaración se parecería a esto.
Métodos Finales
class AlgoritmodeAjedrez {
...
final void siguienteMovimiento(Pieza piezaMovida,
PosicionenTablero nuevaPosicion) {
}
...
}
Ganamos Para declarar que una clase es un clase abstracta, se utiliza la palabra clave
abstract en la declaración de la clase.
Métodos Abstractos
Una clase abstracta puede contener métodos abstractos, esto es, métodos que no
tienen implementación. De esta forma, una clase abstracta puede definir un
interface de programación completo, incluso porporciona a sus subclases la
declaración de todos los métodos necesarios para implementar el interface de
programación. Sin embargo, las clases abstractas pueden dejar algunos detalles o
toda la implementación de aquellos métodos a sus subclases.
Veamos un ejemplo de cuando sería necesario crear una clase abstracta con
métodos abstractos. En una aplicación de dibujo orientada a objetos, se pueden
dibujar círculos, rectángulos, líneas, etc.. Cada uno de esos objetos gráficos
comparten ciertos estados (posición, caja de dibujo) y comportamiento
(movimiento, redimensionado, dibujo). Podemos aprovecharnos de esas similitudes
y declararlos todos a partir de un mismo objeto padre-ObjetoGrafico.
Sin embargo, los objetos gráficos también tienen diferencias subtanciales: dibujar
un círculo es bastante diferente a dibujar un rectángulo. Los objetos gráficos no
pueden compartir estos tipos de estados o comportamientos. Por otro lado, todos
los ObjetosGraficos deben saber como dibujarse a sí mismos; se diferencian en
cómo se dibujan unos y otros. Esta es la situación perfecta para una clase
abstracta.
Primero se debe declarar una clase abstracta, ObjetoGrafico, para proporcionar las
variables miembro y los métodos que van a ser compartidos por todas las
subclases, como la posición actual y el método moverA().
Una clase abstracta no necesita contener un método abstracto. Pero todas las
clases que contengan un método abstracto o no proporcionen implementación para
cualquier método abstracto declarado en sus superclases debe ser declarada como
una clase abstracta.
Buscador Inicio > Tutoriales > Lenguajes orientados a objeto > Java > J2SE >
En nuestro sitio
TutorJava Nivel Básico
IR Tutoriales Utilidades
if (uno.equals(otroUno))
System.out.println("Los objetos son Iguales");
Servicios
Registro Este código mostrará Los objetos son Iguales aunque uno
y otroUno referencian a dos objetos distintos. Se les considera
Buscador iguales porque su contenido es el mismo valor entero.
El método getClass()
El método toString()
System.out.println(Thread.currentThread().toString());
System.out.println(new Integer(44).toString());
Thread[main,5,main]
4
El método toString() es muy útil para depuración y también
puede sobreescribir este método en todas las clases.
● notify()
● notifyAll()
● wait() (tres versiones)
¡Colabora!
Envía código fuente
Los interfaces se utilizan para definir un protocolo de
Envía una noticia
comportamiento que puede ser implementado por cualquier
Añade una dirección clase del árbol de clases.
Publica un curso
Publica un artículo
Los interfaces son útiles para.
Ganamos
● capturar similitudes entre clases no relacionadas sin
forzar una relación entre ellas.
● declarar métodos que una o varias clases necesitan
implementar.
● revelar el interface de programación de un objeto sin
recelar sus clases (los objetos de este tipo son llamados
objetos anónimos y pueden ser útiles cuando compartas
un paquete de clases con otros desarrolladores).
interface Contable {
...
}
Nota: Por convención, los nombres de interfaces empiezan con una letra
mayúscula al igual que las clases. Frecuentemente los nombres de
Servicios
interfaces terminan en "able" o "ible".
Registro
Buscador Una declaración de interface puede tener otros dos componentes: el
especificador de acceso public y una lista de "superinterfaces". Un
interface puede extender otros interfaces como una clase puede extender o
subclasificar otra case. Sin embargo, mientras que una clase sólo puede
extender una superclase, los interfaces pueden extender de cualquier
número de interfaces. Así, una declaración completa de interface se
parecería a esto.
Nota:
interface coleccion {
int MAXIMO = 500;
interface CellAble {
void draw();
void toString();
void toFloat();
}
class Linea {
private CellAble[] contents;
...
void setObjectAt(CellAble ca, int index) {
...
}
...
}
package graphics;
interface Draggable {
...
}
class Circle {
...
}
class Rectangle {
...
}
CLASSPATH
Nota:
Rectangle rect;
graphics.Rectangle rect;
Object
Ganamos
El abuelo de todas las clases--la clase de la que parten
todas las demás. Esta clase se cubrió anteriormene en
la lección La Clase Object.
Tipos de Datos Encubiertos
Una colección de clases utilizadas para encubrir
variables de tipos primitivos: Boolean, Character,
Double, Float, Integer y Long. Cada una de estas clases
es una subclase de la clase abstracta Number.
Strings
Servicios Dos clases que implementan los datos de caracteres.
Registro Las Clases String y StringBuffer es una lección donde
aprenderás el uso de estos dos tipos de Strings.
Buscador System y Runtime
Estas dos clases permiten a los programas utilizar los
recursos del sistema. System proporciona un interface
de programación independiente del sistema para
recursos del sistema y Runtime da acceso directo al
entorno de ejecución específico de un sistema. Utilizar
Recursos del Sistema Describe las clases System y
Runtime y sus métodos.
Thread
Las clases Thread, ThreadDeath y ThreadGroup
implementan las capacidades multitareas tan
importantes en el lenguaje Java. El paquete java.lang
también define el interface Runnable. Este interface es
conveniente para activar la clase Java sin subclasificar
la clase Thread. A través de un ejemplo de
aproximación Threads de Control te enseñará los
Threads Java.
Class
La clase Class proporciona una descripción en tiempo
de ejecución de una clase y la clase ClassLoader
permite cargar clases en los programas durante la
ejecución.
Math
Una librería de rutinas y valores matemáticos como pi.
Exceptions, Errors y Throwable
Cuando ocurre un error en un programa Java, el
programa lanza un objeto que indica qué problema era
y el estado del interprete cuando ocurrió el error. Sólo
los objetos derivados de la clase Throwable pueden ser
lanzados. Existen dos subclasses principales de
Throwable: Exception y Error. Exception es la forma que
deben intentar capturar los programas normales. Error
se utiliza para los errores catastróficos--los programas
normales no capturan Errores. El paquete java.lang
contiene las clases Throwable, Exception y Error, y
numerosas subclases de Exception y Error que
representan problemas específicos. Manejo de Errores
Utilizando Excepciones te muestra cómo utilizar las
excepciones para manejar errores en sus programas
Java.
Process
Los objetos Process representan el proceso del sistema
que se crea cuando se utiliza el sistema en tiempo de
ejecución para ejecutar comandos del sistema. El
paquete java.lang define e implementa la clase genérica
Process.
El Paquete Applet
El paquete AWT
El paquete java.awt proporciona elementos GUI
utilizados para obtener información y mostrarla en la
pantalla como ventanas, botones, barras de
desplazamiento, etc..
El paquete AWT Image
El paquete java.awt.image contiene clases e
interfaces para manejar imágenes de datos, como la
selección de un modelo de color, el cortado y pegado, el
filtrado de colores, la selección del valor de un pixel y la
grabación de partes de la pantalla.
El paquete AWT Peer
El paquete java.awt.peer contiene clases e
interfaces que conectan los componentes AWT
independientes de la plataforma a su implementación
dependiente de la plataforma (como son los controles
de Microsoft Windows ).
¡Colabora!
Envía código fuente
El Paquete java.lang Se han añadido tres clases al paquete
Envía una noticia java.lang. Puedes ver Cambios en el JDK 1.1: el paquete java.
Añade una dirección lang.
Publica un curso
Publica un artículo
El paquete java.io Se han añadido nuevas clases al paquete
java.io para soportar la lectura y escritura de caracteres de 16
Ganamos Bits Unicode. Puedes ver Cambios en el JDK 1.1: el paquete
java.io.
Servicios
Registro
Buscador Inicio > Tutoriales > Lenguajes orientados a objeto > Java > J2SE >
En nuestro sitio
TutorJava Nivel Básico
IR Tutoriales Utilidades
● java.awt.peer
Servicios
Registro
Buscador Inicio > Tutoriales > Lenguajes orientados a objeto > Java > J2SE >
En nuestro sitio
TutorJava Nivel Básico
IR Tutoriales Utilidades
¡Colabora!
Envía código fuente
Envía una noticia
Añade una dirección
Publica un curso
Publica un artículo
Ganamos
Servicios
Registro
Buscador Inicio > Tutoriales > Lenguajes orientados a objeto > Java > J2SE >
En nuestro sitio
TutorJava Nivel Básico
IR Tutoriales Utilidades
Servicios
Registro
Buscador Inicio > Tutoriales > Lenguajes orientados a objeto > Java > J2SE >
En nuestro sitio
TutorJava Nivel Básico
IR Tutoriales Utilidades
Crear un String
"Hola Mundo."
Crear un StringBuffer
StringBuffer(int length)
Los métodos utilizados para obtener información de un objeto son conocidos como
métodos accesores. El método reverseIt() utiliza dos métodos accesores de
String para obtener información sobre el string source.
Servicios
Registro Primero utiliza el método accesor: length() para obtener la longitud de la cadena
Buscador source.
source.charAt(i)
Además de los accesores length() y charAt() que hemos visto antes, la clase
String proporciona dos accesores que devuelven la posición dentro de una cadena de
un carácter específico: indexOf() y lastIndexOf(). El método indexOf() busca
empezando desde el principio de la cadena y lastIndexOf() busca empezando
desde el final.
Nota: Estos métodos no dan ningún error de chequeo y asumen que el argumento
contiene un path completo con nombres de directorios y un nombre de fichero con
extensión. Si estos métodos se utilizaran en algún programa deberían comprobar que
los argumentos estuvieran construidos de forma apropiada.
class NombreFichero {
String path;
char separador;
String extension() {
int punto = path.lastIndexOf('.');
return path.substring(punto + 1);
}
String NombreFichero() {
int punto = path.lastIndexOf('.');
int sep = path.lastIndexOf(separador);
return path.substring(sep + 1, punto);
}
String path() {
int sep = path.lastIndexOf(separador);
return path.substring(0, sep);
}
}
Aquí hay un pequeño programa que construye un objeto NombreFichero y llama a
todos sus métodos.
class NombreFicheroTest {
public static void main(String[] args) {
NombreFichero miHomePage = new NombreFichero("/home/index.html", '/');
System.out.println("Extension = " + miHomePage.extension());
System.out.println("Nombre de Fichero = " + miHomePage.NombreFichero());
System.out.println("Path = " + miHomePage.path());
}
}
Extension = html
NombreFichero = index
Path = /home
Mientras los méodos del ejemplo anterior sólo utilizan una versión del método
lastIndexOf(), la clase String realmente soporta cuatro diferentes versiones de los
métodos indexOf() y lastIndexOf(). Las cuatro versiones trabajan de la siguiente
forma.
indexOf(int character)
lastIndexOf(int character)
Devuelve el índice de la primera (o última) ocurrencia del carácter
especificado.
indexOf(int character, int from)
lastIndexOf(int character, int from)
Devuelve el índice de la primera (o última) ocurrencia del carácter
escpecificado desde el índice especificado.
indexOf(String string)
lastIndexOf(String string)
Devuelve el índice de la primera (o última) ocurrencia de la Cadena
especificada.
indexOf(String string, int from)
lastIndexOf(String string, int from)
Devuelve el índice de la primera (o última) ocurrencia de la cadena
escpecificada desde el índice especificado.
class ReverseString {
public static String reverseIt(String source) {
int i, len = source.length();
StringBuffer dest = new StringBuffer(len);
Insertar Caracteres
Seleccionar Caracteres
return dest.toString();
Servicios
Registro Todas las clases heredan toString() desde la clase Object y
Buscador muchas clases del paquete java.lang sobreescriben este método
para proporcionar una implementación más acorde con la propia
clase. Por ejemplo, las clases Character, Integer, Boolean, etc..
sobreescriben toString() para proporcionar una representación
en String de los objetos.
El Método valueOf()
System.out.println(String.valueOf(Math.PI));
System.out.println("Hola Mundo!");
Ganamos
También se pueden utilizar los métodos de String directamente desde una cadena
literal.
Como el compilador crea automáticamente un nuevo objeto String para cada cadena
literal que se encuentra, se puede utilizar una cadena literal para inicializar un String.
Servicios
Registro String s = "Hola Mundo";
Buscador
El constructor anterior es equivalente pero mucho más eficiente que este otro, que crea
dos objetos String en vez de sólo uno.
Esto decepciona un poco porque, como ya se sabe, los Strings no puden modificarse.
Sin embargo detrás de la escena el compilador utiliza StringBuffer para implementar la
concatenación. El ejemplo anterior se compilaría de la siguiente forma.
También se puede utilizar el operador + para añadir valores a una cadena que no son
propiamente cadenas.
Métodos
Alternativas
Obsoletos
String(byte[]) o
String(byte[], int)
String(byte[], String)
Servicios
Registro
Buscador
String(byte[], int,
String(byte[],
int) o String(byte[],
int, int, int)
int, int, String)
byte[] getBytes
getBytes(int,
(String) o byte[]
int, byte[], int)
getBytes()
Nuevos métodos
String(byte[])
String(byte[], int, int)
String(byte[], String)
String(byte[], int, int, String)
byte[] getBytes(String)
byte[] getBytes()
String toLowerCase(Locale)
String toUpperCase(Locale)
Ganamos
Servicios
Registro
Buscador Inicio > Tutoriales > Lenguajes orientados a objeto > Java > J2SE > TutorJava
En nuestro sitio Nivel Básico
IR Tutoriales Utilidades
...
// selecciona las propiedades por defecto
Properties defaultProps = new Properties();
FileInputStream defaultStream = new FileInputStream("defaultProperties");
defaultProps.load(defaultStream);
defaultsStream.close();
getProperty() (2 versiones)
Devuelve el valor de la propiedad especificada. Una versión permite
un valor por defecto, si no se encuentra la clase, se devuelve el valor
por defecto.
list()
Escribe todas las propiedades en el canal especificado. Esto es útil
para depuración.
propertyNames()
Devuelve una lista con todas las claves contenidas en el objeto
Properties.
Consideraciones de Seguridad:
¡Colabora!
Cuando llama a una aplicación, el usuario teclea los argumentos
Envía código fuente
de la línea de comandos después del nombre de la aplicación.
Envía una noticia
Supongamos, por ejemplo, que existe una aplicación Java,
Añade una dirección
llamada Sort, que ordena las líneas de un fichero, y que los
Publica un curso datos que se quiere ordenar están en un fichero llamado
Publica un artículo friends.txt. Si estuvieramos utilizando Windows 95/NT,
llamaría a la aplicación Sort con su fichero de datos de la
Ganamos siguiente forma.
class Echo {
public static void main (String[] args) {
for (int i = 0; i < args.length; i++)
System.out.println(args[i]);
}
}
Convenciones
¡Colabora! Además, una aplicación debe observar las siguientes convenciones para utilizar los
Envía código fuente
argumentos de la línea de comandos en Java.
Envía una noticia
Añade una dirección
Publica un curso ● El guión ( - ) precede a las opciones, banderas o series de banderas.
Publica un artículo ● Los argumentos pueden ir en cualquier orden, excepto cuando sea un argumento
que requiere otros argumentos.
● Las banderas pueden listarse en cualquier orden, separadamente o combinadas.
Ganamos
Se pueden utilizar sentencias como esta para comprobar los argumentos de palabras.
if (argument.equals("-verbose"))
vflag = true;
Esta sentencia comprueba si la palabra -verbose está en la línea de argumentos y activa una
bandera en el programa para que este se ejecute en modo verboso.
Argumentos que Requieren Argumentos
Algunos argumentos necesitan más informaión. Por ejemplo, un argumento como -output
podría permitir que el usuario redirigiera la salida del programa. Sin embargo, la opción -
output en solitario no ofrece la información suficiente a la aplicación: ¿Cómo sabe la
aplicación dónde redirigir la salida? Por lo tanto el usuario debe especificar también un
nombre de fichero. Normalmente, el ítem siguiente de la línea de comandos proporciona la
información adicional para el argumento que así lo requiere. Se puede utilizar la siguiente
sentencia para emparejar argumentos que requieren argumentos.
if (argument.equals("-output")) {
if (nextarg < args.length)
outputfile = args[nextarg++];
else
System.err.println("-output requiere un nombre de fichero");
}
Banderas
Lss banderas son carácteres que modifican el comportamieneo del programa de alguna
manera. Por ejemplo, la bandera -t proporcionada al comando ls de UNIX indica que la
salida debe ordenarse por la fecha de los ficheros. La mayoría de las aplicaciones permiten
al usuario especificar banderas separadas en cualquier orden.
-x -n o -n -x
Además, para hacer un uso más sencillo, las aplicciones deberán permitir que el usuario
concatene banderas y las especifique en cualquier orden.
-nx o -xn
Ganamos
Servicios
Registro
Buscador Inicio > Tutoriales > Lenguajes orientados a objeto > Java > J2SE >
En nuestro sitio
TutorJava Nivel Básico
IR Tutoriales Utilidades
Ganamos
Servicios
Registro
Buscador Inicio > Tutoriales > Lenguajes orientados a objeto > Java > J2SE >
En nuestro sitio
TutorJava Nivel Básico
IR Tutoriales Utilidades
¡Colabora!
Envía código fuente
Para utilizar una variable de clase, se usa directamente desde el
nombre de la clase utilizando la notación de punto ('.') de Java.
Envía una noticia
Por ejemplo, para referirse a la variables out de la clase
Añade una dirección
System, se añade el nombre de la variable al nombre de la clase
Publica un curso
separados por un punto. Así.
Publica un artículo
System.out
Ganamos
System.getProperty(argument);
class UserNameTest {
public static void main(String[] args) {
String name;
name = System.getProperty("user.name");
System.out.println(name);
}
}
System.out.print("Duke no es un Pingüino!\n");
es equivalente a esto
System.out.println("Duke no es un Pingüino!");
System.out.println(objectData);
System.out.println(stringData);
System.out.println(charArrayData);
System.out.println(integerData);
System.out.println(longData);
System.out.println(floatData);
System.out.println(doubleData);
System.out.println(booleanData);
}
}
Thread[Thread-4,5,main]
Java Mania
abc
4
-9223372036854775808
3.40282e+38
3.14159
true
ThreadClass[nombre,prioridad,grupo]
Aquí tiene una lista completa de las propiedades del sistema que puede obtener el Patrocinados
sistema cuando arranca y lo que significan.
¡Colabora!
Envía código fuente
Envía una noticia Clave Significado Acceden los Applets
Añade una dirección ------------------- ------------------------------ -------------
Publica un curso "file.separator" File separator (e.g., "/") si
Publica un artículo
"java.class.path" Java classpath no
"java.class.version" Java class version number si
Ganamos "java.home" Java installation directory no
"java.vendor" Java vendor-specific string si
"java.vendor.url" Java vendor URL si
"java.version" Java version number si
Los programas Java pueder leer o escribir las propiedades del sistema a través de
varios métodos de la clase System. Se puede utilizar una clave para buscar una
propiedad en la lista de propiedades, o se puede obtener el conjunto completo de
propiedades de una vez. También se puede cambiar el conjunto de propiedades
completamente.
Consideraciones de Seguridad:
La clase System tiene dos métodos que se pueden utilizar para leer las propiedades
del sistema: getProperty() y getProperties.
System.getProperty("path.separator");
Lo que nos lleva a la siguiente versión de getProperty(). Esta versión requiere dos
argumentos String: el primer argumento es la clave que buscamos y el segundo es el
valor por defecto devuelto si la clave no se encuentra o no tiene ningún valor. Por
ejemplo, esta llamada a getProperty() busca la propiedad del sistema llamada
subliminal.message.
Esto no es una propiedad válida del sistema, por lo que en lugar de devolver null, este
método devolverá el valor proporcionado por el segundo argumento: "Compra Java
ahora".
El último método proporcionado por la clase System para accer a los valores de las
propiedades es el método getProperties() que devuelve Propiedad un objeto que
contiene el conjunto completo de las propiedades del sistema. Se pueden utilizar varios
métodos de la clase Propierties para consultar valores específicos o para listar el
conjunto completo de propiedades. Para más información sobre la clase Propierties,
puedes ver Seleccionar y utilizar Propiedades.
import java.io.FileInputStream;
import java.util.Properties;
class PropertiesTest {
public static void main(String[] args) {
try {
// selecciona el nuevo objeto propierties a partir de "myProperties.txt"
FileInputStream propFile = new FileInputStream("myProperties.txt");
Properties p = new Properties(System.getProperties());
p.load(propFile);
Observa que el programa de ejemplo crea un objeto Properties, p, que se utiliza como
argumento para setProperties().
Observa también que las propiedades del sistema se pueden sobreescribir! Por
ejemplo, si myProperties.txt contiene la siguiente línea, la propiedad del sistema
java.vendor será sobreescrita.
Servicios System.runFinalization();
Registro
Buscador Este método llama a los métodos finalize() de todos los
objetos que están esperando para ser recolectados.
System.gc();
class Prueba {
public static void main(String[] args) {
byte[] copiaDesde = { 'd', 'e','s', 'c', 'a', 'f', 'e', 'i', 'n', 'a', 'd', 'o' };
byte[] copiaA = new byte[7];
Observa que el array de destino debe ser asignado antes de llamar a arraycopy() y debe ser lo
suficientemente largo para contener los datos copiados.
El método currentTimeMillis() devuelve la hora actual en milisegundos desde las 00:00:00 del 1
de Enero de 1970. Este método se utiliza comunmente en pruebas de rendimiento; obtener la hora
actual, realizar la operación que se quiere controlar, obtener de nuevo la hora actual--la diferencia
entre las dos horas es el tiempo que ha tardado en realizarse la operación.
En interfaces gráficos de usuarios el tiempo entre dos pulsaciones del ratón se utiliza para
determinar su el usuario ha realizado un doble click. El siguiente applet utiliza currentTimeMillis
() para calcular el número de milisegundos entre los dos clicks del ratón. Si el tiempo entre los dos
clicks es menor de 200 milisegundos, los dos clicks de ratón se interpretan como un doble click.
import java.awt.*;
Se podría utilizar el valor devuelto por este método para calcular la hora y fecha actuales. Sin
embargo, encontrarás más conveniente obtener la hora y fecha actuales desde la clase Date del
paquete java.util.
Para salir del intérprete Java, llama al método System.exit(). Debes pasarle un código de salida
en un entero y el interprete saldrá con ese código de salida.
System.exit(-1);
Nota: El método exit() hace salir del intérprete Java, no sólo del programa Java-- ten cuidado
cuando utilice está función.
Consideraciones de Seguridad:
El controlador de seguridad es un objeto que refuerza cierta vigilancia de seguridad para una
aplicación Java. Se puede seleccionar el controlador de seguridad actual para una aplicación
utilizando el método setSecurityManager() de la clase System, y se puede recuperar el
controlador de seguridad actual utilizando el método getSecurityManager().
Consideraciones de Seguridad:
¡Colabora!
Finalizar Objectos El nuevo método
Envía código fuente
Envía una noticia runFinalizersOnExit, de la clase System permite
Añade una dirección
seleccionar si los finalizadores son llamados cuando tu
Publica un curso
programa finalice. Puedes ver Cambios en el JDK 1.1: La clase
Publica un artículo System.
Patrocinados
Métodos
Alternativa
¡Colabora! Eliminados
Envía código fuente
Envía una noticia getenv(String) getProperty(String)
Añade una dirección
Publica un curso
Publica un artículo
El método getenv ha estado fuera de uso desde hace varias
versiones del JDK. La versión 1.1 formaliza este cambio,
eliminado el método. Los programadores deberían utilizar
Ganamos Properties para almacenar información entre invocaciones de
un programa. Seleccionar y utilizar Properties explica como
utilizar la clase Properties y Manejar datos Sensibles a la
Localización muestra cómo utilizar las propiedades para ayudar
a la internacionalización de tus programas Java.
Nuevos métodos
Para ver más detalles sobre estos y otros cambios en el AWT puedes ver
la página Cambios en el GUI: el AWT Crece.