JAVA3
JAVA3
Vamos a ver como utilizar printf para dar formato a los datos que se imprimen por
pantalla en Java.
Este problema se nos plantea por ejemplo cuando queremos mostrar un número de
tipo float o double con un número determinado de decimales y no con los que por
defecto muestra Java.
A partir de la versión Java 5 se incorporan los métodos format y printf que permiten
aplicar un formato a la salida de datos por pantalla.
Ambos realizan la misma función, tienen exactamente el mismo formato y emulan
la impresión con formato printf() de C.
Comprobamos que printf realiza un redondeo para mostrar los decimales indicados.
Lo más común será que tengamos el valor en una variable, en ese caso si
queremos escribir el valor de n con tres decimales:
double n = 1.25036;
[Link]("%.3f%n", n);
Salida:
1,250
Para mostrar el signo + en un número positivo:
double n = 1.25036;
[Link]("%+.3f %n", n);
Salida:
+1.250
Para mostrar varias variables pondremos tantos % como valores vamos a mostrar.
Las variables se escriben a continuación de las comillas separadas por comas:
double n = 1.25036;
int x = 10;
[Link]("n = %.2f x = %d %n", n, x);
Salida:
n = 1,25 x = 10
Cuando hay varias variables podemos indicar de cual de ellas es el valor a mostrar
escribiendo 1$, 2$, 3$, ... indicando que el valor a mostrar es el de la primera
variable que aparece a continuación de las comillas, de la segunda, etc.
La instrucción anterior la podemos escribir así:
[Link]("n = %1$.2f x = %2$d %n", n, x);
Salida:
El cuadrado de 123,46 es 15241,56
printf permite mostrar valores con un ancho de campo determinado. Por ejemplo, si
queremos mostrar el contenido de n en un ancho de campo de 10 caracteres
escribimos:
double n = 1.25036;
[Link]("%+10.2f %n", n);
Salida:
bbbbb+1.25
Donde cada b indica un espacio en blanco.
El 10 indica el tamaño en caracteres que ocupará el número en pantalla. Se
cuentan además de las cifras del número el punto decimal y el signo si lo lleva. En
este caso el número ocupa un espacio de 5 caracteres (3 cifras, un punto y el
signo) por lo tanto se añaden 5 espacios en blanco al principio para completar el
tamaño de 10.
[Link]("%10.2f", precio);
Salida:
bbbbbb1.22
(el carácter b indica un espacio en blanco)
[Link]("%-10s", "Total:");
Salida:
Total:bbbb
[Link]("%10s", "Total:");
Salida:
bbbbTotal:
Especificadores de formato:
%[posición_dato$][indicador_de_formato][ancho]
[.precision]carácter_de_conversión
Salida:
1.0/3.0 = 0,333
1.0/3.0 = 0,33333
1.0/2.0 = 00000,500
1000/3.0 = 3,3e+02 h
3.0/4567.0 = 6,569e-04
-1.0/0.0 = -Infinity
0.0/0.0 = NaN
pi = 3,142, e = 2,7183
C = 2 * 3,14159 * 1,1, A = 1,1 * 1,1 * 3,14159
Javac [Link]
Expresiones y sentencias
Las expresiones permiten combinar datos y operadores para calcular otros datos, es decir,
obtener un resultado.
Un operador es un símbolo que determina la operación a realizar sobre los operandos (datos) a
los que afecta.
Una sentencia es un conjunto de expresiones que permiten ejecutar una determinada acción.
En java las sentencias simples se caracterizan por terminar con el signo de puntuación ;.
(x + 3)*2 // expresión
a > b && c < d // expresión
int x; // sentencia
y = (x + 3)*2; // sentencia
Ahora que ya entiende las variables y los operadores es el momento de aprender lo que son las
expresiones, las sentencias y los bloques. Los operadores se utilizan para construir expresiones que
calculan valores; las expresiones son los componentes centrales de las sentencias; las sentencias se
pueden agrupar en bloques.
Expresiones
Una expresión es una construcción hecha de variables, operadores e invocaciones de métodos, creados
según la sintaxis del lenguaje, que evalúa a un solo valor. Ya hemos visto ejemplos de expresiones,
ilustradas en negrita a continuación:
int cadence = 0;
anArray[0] = 100;
[Link]("Elemento 1 en el índice 0: " + anArray[0]);
El tipo de dato del valor devuelto por una expresión depende de los elementos utilizadas en ella. La
expresión cadence = 0 devuelve un int porque el operador de asignación devuelve un valor del
mismo tipo de dato que el operando de su izquierda; en este caso cadence es un int. Como puede
observar en los demás ejemplos, una expresión puede devolver también otro tipo de datos, por ejemplo
boolean o String.
1 * 2 * 3
x + y / 100 // ambíguo
Puede indicar exáctamente cómo se debe evaluar una expresión mediante el uso de paréntesis:
( y ). Para eliminar la ambigüedad de la expresión anterior se podría escribir de la siguiente
forma:
x + y / 100
x + (y / 100) // no ambíguo, recomendado
Sea explícito al escribir expresiones compuestas e indique con paréntesis qué operadores se
deben evaluar primero. Esta práctica hará que su código sea más fácil de leer y mantener.
Sentencias
Las sentencias son, a grandes rasgos, equivalentes a las oraciones del lenguaje natural. Una sentencia
forma una unidad de ejecución completa. Los siguientes tipos de expresiones se pueden convertir en
sentencia si se terminan con punto y coma ( ;).
Expresiones de asignación
Cualquier uso de code>++ o --
Invocaciones de métodos
Expresiones de creación de objetos
Este tipo de sentencias se llaman sentencias de expresión. Veamos algunos ejemplos de sentencias de
expresión.
unValor = 8933.234; // sentencia de asignación
unValor++; // sentencia de incremento
[Link]("¡Hola Mundo!"); // sentencia de invicación de método
Bicycle miBici = new Bicycle(); // sentencia de creación de objeto
Hay dos otros tipo de sentencias además de las de expresión: sentencias de declaración y sentencias de
control de flujo. Una sentencia de declaración declara una variable. Ya hemos visto muchos ejemplos de
sentencias de declaración:
Finalmente, las sentencias de control de flujo regulan el orden en el que se ejecutan las sentencias.
Aprenderá más acerca de las sentencias de control de flujo en la siguiente sección, Sentencias de control
de flujo
Bloques
Un bloque es un grupo de sentencias contenido entre corchetes emparejados que se puede utilizar en
cualquier lugar en el que se permita una sentencia sencilla. El siguiente ejemplo, BlockDemo, ilustra el
uso de bloques:
class BlockDemo {
public static void main(String[] args) {
boolean condition = true;
if (condition) { // empieza el bloque 1
[Link]("Condition es verdadero.");
} // fin del bloque one
else { // empieza el bloque 2
[Link]("Condition es falso.");
} // fin del bloque 2
}
}
Preguntas
Ejercicios
unValor = 8933.234;
unValor++;
[Link]("¡Hola Mundo!");
Bicycle miBici = new Bicycle();
+-*/=%&#!?^“‘~\|<>()[]{}:;.,
Separadores:
o espacio
o tabulador
o salto de línea
Secuencias de escape
Una secuencia de escape esta formada por una barra inversa seguida de una letra, un
carácter o de una combinación de dígitos.
Una secuencia de escape siempre representa un solo carácter aunque se
escriba con dos o más caracteres.
Se utilizan para realizar acciones como salto de línea o para usar caracteres
no imprimibles.
Algunas secuencias de escape definidas en Java son:
Secuencia
de escape
Descripción
\n Salto de línea. Sitúa el cursor al principio de la línea siguiente
\b Retroceso. Mueve el cursor un carácter atrás en la línea actual.
Tabulador horizontal. Mueve el cursor hacia adelante una distancia
\t
determinada por el tabulador.
\r Ir al principio de la línea. Mueve el cursor al principio de la línea actual.
\f Nueva página. Mueve el cursor al principio de la siguiente página.
\" Comillas. Permite mostrar por pantalla el caracter comillas dobles.
\' Comilla simple. Permite mostrar por pantalla el carácter comilla simple.
\\ Barra inversa.
\udddd Carácter Unicode. d representa un dígito hexadecimal del caracter Unicode.
\s Caracter espacio en blanco
Ejemplo 3: Uso de la secuencia de escape \b. Provoca que el cursor retroceda un carácter.
[Link]("Lunes\bMartes");
Salida por pantalla:
LuneMartes
Ejemplo 4: Uso de la secuencia de escape \t. Provoca que el cursor avance una distancia
determinada.
[Link]("Lunes\tMartes\tMiércoles");
Salida por pantalla:
Lunes Martes Miércoles
Ejemplo 5: Uso de las secuencias de escape \" y \'. Permite mostrar estos caracteres por pantalla.
[Link]("\"Lunes\",\"Martes\",\'Miércoles\'");
Salida por pantalla:
"Lunes","Martes",'Miércoles'
Este método, en principio, no permite cambiar el color de lo que se emite por pantalla. Todo se
ve con el color predeterminado que tengamos, generalmente blanco (o gris claro) sobre fondo
negro, algo así:
Sin embargo, cuando estamos creando una herramienta de línea de comandos nos puede resultar
muy útil emplear otros colores para destacar cosas. Por ejemplo, usar el color rojo cuando se
produzca una excepción y queramos avisar de ello tras haberla controlado, o el verde para
cuando se lleve a cabo una tarea con éxito.
Nota: este tipo de usos del color para marcar significados no es accesible y por tanto no son
apropiados si queremos que los puedan usar usuarios con problemas de visión, como por ejemplo
los daltónicos que no distinguen entre rojo y verde. Asegúrate de que además de los colores
utilizas algo más en el propio texto (mayúsculas, símbolos...) para indicar que se trata de un
evento especial.
La buena noticia es que existen una serie de códigos de escape ANSI que nos permiten controlar
ciertos aspectos de la consola, entre ellos los colores utilizados.
Podremos utilizarlas para controlar el color que queremos mostrar con [Link].
que nos permitirá dejarlo todo como estaba y volver a los colores por defecto.
Del mismo modo podemos definir una serie de constantes para establecer el color de fondo que
queremos usar con el texto, así:
Para comprender mejor esto, supongamos que tenemos una baraja inglesa. La misma se compone
de 4 palos, los cuales serán 4 enumeradores llamados Flores, Diamantes, Corazones y Espadas,
que pertenecen a un tipo enumerado llamado Cartas.
Las enumeraciones son muy útiles siempre que se necesite definir un conjunto de valores que
representen una colección de elementos. En el pasado, dichos valores se definían
como variables finales, pero actualmente las enumeraciones ofrecen un enfoque más
estructurado.
Al efectuar una declaración de enum, la primera línea de código debe ser una lista de constantes
y luego otras cosas como métodos, variables y constructores.
Según las convenciones de nomenclatura de Java, se recomienda que los nombres se escriban
con las constantes con mayúsculas.
En este simple programa se puede apreciar la sintaxis del código para emplear un enum en Java
usando una estructura condicional de tipo if.
Primero se debe hacer la declaración del enum como se vio en los ejemplos anteriores,
enumerando los identificadores PUBLICIDAD, BORRADOR y CANCELADO que se
denominan constantes de enumeración.
Luego se puede declarar un método main() dentro una clase class() donde cada constante se
declara implícitamente como un miembro público (public) y estático (static) de Status. Dentro
del método main() las constantes de enumeración se usan en una estructura condicional de
tipo if, donde se ejecutarán ciertas líneas de código, según se valide la igual expresada como
condición en la sintaxis.
Class Main {
Declaración y uso de constantes en Java. Uso del final en Java, datos final
En la sección anterior hablamos sobre variables y tipos en java y aprendimos cómo se declara
una variable, cómo se le asigna un tipo de dato específico (primitivo o complejo). En esta
sección hablaremos ya no tanto de "variables" sino más bien de constantes. Una constante desde
el punto de vista de la programación es un dato cuyo valor no cambia durante la ejecución del
programa, en otras palabras, una vez que a una constante se le asigna un valor, este no podrá ser
modificado y permanecerá así durante toda la ejecución del programa.
Las constantes son útiles para datos o atributos para los cuales el valor no tiene por qué cambiar,
por ejemplo, el número del documento de identidad de una persona, lo más normal es que dicho
número no cambie o la fecha de nacimiento, una persona tiene una fecha de nacimiento única e
invariable, por lo tanto por ejemplo un atributo "nacimiento" debería ser constante. Con esto
podremos evitar modificaciones en nuestro sistema que puedan causar problemas durante la
ejecución del mismo.
En esta sección no hablaremos únicamente sobre cómo hacer que un dato cualquiera no
permanezca constante, sino también, veremos qué implicaciones tiene que una clase, un método
y un atributo sean constantes (final). Comencemos:
Constantes en Java:
La palabra clave que java ha reservado para definir constantes es la palabra "final". En java es
muy simple definir constantes, solo basta con ponerles el modificador final antes de la
declaración del tipo. Al definir un dato como constante le podremos asignar un valor por primera
vez y luego de eso no será posible cambiarle ese valor. Una vez inicializado el dato, este no
podrá cambiar su valor de ninguna forma.
Como se puede apreciar la sintaxis es bastante sencilla, sin embargo hay que tener en cuenta
algunas cosas: cuando vamos a declarar un dato cualquiera como final, debemos asignarle
inmediatamente un valor, es decir debemos inicializarlo de inmediato, de lo contrario no
podremos compilar nuestro código. En este punto debo hacer una aclaración, un dato cualquiera
que se encuentre por ejemplo al interior del método main, debe ser inicializado de inmediato, sin
embargo un atributo propio de una clase no necesariamente debe ser inicializado en el mismo
momento que se declara dicho atributo, sino que puede ser inicializado también por un
constructor, dando así la posibilidad de que cada objeto especifico tenga su propio valor
constante, ingresa a continuacón para saber más sobre atributos y constructores. Vemos el
ejemplo:
//Constructor
Constantes(String valor) {
En el código anterior, podemos apreciar entonces que en el caso de los atributos de una clase no
es necesario inicializar dicho atributo una vez que éste es declarado. Sin embargo no todo es tan
bueno, pues si no lo hacemos al momento de declarar el atributo, entonces estaremos obligados a
hacerlo en el constructor de la clase. Java debe asegurarse que el valor de una variable final sea
asignado y las dos únicas posibilidades son el constructor o en la declaración misma del atributo.
Existe algo particular con este comportamiento de Java y es que necesitamos que todos los
constructores le den valor al atributo constante (si no lo hicimos al momento de declararlo), de
este modo, si tenemos más de un constructor es obligatorio que cada uno de ellos le asigne valor
al atributo constante (final), pues no basta que uno de ellos lo haga, Java nos permitirá compilar
el código siempre y cuando todos y cada uno de los constructores le de valor al atributo final
(constante), pues si usáramos un constructor que no le diera valor a dicho atributo, éste quedaría
con valor nulo y nunca podrá ser cambiado lo cual es inconsistente. Veamos en código de lo que
estoy hablando:
//Primer constructor
atribConstante = valor;
//Segundo constructor
atributo = valor;
Una clase final es una clase que no puede ser extendida, es decir ninguna otra clase puede ser
hija de ésta, será entonces una clase única y que no tendrá herencia o herederos al no poder ser
extendida. Veamos:
Declaramos una clase "Madre" que será final, esto quiere decir que no podrá ser extendida por
otra
//Atributos de la clase
//Método de la clase
[Link]("Hola");
Declaramos una clase "Hija" que intentará extender de la clase "Madre", la cual es final. Esto
generará un error de compilación y no podremos ejecutar nuestro código.
//Atributos de la clase
//Método de la clase
Métodos final
Un método final no puede ser redefinido por una clase hija. Esto quiere decir que si yo defino un
método final en la clase X y luego la clase Y es hija de la clase X, entonces la clase Y no podrá
cambiar la definición de dicho método, puesto que éste es final. Veamos:
Declaramos una clase "Madre" que será tendrá un método final, esto quiere decir que dicho
método no podrá ser redefinido.
Declaramos una clase "Hija" que extenderá de la clase "Madre" sin problemas e intentará
redefinir el método1. Esto generará un error de compilación y no podremos ejecutar nuestro
código.
//Se declara la clase como hija de madre public class ClaseHija extends
ClaseMadre { //Atributos de la clase private int atributo1; private String
atributo2; //Método de la clase public void metodo1()
{ [Link]("Adios"); } //Lo anterior genera error, pues no se puede
redefinir un método final public int metodo1(int valor) { return valor; }
//Esto NO es un error, pues NO estamos redefiniendo el método //Redefinir no
es lo mismo que sobrecargar. }
En el ejemplo anterior acabamos de ver como hemos intentado redefinir el método de la clase
madre y esto no generaría un error, pues método1 es final. Quiero hacer la aclaración aquí.
Redefinir no es lo mismo que sobrecargar. Cuando sobrecargamos un método estamos
cambiando la firma del método y esto lo podemos hacer independientemente de si el método es
final o no. Sin embargo redefinir el método es intentar hacer que la clase Hija tenga el mismo
método (sin sobrecargarlo), pero que haga algo diferente, esto es lo que no podremos hacer. En
este caso intentamos que el método mostrara en pantalla "Adios" pero no podemos hacerlo,
mientras que luego SOBRECARGAMOS el método1, poniéndole un parámetro de entrada y un
valor de retorno.
Sé que esto último es bastante confuso y avanzado, sin embargo quise tocar el tema para ir
abriéndome a otras cosas y mostrando el alto potencial que tiene Java. En otras secciones hablaré
con detalle acerca de herencia en Java, todo esto de clases Hijas, clases Madre y varias cosas
más.
Métodos en Java, funciones y procedimientos. Cómo hacerlos y usarlos
Los métodos en Java, las funciones y los procedimientos, especialmente en Java, son una
herramienta indispensable para programar. Java nos permite crear o hacer nuestros propios
métodos y usarlos sencillamente como también nos facilita hacer uso de los métodos de otras
librerías (funciones matemáticas, aritméticas, de archivos, de fechas, etc. Cualquiera que sea el
caso, las funciones permiten automatizar tareas que requerimos con frecuencia y que además se
pueden generalizar por medio de parámetros o argumentos. Aprender a crear métodos en Java y
usarlos correctamente es de gran importancia, separar nuestro código en módulos y según las
tareas que requerimos. En java una función debe contener la implementación de una utilidad de
nuestra aplicación, esto nos pide que por cada utilidad básica (abrir, cerrar, cargar, mover, etc.)
sería adecuado tener al menos una función asociada a ésta, pues sería muy complejo usar o crear
un método que haga todo de una sola vez, por esto es muy buena idea separar cada tarea en una
función o método (según corresponda).
Para estar claros en todo, en Java es mucho más común hablar de métodos que de funciones y
procedimientos y esto se debe a que en realidad un método, una función y un procedimiento NO
son lo mismo, veamos la diferencia:
Funciones:
Métodos:
Los métodos y las funciones en Java están en capacidad de realizar las mismas tareas, es decir,
son funcionalmente idénticos, pero su diferencia radica en la manera en que hacemos uso de uno
u otro (el contexto). Un método también puede recibir valores, efectuar operaciones con estos y
retornar valores, sin embargo en método está asociado a un objeto, SIEMPRE, básicamente un
método es una función que pertenece a un objeto o clase, mientras que una función existe por sí
sola, sin necesidad de un objeto para ser usada. Nota: Es aquí donde digo que en Java se debe
hablar de métodos y no de funciones, pues en Java estamos siempre obligados a crear un objeto
para usar el método. Para que sea una función esta debe ser static, para que no requiera de un
objeto para ser llamada.
Procedimientos:
Los procedimientos son básicamente un conjunto de instrucciones que se ejecutan sin retornar
ningún valor, hay quienes dicen que un procedimiento no recibe valores o argumentos, sin
embargo en la definición no hay nada que se lo impida. En el contexto de Java un procedimiento
es básicamente un método cuyo tipo de retorno es void que no nos obliga a utilizar una sentencia
return.
EL primer componente corresponde al modificador de acceso, que puede ser public o private,
éste es opcional, si no ponemos nada, se asume el modificador de acceso por defecto, el segundo
componente es el modificador que puede ser final o static (o ambas), también es opcional.
Recordemos que un método o función siempre retorna algo, por lo tanto es obligatorio declararle
un tipo (el tercer componente de la sintaxis anterior), puede ser entero (int), booleano (boolean),
o cualquiera que consideremos, inclusive tipos complejos, luego debemos darle un nombre a
dicha función, para poder identificarla y llamarla (invocarla) durante la ejecución, después al
interior de paréntesis, podemos poner los argumentos o parámetros. Luego de la definición de la
"firma" del método, se define su funcionamiento entre llaves; todo lo que esté dentro de las
llaves es parte del cuerpo del método y éste se ejecuta hasta llegar a una instrucción return.
Ejemplos de métodos
Veamos algunos ejemplos prácticos de métodos en Java.
Ejemplo 1:
int metodoEntero()//Función sin parámetros { int suma = 5+5; return suma;
//Acá termina la ejecución del método //return 5+5;//Este return nunca se
ejecutará //Intenta intercambiar la línea 3 con la 5 //int x = 10; //Esta
línea nunca se ejecutará }
Como puedes ver es un ejemplo sencillo, es un método llamado metodoEntero, si ejecutas esto,
la función te retornará el valor de suma que es 10 (5+5). Las líneas posteriores no se ejecutarán
nunca, aunque no generan error alguno, no tienen utilidad. Puedes notar que para este caso es lo
mismo haber escrito return suma que escribir return 5+5. Ambas líneas funcionan
equivalentemente.
Nota: Recuerda que en Java todo debe estar al interior de una clase (o interfaz) y que debes tener
al menos la función main.
Ejemplo 2:
public String metodoString(int n)//método con un parámetro { if(n ==
0)//Usamos el parámetro en la función { return "a"; //Si n es cero retorna a
//Notar que de aquí para abajo no se ejecuta nada más } return "x";//Este
return sólo se ejecuta cuando n NO es cero }
Aquí creamos un método público, hicimos uso de múltiples sentencia return y aprovechamos la
característica de que al ser ejecutadas finalizan inmediatamente la ejecución de la parte restante
del método. De este modo podemos asegurar que la función retornará "a" únicamente cuando el
valor del parámetro n sea cero y retornará un "x" cuando dicho valor no sea cero.
Ejemplo 3:
static boolean metodoBoolean(boolean n, String mensaje)//Método con dos
parámetros { if(n)//Usamos el parámetro en el método
{ [Link](mensaje);//Mostramos el mensaje } return n; //Usamos el
parámetro como valor a retornar }
Aquí ya tenemos una función (digo función y no método porque es static) que recibe dos
parámetros, uno de ellos es usado en el condicional y el otro para mostrar su valor por pantalla
con [Link], esta vez retornamos valores booleanos true o false y utilizamos el valor
propio recibido en el parámetro. Toma en cuenta que en esta ocasión únicamente usamos una
sentencia return, pues usar una al interior del if habría sido innecesario y el resultado sería el
mismo.
Ejemplo de procedimientos
void procedimiento(int n, String nombre) //Notar el void { if(n > 0 && !
[Link](""))//usamos los dos parámetros { [Link]("hola " +
nombre); return; //Si no ponemos este return se mostraría hola y luego adiós }
//También podríamos usar un else en vez del return
[Link]("adios"); }
De este ejemplo podemos ver que ya no se usa un tipo sino que se pone void, indicando que no
retorna valores, también podemos ver que un procedimiento también puede recibir parámetros o
argumentos.
Recuerda: Los procedimientos también pueden usar la sentencia return, pero no con un valor.
En los procedimientos el return sólo se utiliza para finalizar allí la ejecución.
nombre([valor,[valor]...]);
Como puedes notar es bastante sencillo invocar o llamar funciones en Java, sólo necesitas el
nombre del método, función o procedimiento y enviarle el valor de los parámetros. Hay que
hacer algunas salvedades respecto a esto.
En el código anterior podemos ver cómo todo ha sido invocado al interior la función main (la
función principal), esto nos demuestra que podemos hacer uso de funciones al interior de otras.
También vemos cómo se asigna el valor retornado por el método a la variable 'respuesta' y
finalmente, antes del return, vemos cómo hemos usado el valor retornado por 'funcionBool' como
parámetro del procedimiento.
Funciones anidadas
Para este ejercicio vamos a crear una función que llama a otra al interior de ella (por eso las
quise llamar anidadas). Es un sistema de validación de un usuario que recibe un usuario y una
contraseña y según sean válidos o no, muestra un mensaje al usuario.
En este ejercicio tenemos dos funciones publicas (funciones porque usamos el modificador
static) y un procedimiento (porque es void) que hace la validación (muy muy básica) de unos
datos de usuario y según estos, llama a una función de saludo o de error. Debes notar que el
procedimiento es llamado desde la función main.
The Java Development Kit (JDK) contains the minimum software you need to do Java
development. Key commands include:
The rules for what a Java file contains, and in what order, are more detailed than what we have
explained so far (there is more on this topic later in the chapter). To keep things simple for now,
we follow this subset of the rules:
The code args[0] accesses the first element of the array. That's right: array indexes begin with 0
in Java. To run it, type this:
javac [Link]
java Zoo Bronx Zoo
The output is what you might expect:
Bronx
Zoo
Los modificadores de acceso permiten dar un nivel de seguridad mayor a nuestras aplicaciones
restringiendo el acceso a diferentes atributos, métodos, constructores asegurándonos que el
usuario deba seguir una "ruta" especificada por nosotros para acceder a la información.
Es muy posible que nuestras aplicaciones vayan a ser usadas por otros programadores o usuarios
con cierto nivel de experiencia; haciendo uso de los modificadores de acceso podremos
asegurarnos de que un valor no será modificado incorrectamente por parte de otro programador o
usuario. Generalmente el acceso a los atributos se consigue por medio de los métodos get y set,
pues es estrictamente necesario que los atributos de una clase sean privados.
Nota: Siempre se recomienda que los atributos de una clase sean privados y por tanto cada
atributo debe tener sus propios métodos get y set para obtener y establecer respectivamente el
valor del atributo.
Nota 2: Siempre que se use una clase de otro paquete, se debe importar usando import. Cuando
dos clases se encuentran en el mismo paquete no es necesario hacer el import pero esto no
significa que se pueda acceder a sus componentes directamente.
{
return contador;
//Notar que no ponemos un set, pues no nos interesa que el contador pueda ser cambiado.
package aap.ejemplo2;
public class Ejemplo2
{
private static int atributo1;//Este atributo es privado
static int contador = 0; //Contador con acceso por defecto
package aap.ejemplo2;
public class Ejemplo2_1
{
public static int getContador()
{
return [Link];//Accedemos directamente al contador
desde otra clase
}
}
package aap.ejemplo3;
package aap.ejemplo3_1;
Modificador public
El modificador de acceso public es el más permisivo de todos, básicamente public es lo contrario
a private en todos los aspectos (lógicamente), esto quiere decir que si un componente de una
clase es public, tendremos acceso a él desde cualquier clase o instancia sin importar el paquete o
procedencia de ésta.
A continuación y ya para finalizar, pondré una pequeña tabla que resume el funcionamiento de
los modificadores de acceso en Java.
Debo aclarar algo en el caso del modificador de acceso protected y el acceso desde suclases. Es un error
común pensar que se puede crear un objeto de la clase madre y luego acceder al atributo con acceso
protected sin problemas, sin embargo esto no es cierto, puesto que el modificador protected lo que nos
permite es acceder al atributo heredado desde el ámbito de la clase hija y no directamente