Fundamentosdelaprogramacionenjava Completo2021
Fundamentosdelaprogramacionenjava Completo2021
Correo-e: [email protected].
Correo-e: [email protected]
Fundamentos de la programación en Java. Estructuras
de Control e Introducción a la Programación Orientada a
Objetos
Fundamentos de
la programación en
Java.
Estructuras de
Control e
Introducción
a la Programación
Orientada a Objetos
j
Javier Pino Herrera, Patricia Martínez Moreno,
José Antonio Vergara Camacho
Primera edición: septiembre 2020
ISBN: 978-84-1374-012-6.
© Del texto: Javier Pino Herrera, Patricia Martínez Moreno, José Antonio Vergara
Camacho
© Maquetación y diseño: Equipo de Editorial Círculo Rojo
© Fotografía de cubierta: Depositphotos.com
Editorial Círculo Rojo apoya la creación artística y la protección del copyright. Queda
totalmente prohibida la reproducción, escaneo o distribución de esta obra por cualquier
medio o canal sin permiso expreso tanto de autor como de editor, bajo la sanción establecida
por la legislación.
Círculo Rojo no se hace responsable del contenido de la obra y/o de las opiniones que el autor
manifieste en ella.
El papel utilizado para imprimir este libro es 100% libre de cloro y por tanto, ecológico.
Directorio Universidad Veracruzana
Cuerpo Académico
Aplicación y enseñanza de la ingeniería de software
9
Índice:
Prólogo.............................................................................15
Introducción.....................................................................17
1. Instalación y configuración de Java...............................19
1.1Introducción...................................................................19
1.2Descargar e instalar JDK.................................................19
1.3Establecer la variable de entorno PATH..........................21
1.4Crear y ejecutar programas de Java desde Internet...........23
1.5Editores de código para Java............................................24
1.6Conclusión.....................................................................25
2.Introducción a la programación en Java.........................27
2.1Introducción...................................................................27
2.2Imprimir texto en pantalla..............................................27
2.3Secuencias de escape........................................................33
2.4Tipos de datos y variables................................................37
2.5Concatenación de textos.................................................44
2.6 Operadores aritméticos..................................................46
2.7Leer valores de entrada....................................................51
2.8Conclusión.....................................................................53
3.Estructuras de control....................................................55
3.1Introducción...................................................................55
3.2Operadores relacionales y de igualdad.............................56
3.3Operadores lógicos..........................................................61
3.4Sentencia de selección if..................................................65
3.5Sentencia de selección if-else...........................................68
11
3.6Sentencia de selección múltiple switch............................70
3.7Sentencia if-else-if...........................................................73
2.8Sentencia de repetición while..........................................76
3.9Sentencia de repetición for..............................................80
3.10Sentencia de repetición do-while...................................83
3.11 Instrucciones break y continue.....................................86
3.12Conclusión...................................................................88
4.Arreglos.........................................................................89
4.1Introducción...................................................................89
4.2Trabajando con los arreglos.............................................89
4.3Inicialización por defecto de los arreglos..........................94
4.4Inicialización de los arreglos............................................99
4.5Sentencia for mejorado.................................................101
4.6Conclusión...................................................................103
5.Introducción de la POO..............................................105
5.1Introducción.................................................................105
5.2Paradigma de la POO...................................................106
5.3Abstracción...................................................................106
5.4Campos........................................................................107
5.5Métodos........................................................................116
5.6Convención de nombres de Clases, Campos y Métodos.118
5.7Métodos sin parámetros................................................119
5.8Métodos con un parámetro...........................................128
5.9Métodos con varios parámetros.....................................131
5.10Métodos que devuelven datos......................................135
5.11Sobrecarga de métodos................................................141
5.12Conclusión.................................................................146
6.POO: Constructores e Instancias.................................147
6.1Introducción.................................................................147
6.2Niveles de acceso...........................................................147
6.3Constructores................................................................160
6.4Constructores con parámetros.......................................166
6.5Sobrecarga de constructores..........................................169
6.6Campos static...............................................................175
6.7Métodos static...............................................................185
6.8Objetos como argumentos............................................188
6.9Conclusión...................................................................195
7POO: Herencia............................................................197
7.1Introducción.................................................................197
7.2Herencia.......................................................................197
7.3Nivel de acceso protected y default ...............................210
7.4Conclusión...................................................................217
Referencias.....................................................................219
Prólogo
15
experimentar, equivocarse; ¡sí!, ¡así es!, lo invitamos a equi-
vocarse, a equivocarse mucho, porque después de cometer y
corregir todos esos errores, usted logrará convertirse en un
experto, y llegará a ver las líneas de código como un arte.
16
Introducción
Este libro surge por el contacto del día a día en las aulas con
los estudiantes a través de impartir las clases de Programa-
ción e Introducción a la Programación, con el fin de apoyar y
fortalecer competencias en toda persona que inicie y le inte-
rese el aprendizaje en el desarrollo de programas de compu-
tadora en el lenguaje JAVA.
Java es un lenguaje de programación que ha tomado
fuerza por ser software independiente de la plataforma. Un
programa en Java funciona en cualquier computadora exis-
tente, situación que ha sido atractiva en los desarrolladores
de software, olvidándose de los diversos sistemas operativos:
Windows, Linux, MacOS, etc. Esto es porque JAVA cuenta con
una máquina virtual para cada plataforma que hace de enlace
o puente entre el sistema operativo y el programa de Java.
Ahora aquí se muestra paso a paso cómo introducirse a la
programación en Java desde la instalación del mismo softwa-
re, conocer y manipular las diversas estructuras de control: If,
While, Switch, Do While, For, hasta temas de mayor compleji-
dad como es el uso de arreglos y los elementos básicos de la
Programación Orientada a Objetos (POO) como la instancia-
ción, constructores, herencia, otros.
De tal manera que el libro se encuentra estructurado en
siete capítulos.
17
Capítulo 3. Estructuras de control
Capítulo 4. Arreglos.
Capítulo 5. Introducción a la POO.
Capítulo 6. POO: Constructores e instancias.
Capítulo 7. POO: Herencia.
18
1. Instalación y configuración
de Java
1.1Introducción
Antes de comenzar a trabajar en Java, se necesita instalar todo
lo necesario para crear programas. Este capítulo está enfoca-
do en preparar el equipo de cómputo y realizar los primeros
programas en Java. Se comenzará mostrando el proceso de
instalación del kit de desarrollo de Java (JDK, Java Develope-
ment Kit) para Windows, éste es necesario para poder crear
nuestros programas en Java. De forma opcional, se puede uti-
lizar algún sitio que permita crear y ejecutar programas de
Java en línea. En el apartado 1.4 se presentan algunos sitios
en Internet que ofrecen esta posibilidad.
19
Windows:
http://www.oracle.com/technetwork/java/javase/
downloads/index.html
MacOS:
http://www.oracle.com/technetwork/java/javase/
downloads/index.html
Linux:
http://www.oracle.com/technetwork/java/javase/
downloads/index.html
http://www.oracle.com/technetwork/java/javase/
downloads/index.html
20
Ya descargado el instalador del JDK, se procede a ejecu-
tar y realizar el proceso de instalación. Al finalizar el proceso
de instalación, se muestra un mensaje informando que el
proceso ha sido realizado de manera exitosa.
https://www.java.com/es/download/help/path.
xml
21
Figura 1.2 | Variables de entorno
22
1.4Crear y ejecutar programas de Java desde
Internet
En caso de no realizar el proceso de instalación, ni la con-
figuración de Java en su computadora, se puede hacer uso de
algún sitio de Internet que permita crear programas en Java y
ejecutarlos desde ahí mismo. Existen varios sitios que ofrecen
esta posibilidad. Con realizar una búsqueda desde el nave-
gador de su preferencia con las palabras java editor online,
se mostrarán varias opciones y así crear los programas que
se presentan en este libro. Algunos de los posibles sitios que
encontrará en los resultados de su búsqueda se muestran a
continuación.
CodingGround
https://www.tutorialspoint.com/compile_java_
online.php
Paiza.io
https://paiza.io/es/languages/
online-java-compiler
Repl.it
https://repl.it/languages/java10
23
utilizar alguno de los sitios antes mencionados, si así lo desea,
con la recomendación de investigar y documentarse sobre su
funcionamiento.
Netbeans
https://netbeans.org/
Eclipse
https://www.eclipse.org/
IntelliJ IDEA
https://www.jetbrains.com/es-es/idea/
jGRASP
https://www.jgrasp.org/
jBlue
https://bluej.org/
24
En todo caso, si utiliza algún editor de código o un IDE,
la recomendación es documentarse sobre su uso, ya que el
alcance de este libro no abarca el uso de alguno de estos pro-
gramas. Como ya se mencionó anteriormente, en este libro
los programas realizados para Java serán tratados como si hu-
biesen sido creados desde un editor de texto plano.
1.6Conclusión
En este capítulo vimos la forma de preparar el equipo
para crear programas en Java. Así mismo, se hizo referencia
a algunos sitios que nos permiten realizar programas en Java
y ejecutarlos ahí mismo. Por último, se mostraron algunos
de los entornos de desarrollo integrados más utilizados para
crear programas en Java. En el próximo capítulo se comienza
el aprendizaje sobre las bases de la programación en Java con
la creación de programas.
25
2.Introducción a la
programación en Java
2.1Introducción
El aprendizaje de cualquier lenguaje de programación se
inicia con los conceptos básicos y, conforme se avanza en los
temas, éstos van incrementando gradualmente la compleji-
dad, no porque los temas sean difíciles, sino porque los temas
se van relacionando con otros entre sí. En este capítulo creará
programas, se muestra la estructura general de los programas
en Java, aprenderá a imprimir texto en pantalla, a identifi-
car los tipos de datos disponibles a utilizar en los programas,
además realizará operaciones aritméticas, y solicitará valores
de entrada a los usuarios desde los programas.
27
equipo de cómputo que tenga acceso a Internet, se puede
utilizar alguna de las opciones para crear código en línea a
través de alguna plataforma en línea. Será necesario se do-
cumente sobre el uso adecuado del mismo. Los ejercicios del
libro se muestran asumiendo que están siendo creados desde
un editor de texto plano.
En la figura 2.1, se ejemplifica el código de un programa
en Java. Tómese un corto tiempo para observar y analizar el
código.
MiClase.java
1 class MiClase {
2 public static void main(String[] args){
3 System.out.println(“Hola mundo”);
4 } // Fin del método main
5 } // Fin de la clase MiClase
Hola mundo.
MiClase.java
28
lo más importante es entender que el código mostrado en la
figura 2.1, al ser compilado y ejecutado, imprime en pantalla
el texto Hola mundo.
El programa de la figura 2.1 muestra en términos generales
cómo está estructurado el código de un programa en Java. La
línea 1
1 class MiClase {
La línea 2,
29
La línea 3,
3 System.out.println(“Hola mundo”);
realiza la tarea de imprimir el texto Hola mundo en pantalla.
Nótese que, al ejecutar el programa, el texto que se muestra
en pantalla se observa sin las comillas dobles. En Java, el texto
es representado entre comillas dobles. Aunque en estos mo-
mentos no se logre comprender cada fragmento del código,
con certeza se irá avanzando hasta comprender a detalle cada
parte del código. Por ahora, si se quiere imprimir texto en
pantalla, replique la instrucción mostrada en la línea 3.
La línea 4,
La línea 5,
30
Es momento de compilar y ejecutar el primer programa
en Java. Si aún no se tiene instalado el Kit de desarrollo de
Java (JDK), y por el momento no se desea realizar el proceso
de instalación y configuración en la computadora, se puede
hacer uso de alguna plataforma de codificación en línea, Repl.
it (https://repl.it), podría ser una buena opción. Si se desea
realizar el proceso de instalación y configuración del JDK, se
sugiere revisar el proceso que se explica en el capítulo 1.
Los siguientes pasos corresponden al proceso de compila-
ción y ejecución desde la línea de comandos en un equipo de
cómputo con el JDK instalado y configurado.
Lo primero a realizar para compilar un programa en java es
abrir una ventana de comandos y ubicarse en el directorio en
el que se encuentra el archivo con el código de su programa.
En Windows el comando sería algo parecido a
cd c:\ejercicios
cd ~\ejercicios
javac MiClase.java
31
java MiClase
MiClase.java
1 class MiClase {
2 public static void main(String[] args) {
3 System.out.println(“Bienvenido a JAVA”);
4 } // Fin del método main
5 } // Fin de la clase MiClase
Bienvenido a JAVA.
32
2.3Secuencias de escape
En estos momentos ya se ha enseñado a imprimir texto
en pantalla, sin embargo, existen ciertos caracteres que no
se imprimen de forma natural, por ejemplo, por más que se
intente, no es posible imprimir dos líneas de texto del siguien-
te modo:
33
Secuencia de Descripción
escape
\t Inserta un espacio de tabula-
ción en el texto.
\n Inserta un salto de línea en
el texto.
\r Inserta un retorno de carro en
el texto.
\” Inserta un carácter de doble
comilla en el texto (“).
\\ Inserta un carácter de barra
diagonal invertida (\)
Figura 2.3 | Secuencias de escape más comunes en Java.
34
SecuenciasDeEscape.java
1 class SecuenciasDeEscape {
2 public static void main(String[] args) {
3 System.out.println(“Texto 1\nTexto 2”);
4 System.out.println(“Texto 3\tTexto 4”);
5 System.out.println(“Texto 5\rTexto 6”);
6 System.out.println(
“\”Texto 7\” Texto 8”);
7 System.out.println(
“Texto 9\\ Texto 10”);
8 } // Fin del método main
9 } // Fin de la clase SecuenciasDeEscape
Texto 1
Texto 2
Texto 3 Texto 4
Texto 6
“Texto 7” Texto 8
Texto 9\ Texto 10
35
4 System.out.println(“Texto 3\tTexto 4”);
36
En la línea 7,
En la línea 8,
8 } // Fin del método main
37
el momento se ha trabajado con textos, en Java los textos son
de tipo String, sin embargo, estos datos no son parte de
los tipos de datos primitivos. Por el momento, probablemen-
te resulte confuso el concepto de tipos de datos primitivos,
también conocidos como tipos de datos simples en otros len-
guajes de programación, pero se irá ampliando este concepto
conforme avancemos en nuestro aprendizaje. Lo primero por
recordar es que Java cuenta con 8 tipos de datos primitivos.
Éstos se pueden ver en la figura 2.5.
38
vos son palabras reservadas, por lo que se escriben siempre
en minúsculas, y no se usan como identificadores, es decir,
nombres de variables, clases u objetos.
Ahora, que se han conocido los tipos de datos primitivos,
se identificaran las variables. Las variables permiten guardar
y manipular datos en los programas. Imagine estar con un
amigo en el supermercado, su amigo observa el precio de un
paquete de galletas, lo toma y le pide a usted que recuerde
que el precio de las galletas es de 2.25 dólares. Al llegar a la
caja, su amigo coloca todos los productos, con excepción del
paquete de galletas, la cajera revisa y pasa por la caja cada
uno de ellos, al finalizar, ella menciona el costo total. Su amigo
observa el dinero con el que cuenta, y le pregunta a usted
por el precio del paquete de galletas, usted le menciona el
precio memorizado, 2.25 dólares, su amigo observa que sí
cuenta con suficiente dinero y agrega el paquete de galletas
a la compra. Pero bueno, ¿era realmente necesaria toda esta
historia para comprender lo que son las variables?, proba-
blemente no, pero sirve como analogía. Cuando se realizan
programas, es común la necesidad de guardar información
de manera temporal para realizar operaciones más adelante,
para eso utilizaremos las variables. En el ejemplo del super-
mercado, se realizaron varios pasos, al igual que un programa
informático consta de una serie de pasos ordenados; en este
ejemplo, usted fungió como variable al almacenar informa-
ción de forma temporal. Cuando su amigo necesito de la in-
formación, le preguntó por el precio del paquete de galletas.
Los conceptos de variables y tipo de datos primitivos son
trabajados en el siguiente ejemplo:
39
Variables.java
1 class Variables {
2 public static void main(String[] args) {
3 byte byteDato = 100;
4 short shortDato = 1000;
5 int intDato = 1000000;
6 long longDato = 1000000000000L;
7 float floatDato = 100.25f;
8 double doubleDato = 2000.35;
9 boolean booleanDato = true;
10 char charDato = ‘\u0040’;
11
12 System.out.print(“Dato byte: “);
13 System.out.println(byteDato);
14 System.out.print(“Dato short: “);
15 System.out.println(shortDato);
16 System.out.print(“Dato int: “);
17 System.out.println(intDato);
18 System.out.print(“Dato long: “);
19 System.out.println(longDato);
20 System.out.print(“Dato float: “);
21 System.out.println(floatDato);
22 System.out.print(“Dato double: “);
23 System.out.println(doubleDato);
24 System.out.print(“Dato boolean: “);
25 System.out.println(booleanDato);
26 System.out.print(“Dato char: “);
27 System.out.println(charDato);
28 } // Fin del método main
29 } // Fin de la clase Variables
40
Dato byte: 100
Dato short: 1000
Dato int: 1000000
Dato long: 1000000000000
Dato float: 100.25
Dato double: 2000.35
Dato boolean: true
Dato char: @
41
6 long longDato = 1000000000000L;
La línea 9,
La línea 10,
42
10 char charDato = ‘\u0040’;
La línea 12,
12 System.out.print(“Dato byte: “);
La línea 13,
13 System.out.println(byteDato);
43
15 System.out.println(shortDato);
16 System.out.print(“Dato int: “);
17 System.out.println(intDato);
18 System.out.print(“Dato long: “);
19 System.out.println(longDato);
20 System.out.print(“Dato float: “);
21 System.out.println(floatDato);
22 System.out.print(“Dato double: “);
23 System.out.println(doubleDato);
24 System.out.print(“Dato boolean: “);
25 System.out.println(booleanDato);
26 System.out.print(“Dato char: “);
27 System.out.println(charDato);
2.5Concatenación de textos
Cuando se desarrollan programas, en ocasiones se necesi-
tan crear nuevos textos con base en otros datos, por ejemplo,
si se tiene una variable con un nombre y una variable con el
primer apellido, se puede formar un nuevo texto conforma-
44
do por ambos textos, a esto se llama concatenar texto, y se
realiza usando el operador +. Vease un ejemplo:
Concatenacion.java
1 class Concatenacion {
2 public static void main(String[] args) {
3 String nombre = “John”;
4 String primerApellido = “Doe”;
5 String nombreConApellido =
nombre + “ “ + primerApellido;
6
7 System.out.println(nombreConApellido);
8 } // Fin del método main
9 } // Fin de la clase Concatenacion
John Doe
45
La línea 3 define un objeto de tipo String que posee el
valor de “John” y se identifica con el nombre de nombre.
La línea 4 define un objeto de tipo String que posee el
valor de “Doe” y se identifica con el nombre de primerA-
pellido. La línea 5 declara un objeto de tipo String con
nombreConApellido como identificador, y le es asignado
el resultado de concatenar los textos del objeto nombre con
el texto “ “, el cual es un espacio en blanco, y el texto del
objeto primerApellido; por lo que, realmente se asigna
el resultado de unir los textos de “John”, “ “, y “Doe”; es
así que, en la línea 7, al imprimir el texto que posee el objeto
nombreConApellido, vemos en pantalla “John Doe”.
46
3, el resultado sería 1, y el residuo sería 2, por lo que el resul-
tado de 5 % 3 es 2. Así también, se observa que, en el ejemplo
del operador de división, /, éste devolvió como resultado un
valor entero; esto sucede así porque en Java las operaciones
con números enteros, devuelven números enteros, pero esto
quedará más claro después del siguiente programa:
OperadoresAritmeticos.java
1 class OperadoresAritmeticos {
2 public static void main(String[] args) {
3 int numero1 = 7;
4 int numero2 = 5;
5
6 System.out.println(“Operaciones con
\”numero1\” y \”numero2:\””);
7 System.out.println( numero1 + numero2 );
8 System.out.println( numero1 - numero2 );
9 System.out.println( numero1 * numero2 );
10 System.out.println( numero1 / numero2 );
11 System.out.println( numero1 % numero2 );
12 } // Fin del método main
13 } // Fin de la clase OperadoresAritméticos
47
imprimir el carácter de comillas dobles, “, hace uso de la se-
cuencia de escape, \”, es así como la línea 6 imprime el texto
Operaciones con “numero1” y “numero2:”.
Desde la línea 7 hasta la línea 11, se imprime el resultado
de varias operaciones aritméticas realizadas con los valores
que poseen las variables numero1 y numero2. Al ejecutar
el programa, se observa que el resultado de sumar numero1
y numero2, es decir, 7+5, es 12. La resta de los valores de
las variables es 2, al multiplicar resulta 35, al dividir es 1, y
el residuo es 2.
Cuando se realizan operaciones aritméticas con valores
enteros, Java da como resultado un valor de tipo entero; es
por eso por lo que, cuando realizamos la operación 7/5,
Java devuelve 1 como resultado. Entonces, ¿qué pasaría si en
lugar de definir variables de tipo int, se hubiésen definido
variables de tipo double? Veamos.
OperadoresAritmeticos.java
1 class OperadoresAritmeticos {
2 public static void main(String[] args) {
3 double numero1 = 7.0;
4 double numero2 = 5.0;
5
6 System.out.println(“Operaciones con
\”numero1\” y \”numero2:\””);
7 System.out.println( numero1 + numero2
);
8 System.out.println( numero1 - numero2
);
9 System.out.println( numero1 * numero2
);
10 System.out.println( numero1 / numero2
);
48
11 System.out.println( numero1 % numero2
);
12 } // Fin del método main
13 } // Fin de la clase OperadoresAritméticos
3 int numero1 = 7;
4 double numero2 = 5.0;
49
Operaciones con “numero1” y “numero2:”
12.0
2.0
35.0
1.4
2.0
50
2.7Leer valores de entrada
Una parte importante de los programas es la posibilidad de
solicitar datos al usuario, si se tiene un programa que realiza
sumas, seguramente lo valores numéricos no serán los mismos
con cada ejecución. Para continuar con el aprendizaje, se proce-
derá a solicitar al usuario que introduzca información. La figura
2.10 muestra un programa que solicita al usuario 2 valores
enteros y muestra la suma de los valores recibidos.
Lectura.java
1 import java.util.Scanner;
2 class Lectura {
3 public static void main(String[] args) {
4 Scanner entrada= new Scanner(System.in);
5
6 System.out.print(
“Ingrese un valor entero: “);
7 int numero1 = entrada.nextInt();
8
9 System.out.print(“Ingrese otro valor
entero: “);
10 int numero2 = entrada.nextInt();
11
12 int suma = numero1 + numero2;
13 System.out.println(
“La suma es “ + suma);
14 } // Fin del método main
15 } // Fin de la clase Lectura
51
En la figura 2.10 se resaltan los fragmentos de código que
son nuevos en el proceso de aprendizaje. Las líneas 1 y 4 son
necesarias para que el programa tenga la capacidad de solici-
tar datos al usuario. En estos momentos, aún no cuenta con
las bases de conocimiento suficientes para entender por com-
pleto la línea 4, cuando se estudie el tema de clases y objetos
se comprenderá la línea en su totalidad, si no es que antes.
Por ahora, es normal que los conceptos de clases, objetos y
métodos resulten un poco confusos.
52
la variable numero1, y en la línea 10, el valor que el usuario
ingresa es asignado a la variable numero2.
Ya se tiene una idea general de cómo obtener valores del
usuario a través de un objeto de tipo Scanner, sin embargo,
para que Java reconozca los objetos de tipo Scanner, es ne-
cesario realizar una importación de dicha clase, esto se debe
realizar antes de comenzar a escribir la clase de nuestro pro-
grama. La línea 1 muestra cómo se realiza la importación de
la clase Scanner. Como se puede observar, al ejecutar el pro-
grama, se solicita 2 veces que se introduzca un valor entero,
una vez que se ingresan los 2 valores, se imprime en pantalla
el resultado de sumar ambos valores.
Por último, observe que en la línea 13 se pide imprimir
el resultado de “La suma es “ + suma, dicho de otra
manera, la operación a realizar involucra un valor de tipo
String y un valor de tipo int, ¿cómo resuelve Java este
tipo de operación?, cuando Java encuentra este tipo de opera-
ciones, devuelve como resultado un objeto de tipo String,
es decir, todo se convierte a texto; es así que, con base en los
valores ingresados en el ejemplo, el texto resultante es La
suma es 30.
2.8Conclusión
En este capítulo, estudió la estructura básica de un pro-
grama en Java, cómo imprimir textos y las forma de concate-
narlos. Se identificaron los tipos de datos primitivos y cómo
utilizarlos para definir variables. También, se enseñó a tra-
bajar con variables y a realizar operaciones aritméticas. Por
último, se aprendió a leer valores enteros del usuario a través
de la clase Scanner. En el próximo capítulo, enseña a con-
trolar las sentencias de los programas a través de las estruc-
turas de control.
53
3.Estructuras de control
3.1Introducción
La ejecución de las sentencias en los programas se controla de
3 formas: secuencial, de selección, y de repetición; la estructu-
ra secuencial es la más básica de todas, es la forma de control
que se ha realizado hasta el momento. Con la estructura se-
cuencial, todas las instrucciones se ejecutan de forma lineal,
es decir, una instrucción no puede ser ejecutada hasta que la
instrucción anterior haya sido ejecutada. En este capítulo se
revisan las sentencias que permiten controlar la forma en que
las instrucciones serán ejecutadas, primero las estructuras
de selección, éstas permiten tomar decisiones con respecto
a qué instrucciones deberían ser ejecutadas; posteriormen-
te, las estructuras de repetición con las que se ejecuta un
conjunto de instrucciones de manera repetitiva. Tanto las es-
tructuras de selección, como las de repetición, necesitan de un
valor de verdad, es decir, un valor true o un valor false;
estos valores suelen ser asignados de forma directa, pero ge-
neralmente, el valor de verdad se obtiene al evaluar alguna
condición con los operadores relacionales, con los opera-
dores de igualdad y con los operadores lógicos, todos estos
operadores serán abordados en este capítulo.
55
3.2Operadores relacionales y de igualdad
Los operadores relacionales permiten comparar valores
numéricos entre sí; las comparaciones pueden ser con res-
pecto a si el primer valor es mayor al segundo o si el primer
valor es menor al segundo; por otro lado, los operadores de
igualdad nos permiten saber si dos valores son iguales, o si
dos valores son diferentes. La figura 3.1 muestra los operado-
res relacionales y los de igualdad.
56
Comparaciones.java
1 import java.util.Scanner;
2 public class Comparaciones {
3 public static void main(String[] args) {
4 Scanner entrada= new Scanner(System.
in);
5 int numero1;
6 int numero2;
7
8 System.out.print(
“Ingrese un número entero: “);
9 numero1 = entrada.nextInt();
10
11 System.out.print(
“Ingrese otro número entero: “);
12 numero2 = entrada.nextInt();
13
14 System.out.print(numero1 +
“ es mayor a “ + numero2 + “: “);
15 System.out.println(numero1 > numero2 );
16
17 System.out.print(numero1 +
“ es menor a “ + numero2 + “: “);
18 System.out.println(numero1 < numero2 );
19
20 System.out.print(numero1 +
“ es mayor o igual a “+numero2 + “: “);
21 System.out.println(numero1 >= numero2
);
22
23 System.out.print(numero1 +
“ es menor o igual a “+numero2 + “: “);
24 System.out.println(numero1 <= numero2
);
57
25
26 System.out.print(numero1 +
“ es igual a “ + numero2 + “: “ );
27 System.out.println(numero1 == numero2
);
28
29 System.out.print(numero1 +
“ no es igual a “ + numero2 + “: “ );
30 System.out.println(numero1 != numero2 );
31 } // Fin del método main
32 } // Fin de la clase Comparaciones
1 import java.util.Scanner;
58
3 public static void main(String[] args) {
La línea 5 y 6,
5 int numero1;
6 int numero2;
59
11 System.out.print(
“Ingrese otro número entero: “);
12 numero2 = entrada.nextInt();
14 System.out.print(numero1 +
“ es mayor a “ + numero2 + “: “);
15 System.out.println(numero1 > numero2 );
20 System.out.print(numero1 +
“ es mayor o igual a “+numero2 + “: “);
23 System.out.print(numero1 +
“ es menor o igual a “+numero2 + “: “);
26 System.out.print(numero1 +
“ es igual a “ + numero2 + “: “ );
60
29 System.out.print(numero1 +
“ no es igual a “ + numero2 + “: “ );
del mismo modo que ocurrió en la línea 14, imprimen textos
conformados por la concatenación de varios valores. Los textos
resultantes son mostrados en el ejemplo de la figura 3.2.
Las líneas 18, 21, 24, 27 y 30,
18 System.out.println(numero1 < numero2 );
27 System.out.println(numero1 == numero2 );
30 System.out.println(numero1 != numero2 );
3.3Operadores lógicos
Ahora, ya se identificaron los operadores relacionales y de
verdad, Éstos serán de utilidad para controlar el flujo de eje-
cución en los programas. Otros tipos de operadores que serán
útiles para controlar el flujo en los programas son los ope-
61
radores lógicos. La figura 3.3 resume los operadores lógicos
más comunes.
62
otro modo, sólo devuelve false cuando ambos valores son
false. Por último, el operador !, es el operador NOT, este
operador invierte el valor de verdad, es decir, cuando evalúa
un valor true, devuelve un valor false y cuando evalúa un
valor false, devuelve un valor true.
OperacionesLogicos.java
14 System.out.println( false || false );
1 public class OperadoresLogicos {
2 public static void main(String[] args) {
3 System.out.println(
“Operador AND (&&):”);
4 System.out.println( true && true );
5 System.out.println( true && false );
6 System.out.println( false && true );
7 System.out.println( false && false );
8 System.out.println();
9
10 System.out.println(“Operador OR
(||):”);
11 System.out.println( true || true );
12 System.out.println( true || false );
13 System.out.println( false || true );
15 System.out.println();
16
17 System.out.println(“Operador NOT
(!):”);
18 System.out.println( !true );
19 System.out.println( !false );
20 } // Fin del método main
21 } // Fin de la clase OperadoresLogicos
63
Operador AND (&&):
true
false
false
false
Operador OR (||):
true
true
true
false
Operador NOT (!):
false
true
64
13 imprimen true, puesto que al menos uno de los valores
evaluados es true, y sólo la línea 14, que evalúa la operación
false || false devuelve false.
La línea 15 hace uso del método println sin usar argu-
mentos para imprimir un salto de línea.
La línea 17 imprime el texto Operador NOT (!):, y
posteriormente imprime un salto de línea, puesto que se hace
uso del método println.
La línea 18 evalúa un valor true con el operador !. El
valor a imprimir es el resultado de la operación !true. El
resultado es false, por lo que ése es el valor que se observa
en pantalla.
La línea 19 imprime el resultado de la operación !false.
El resultado que se imprime es true.
3.4Sentencia de selección if
Los operadores estudiados anteriormente permiten con-
dicionar el flujo de la ejecución en los programas, ahora se
necesita conocer las instrucciones que permiten agrupar
sentencias que se ejecutarán con base en condiciones
establecidas.
La sentencia de control de flujo más básica es la instruc-
ción if. La instrucción if evalúa una condición, y si ésta
es verdadera, es decir, da como resultado true, entonces
ejecuta un conjunto de instrucciones. En general, la sintaxis
de la instrucción if se muestra en la figura 3.5.
if ( CONDICIÓN ) {
SENTENCIAS A REALIZAR
}
Figura 3.5 | Sintaxis de la sentencia if
65
La sentencia if espera un valor de verdad dentro de los
paréntesis, éste es un valor de tipo boolean, es decir, se
espera un valor true o un valor false. Evidentemente, no
tendría mucho sentido asignar directamente un valor true o
false. Generalmente, se tendrá una operación condicional
que sirva para determinar si el conjunto de instrucciones se
debe, o no, de ejecutar. Veamos cómo utilizar la instrucción
if en un programa.
InstruccionIf.java
1 import java.util.Scanner;
2 public class InstruccionIf {
3 public static void main(String[] args) {
4 Scanner entrada= new Scanner(System.in);
5
6 System.out.print(“Ingrese una edad: “);
7 int edad = entrada.nextInt();
8
9 if( edad >= 18 ){
10 System.out.println(“Mayor de edad”);
11 }
12 System.out.println(“Adiós!”);
13 } // Fin del método main
14 } // Fin de la clase InstruccionIf
66
“Mayor de edad”. A continuación, se analiza con mayor
detalle el programa.
Las líneas 1 y 4, se han estado utilizando en los programas
en los que se solicitan datos de entrada al usuario. La línea 6
imprime el texto “Ingrese una edad: “, para indicar
al usuario la acción que debe realizar. La línea 7 define la va-
riable edad, ésta es de tipo int, y el valor asignado es aquél
que devuelva el método nextInt, mismo que se encarga de
leer el valor que el usuario introduce por teclado.
En la línea 9 se hace uso de la instrucción if. La operación
dentro de los paréntesis indica la condición para que las sen-
tencias dentro del cuerpo del if sean ejecutadas. El cuerpo
de la instrucción if, es decir, el inicio y el final, están delimi-
tadas por las llaves de apertura y cierre, { }. En la figura 3.6
se muestra la ejecución cuando el usuario introduce una edad
de 18, la condición a evaluar por la instrucción if es edad
>= 18, para el ejemplo de esta ejecución, el valor de la varia-
ble edad es 18, por lo que la operación a evaluar es si 18 es
mayor o igual a 18, la respuesta es true porque aunque 18
no es mayor a 18, 18 sí es igual a 18, y la condición que se pide
es que 18 sea mayor o igual a 18. En vista de que la condición
se cumple, entonces, todas las instrucciones encerradas por
las llaves de la instrucción if son ejecutadas, en este progra-
ma, se imprime Mayor de edad.
Si se ejecuta nuevamente el programa de la figura 3.6,
pero en esta ocasión se ingresa como edad el valor de 17 se
observa que el resultado es distinto:
Ingrese una edad: 17
Adiós!
Al ingresar como edad el valor de 17, la condición de la línea
9 del código, edad >= 18, no se cumple, por lo que la
línea 10 del programa no se ejecuta. Sin embargo, la línea 12,
siempre se ejecutará, independientemente de que se cumpla
67
o no la condición de la instrucción if, puesto que la línea 12
no se encuentra dentro del cuerpo de la sentencia if.
if ( CONDICIÓN ) {
SENTENCIAS A REALIZAR
}else{
SENTENCIAS A REALIZAR
}
Figura 3.7 | Sintaxis de la sentencia if-else
InstruccionIfElse.java
1 import java.util.Scanner;
2 public class InstruccionIfElse {
3 public static void main(String[] args) {
Scanner entrada= new Scanner(System.
4 in);
5
68
6 System.out.print(“Ingrese una edad: “);
7 int edad = entrada.nextInt();
8
9 if( edad >= 18 ){
10 System.out.println(“Mayor de edad”);
11 }else{
12 System.out.println(“Menor de edad”);
13 }
14 System.out.println(“Adiós!”);
15 } // Fin del método main
16 } // Fin de la clase InstruccionIfElse
69
Ingrese una edad: 18
Mayor de edad
Adiós!
70
InstruccionSwitch.java
1 import java.util.Scanner;
2 public class InstruccionSwitch {
3 public static void main(String[] args) {
4 Scanner entrada= new Scanner(System.in);
5
6 System.out.print(
“Ingrese un número de mes: “);
7 int mes = entrada.nextInt();
8 switch( mes ){
9 case 1: System.out.println(“Enero”);
10 break;
11 case 2: System.out.println(“Febrero”);
12 break;
13 case 3: System.out.println(“Marzo”);
14 break;
15 case 4: System.out.println(“Abril”);
16 break;
17 case 5: System.out.println(“Mayo”);
18 break;
19 case 6: System.out.println(“Junio”);
20 break;
21 case 7: System.out.println(“Julio”);
22 break;
23 case 8: System.out.println(“Agosto”);
24 break;
25 case 9: System.out.println(
“Septiembre”);
26 break;
27 case 10: System.out.println(
“Octubre”);
28 break;
71
29 case 11: System.out.println(
“Noviembre”);
30 break;
31 case 12: System.out.println(
“Diciembre”);
32 break;
33 default: System.out.println(
“No válido”);
34 break;
35 } // Fin de la instrucción switch
36 } // Fin del método main
37 } // Fin de la clase InstruccionSwitch
8 switch( mes ){
La línea 9,
9 case 1: System.out.println(“Enero”);
72
dos puntos, :, éste indica el inicio de las sentencias que son
ejecutadas para dicho caso. Para este caso, la única instruc-
ción a ejecutar es la tarea de imprimir el texto “Enero”. Para
indicar el final del conjunto de instrucciones a ser ejecutadas
en dicho caso, es necesario poner la palabra reservada break,
de este modo se termina la ejecución de la instrucción switch.
La sentencia break es colocada en la línea 10, ésta indica el
final de las instrucciones para el caso.
3.7Sentencia if-else-if
Algunos programadores consideran que la instrucción
switch no es recomendable si lo que se pretende es generar
código limpio, es decir, código que se lea y entienda fácilmen-
te. En este libro no encontrará una opinión con respecto a
dicha polémica, por otro lado, se muestra la forma de realizar
73
el mismo objetivo de la instrucción switch a través de la
instrucción if-else.
En la figura 3.10 se hizo uso de la instrucción switch para
mostrar el nombre del mes con base en un valor entero reci-
bido por parte del usuario, la figura 3.11 muestra un progra-
ma que realiza las mismas acciones utilizando la instrucción
if-else.
InstruccionIfElseIf.java
1 import java.util.Scanner;
2 public class InstruccionIfElseIf {
3 public static void main(String[] args) {
4 Scanner entrada= new Scanner(System.
in);
5
6 System.out.print(
“Ingrese un número de mes: “);
7 int mes = entrada.nextInt();
8
9 if( mes == 1 ) {
10 System.out.println(“Enero”);
11 }else if( mes == 2){
12 System.out.println(“Febrero”);
13 }else if( mes == 3){
14 System.out.println(“Marzo”);
15 }else if( mes == 4){
16 System.out.println(“Abril”);
17 }else if( mes == 5){
18 System.out.println(“Mayo”);
19 }else if( mes == 6){
20 System.out.println(“Junio”);
21 }else if( mes == 7){
22 System.out.println(“Julio”);
74
23 }else if( mes == 8){
24 System.out.println(“Agosto”);
25 }else if( mes == 9){
26 System.out.println(“Septiembre”);
27 }else if( mes == 10){
28 System.out.println(“Octubre”);
29 }else if( mes == 11){
30 System.out.println(“Noviembre”);
31 }else if( mes == 12){
32 System.out.println(“Diciembre”);
33 }else{
34 System.out.println(“No válido”);
35 } // Fin de la instrucción if-else
36 } // Fin del método main
37 } // Fin de la clase InstruccionIfElseIf
9 if( mes == 1 ) {
75
en lugar de poner la apertura de llaves, {, se usa una nueva
instrucción if para comprobar si el valor de la variable mes es
igual a 2. Al final de la línea, ahora sí, se coloca la apertura de
llaves, {, para indicar el inicio del conjunto de sentencias que
serán ejecutadas si es que se cumple la condición.
33 }else{
76
se define el cuerpo de la instrucción while, es decir, donde
irán las instrucciones que se ejecutarán de forma repetitiva.
La figura 3.12 muestra la sintaxis de la instrucción while.
while ( CONDICIÓN ) {
SENTENCIAS A REALIZAR
}
Figura 3.12 | Sintaxis de la sentencia if
ImprimiendoTextos.java
1 public class ImprimiendoTextos {
2 public static void main(String[] args) {
3 System.out.println(“Texto 1”);
4 System.out.println(“Texto 2”);
5 System.out.println(“Texto 3”);
6 System.out.println(“Texto 4”);
7 System.out.println(“Texto 5”);
8 System.out.println(“Texto 6”);
9 System.out.println(“Texto 7”);
10 System.out.println(“Texto 8”);
11 System.out.println(“Texto 9”);
77
12 System.out.println(“Texto 10”);
13 } // Fin del método main
14 } // Fin de la clase ImprimiendoTextos
Texto 1
Texto 2
Texto 3
Texto 4
Texto 5
Texto 6
Texto 7
Texto 8
Texto 9
Texto 10
InstruccionWhile.java
1 public class InstruccionWhile {
2 public static void main(String[] args) {
3 int numero = 1;
4 while( numero <= 10 ){
5 System.out.println(“Texto “ + numero);
6 numero = numero + 1;
7 }
8 } // Fin del método main
9 } // Fin de la clase InstruccionesWhile
78
Texto 1
Texto 2
Texto 3
Texto 4
Texto 5
Texto 6
Texto 7
Texto 8
Texto 9
Texto 10
79
1 + 1. En vista de que se llega al cierre del cuerpo de la ins-
trucción while, se vuelve a evaluar la condición de numero
<= 10, la cual es true como resultado, puesto que en ese
momento, numero posee el valor de 2, por lo que al evaluar
2 <= 10, la respuesta es true. En la segunda ejecución
de las instrucciones dentro de while, se imprime el texto
Texto 2, y en la línea 6, se asigna a la variable numero la
suma del valor actual de la variable número más 1, es decir,
se asigna el resultado de 2 + 1. Nuevamente, se llega al
final del cuerpo de la instrucción while, por lo que, se evalúa
nuevamente la condición del while, en ese momento, la
variable numero posee el valor de 3, por lo que la condición
sigue siendo verdadera. Todo el proceso se repite hasta que
en cierto momento a la variable numero le es asignado el
valor de 11, y deja de ser verdadera la condición del while,
por lo que las instrucciones dentro del cuerpo de ésta ya no
son ejecutadas.
Como se observa, la instrucción while es una poderosa
estructura disponible para ejecutar instrucciones repetitivas,
sin embargo, se deben realizar las modificaciones necesarias
dentro del cuerpo de la instrucción while, para que en
algún momento la condición que se haya establecido deje de
devolver true como respuesta, de lo contrario, las repeti-
ciones nunca terminarían, es decir, se estaría entrando en un
ciclo infinito.
80
hemos resaltado el fragmento en el que se define la variable
numero, la condición establecida en la instrucción while
y la asignación realizada a la variable numero dentro del
cuerpo del while.
int numero = 1;
while( numero <= 10 ){
System.out.println(“Texto “ + numero);
numero = numero + 1;
}
Figura 3.14 | Ejemplo de una instrucción while
81
por defecto en la instrucción for. La figura 3.15 muestra la
sintaxis de la estructura for.
InstruccionFor.java
1 public class InstruccionFor {
2 public static void main(String[] args) {
3 for(int numero=1; numero<=10;
numero=numero+1){
4 System.out.println(“Texto “ + numero);
5 }
6 } // Fin del método main
7 } // Fin de la clase InstruccionFor
Texto 1
Texto 2
Texto 3
Texto 4
Texto 5
Texto 6
Texto 7
Texto 8
Texto 9
Texto 10
82
variable de control. Nótese cómo al ejecutar el programa de
la figura 3.16, se obtiene el mismo resultado de la figura 3.13.
Entonces, ¿es conveniente utilizar la instrucción while
o utilizar la instrucción for? Por el momento, consideran-
do que apenas se están conociendo los fundamentos de la
programación, se sugiere utilizar la instrucción que domine
mejor. Con la experiencia, se descubrirán los beneficios de uti-
lizar una u otra instrucción con base en el problema a resolver.
InstruccionDoWhile.java
1 import java.util.Scanner;
2 public class InstruccionDoWhile {
3 public static void main(String[] args) {
4 Scanner entrada= new Scanner(System.
in);
5 int respuesta = 0;
6 do{
7 System.out.println(“1) Opción A”);
8 System.out.println(“2) Opción B”);
9 System.out.println(“3) Salir”);
83
10 System.out.print(
“Elija una opción: “);
11 respuesta = entrada.nextInt();
12
13 System.out.println(
“Elegiste la opción “ + respuesta);
14 System.out.println();
15 }while( respuesta != 3 );
16 System.out.println(“Adiós!”);
17 } // Fin del método main
18 } // Fin de la clase InstruccionDoWhile
1) Opción A
2) Opción B
3) Salir
Elija una opción: 1
Elegiste la opción 1
1) Opción A
2) Opción B
3) Salir
Elija una opción: 2
Elegiste la opción 2
1) Opción A
2) Opción B
3) Salir
Elija una opción: 3
Elegiste la opción 3
Adiós!
84
todas las sentencias dentro de las llaves, { }, son ejecutadas
de forma inmediata la primera vez. El cierre de llave, }, indica
el final del cuerpo del do, y se debe agregar inmediatamente
la palabra reservada while, con la condición a evaluar, fi-
nalizando con punto y coma, ;, de lo contrario, se obtiene un
error al intentar compilar el código.
Las sentencias de la línea 7 a la línea 14 corresponden con
las acciones a realizar, por lo menos, una vez. De la línea 7 a
la 10 se imprime en pantalla un menú de opciones. En la línea
11, se lee el valor numérico ingresado por el usuario. La línea
13 imprime el texto que indica el número de opción que el
usuario introduce. La línea 14 imprime un salto de línea.
La línea 15 indica el final del bloque de sentencias de do,
y se define la condición a evaluar dentro del while que de-
termina si las sentencias dentro del bloque do deben o no
ser ejecutadas nuevamente. En este programa, las sentencias
del bloque do son ejecutadas nuevamente, mientras el valor
que tiene la variable respuesta no sea igual a 3. En la eje-
cución mostrada en la figura 3.17, la primera vez se ingresa el
valor de 1, por lo que la variable respuesta toma el valor
de 1. Posteriormente se imprime nuevamente el menú y se
introduce el valor de 2, por lo que en esa ocasión la varia-
ble respuesta toma el valor de 2. La condición, para ter-
minar con las repeticiones, sigue devolviendo true, por lo
que se imprime nuevamente el menú, pero el valor ingresado
en esta ocasión es 3. Así, la condición deja de ser verdadera,
es decir, respuesta != 3 devuelve false, por lo que
no se ejecutan más repeticiones. Con eso termina la instruc-
ción do-while. Por último, la línea 16 imprime en pantalla el
texto Adiós!.
85
3.11 Instrucciones break y continue
Existen dos instrucciones disponibles dentro de las es-
tructuras de repetición: break y continue. La instrucción
break permite terminar una estructura de repetición por
completo, independientemente de que sea una instrucción
while, for o do-while. La instrucción continue permite
finalizar una repetición, es decir, sólo va a interrumpe la ejecu-
ción de las sentencias de la repetición en la que se encuentra
en ese momento, pero la estructura continuará con el resto
de las repeticiones.
Analicemos cómo funcionan las instrucciones break y
continue. Primeramente, se revisa el modo en que trabaja
la instrucción break. La figura 3.18 muestra un programa
que usa la instrucción break.
1 2 3 4 5 6
86
la que se define una variable de nombre numero, que es
inicializada con el valor de 1. Esta variable se usa dentro de
la condición for, para controlar el ciclo de repetición. En
la instrucción for, se establece que con cada repetición,
el valor de la variable numero es incrementado en uno. En
general, el programa pretende imprimir los valores del 1 al 10.
Para lograrlo, en la línea 7, se imprime el valor que posee la
variable numero y se agrega un espacio en blanco.
Al observar el resultado de ejecutar el programa, se
aprecia que únicamente se imprimen los valores del 1 al
6. Esto sucede porque con cada repetición, en la línea 4 se
pregunta si el valor de la variable numero es igual a siete,
numero == 7. Durante las primeras 6 ejecuciones, la condi-
ción no es verdadera, sin embargo, en la repetición en el que
la variable numero tiene asignado el valor de 7, la condición
sí se cumple, por lo que se ejecuta la instrucción break. La
instrucción break, al ser utilizada dentro de una estructura
de repetición, como en este caso, termina por completo con
las repeticiones, por lo que la instrucción for es finalizada,
teniendo como resultado, que únicamente fueran impresos
los valores del 1 al 6.
Ahora, ¿cómo trabaja la instrucción continue? La figura
3.19 muestra un programa similar al anterior, el de la figura
3.18, con la única diferencia de que en lugar de hacer uso de
la instrucción break, se usa la instrucción continue. Ob-
sérvese el resultado de ejecutar este programa.
InstruccionContinue.java
1 public class InstruccionContinue {
2 public static void main(String[] args) {
3 for(int numero=1; numero<=10;
numero=numero+1){
4 if( numero == 7 ){
5 continue;
87
6 }
7 System.out.print( numero + “ “ );
8 }
9 } // Fin del método main
10
} // Fin de la clase InstruccionContinue
1 2 3 4 5 6 8 9 10
Figura 3.19 | Uso de la instrucción continue dentro una
estructura de repetición
3.12Conclusión
En el capítulo anterior se hizo uso de la estructura secuen-
cial, la más básica de todas. En este capítulo se conocieron las
estructuras de selección y de repetición. Todas las estructuras
aprendidas hasta el momento, la secuencial, la de selección y
la de repetición, corresponden a las estructuras de control,
parte importante de la mayoría de los lenguajes de progra-
mación. Así también, se usaron los operadores relacionales,
de igualdad y los operadores lógicos. Todos estos operadores
son parte importante de las estructuras de selección y repeti-
ción, pues nos resultan útiles para la creación de condiciones
a asignar en dichas estructuras.
88
4.Arreglos
4.1Introducción
Generalmente, cuando se crean programas, se declaran
e inicializan variables para realizar operaciones. Éstas son
muy útiles para guardar de manera temporal, valores a uti-
lizar durante la ejecución de los programas. En este capítulo
se estudian los arreglos, mismos que brindan la posibilidad
de tener un contenedor de valores u objetos de cierto tipo.
Éstos son útiles cuando existe la necesidad de almacenar un
conjunto de valores de un mismo tipo, tal vez un conjunto de
calificaciones, un conjunto de nombres de personas, un con-
junto de temperaturas; los ejemplos son muy variados. Con
seguridad, en algún momento, el uso de los arreglos facilitará
las operaciones de los programas que se realicen.
89
Primer Último
índice índice
Índices: 0 1 2 3 4 5 6
Valores: “AB” “CD” “EF” “GH” “IJ” “KL” “ST”
Figura 4.1 | Arreglo de 10 elementos
90
valores de tipo String y al mismo tiempo contenga datos de
tipo double.
Ya se mostró cómo crear un arreglo, y entonces, ¿cómo se
asigna un valor? Para ello, se escribe el nombre de nuestro
arreglo, y entre los corchetes de apertura y cierre, se indica
el índice en el que se desea asignar un valor. Por ejemplo, la
sentencia
arregloTextos[0] = “PRIMERO”;
System.out.println( arregloTextos[0] );
ArreglosEnteros.java
1 public class ArregloEnteros {
2 public static void main(String[] args) {
3 int[] numeros = new int[5];
4
5 for(int indice=0; indice<5;
indice=indice+1){
6 System.out.println(“Índice: “+ indice
+ “, Valor: “ + numeros[indice]);
7 }
8 System.out.println();
9
91
10 numeros[0] = 10;
11 numeros[1] = 30;
12 numeros[2] = 50;
13 numeros[3] = 70;
14 numeros[4] = 90;
15
16 for(int indice=0; indice<5; indice++ ){
17 System.out.println(“Índice: “+ indice
+ “, Valor: “ + numeros[indice]);
18 }
19 } // Fin del método main
20 } // Fin de la clase ArregloEnteros
Índice: 0, Valor: 0
Índice: 1, Valor: 0
Índice: 2, Valor: 0
Índice: 3, Valor: 0
Índice: 4, Valor: 0
Índice: 0, Valor: 10
Índice: 1, Valor: 30
Índice: 2, Valor: 50
Índice: 3, Valor: 70
Índice: 4, Valor: 90
Figura 4.2 | Programa de Arreglo de enteros
92
5 elementos, es decir, se pueden guardar valores desde el
índice 0 hasta el índice 4.
En la línea 5, se implementa una instrucción for con una
variable de control de nombre indice que está inicializada
con el valor de 0. Se establece que la condición es que, se rea-
lizarán repeticiones mientras la variable indice sea menor
al valor de 5, y al final, se define que con cada repetición a la
variable índice, le será asignado el valor que posee, más 1.
La línea 6 recupera el valor de la variable indice y el
valor del arreglo numeros en el índice que tenga la variable
indice para mostrarlos en pantalla al concatenarlos con los
textos “Índice: “ y “, Valor: “. Para la primera eje-
cución de la instrucción for, indice posee el valor de 0,
por lo que numeros[indice] devuelve el valor que posee
el arreglo numeros en el índice 0. En la siguiente repeti-
ción, se muestra el valor del arreglo numeros en el índice
1, y así progresivamente hasta el índice 4. Cuando la variable
indice posee el valor de 5, se deja de cumplir la condición
del for y se da por terminada la instrucción.
El resultado de la instrucción for, anteriormente descrita,
muestra como salida:
Índice: 0, Valor: 0
Índice: 1, Valor: 0
Índice: 2, Valor: 0
Índice: 3, Valor: 0
Índice: 4, Valor: 0
93
capítulo, se abordará el tema de la inicialización de valores
por defecto en los arreglos.
En la línea 10, se realiza la asignación del valor 10 al arreglo
numeros en el índice 0; en la línea 11 el valor de 30 en el
índice 1; en la línea 12 el valor de 50 en el índice 2; en la línea
13 el valor de 70 en el índice 3, y por último, en la línea 14
se asigna el valor de 70 en el índice 4 del arreglo numeros.
La línea 16 implementa una instrucción for, similar a la
que fue definida en la línea 5, sin embargo, se observa que en
la última parte de la instrucción, se visualiza indice++, en
lugar de la operación indice=indice+1. Esto ha sido rea-
lizado de manera intencional para que se conozca el operador
++. Para este ejemplo, el operador ++ realiza exactamente
lo mismo que la operación indice=indice+1, es decir,
incrementa en 1 el valor que posee la variable y lo asigna a
ésta. Se puede utilizar cualquiera de las dos formas en los
programas.
Las impresiones de pantalla realizadas por la sentencia de
la línea 17 muestran los valores de cada uno de los índices del
arreglo numeros.
Índice: 0, Valor: 10
Índice: 1, Valor: 30
Índice: 2, Valor: 50
Índice: 3, Valor: 70
Índice: 4, Valor: 90
94
valores dependen del tipo de dato que almacena el arreglo.
En la figura 4.3, se muestran los valores por defecto que son
asignados a los arreglos, según el tipo de dato.
InicializacionArreglos.java
1 public class InicializacionArreglos {
2 public static void main(String[] args) {
3 int[] intArreglo = new int[4];
4 double[] doubleArreglo = new double[4];
5 char[] charArreglo = new char[4];
6 boolean[] booleanArreglo=new boolean[4];
7 String[] stringArreglo = new String[4];
95
8
9 for(int indice=0; indice<4; indice++){
10 System.out.print(
intArreglo[indice] + “-” );
11 }
12 System.out.println();
13
14 for(int indice=0; indice<4; indice++){
15 System.out.print(
doubleArreglo[indice] + “-” );
16 }
17 System.out.println();
18
19 for(int indice=0; indice<4; indice++){
20 System.out.print(
charArreglo[indice] + “-” );
21 }
22 System.out.println();
23
24 for(int indice=0; indice<4; indice++){
25 System.out.print(
booleanArreglo[indice] + “-” );
26 }
27 System.out.println();
28
29 for(int indice=0; indice<4; indice++){
30 System.out.print(
stringArreglo[indice] + “-” );
31 }
32 System.out.println();
33 } // Fin del método main
34 } // Fin de la clase InicializacionArreglos
96
0-0-0-0-
0.0-0.0-0.0-0.0-
- - - -
false-false-false-false-
null-null-null-null-
Figura 4.4 | Programa de arreglos de diferentes tipos.
97
La línea 19, 20 y 21,
98
Todo arreglo que no sea de algún tipo de dato primitivo, sus
valores son inicializados como null.
DiasSemana.java
1 class DiasSemana {
2 public static void main(String[] args) {
3 String[] dias = {“LUN”, “MAR”, “MIE”,
“JUE”,”VIE”,”SAB”,”DOM”};
4
5 for(int indice=0; indice<dias.length;
indice++){
99
6 System.out.println( dias[indice] );
7 }
8 } // Fin del método main
9 } // Fin de la clase DiasSemana
LUN
MAR
MIE
JUE
VIE
SAB
DOM
100
LUN
MAR
MIE
JUE
VIE
SAB
DOM
ForMejorado.java
1 class ForMejorado {
2 public static void main(String[] args) {
3 String[] dias = {“LUN”, “MAR”, “MIE”,
“JUE”,”VIE”,”SAB”,”DOM”};
4
5 for( String dia : dias ){
101
6 System.out.println( dia );
7 }
8 } // Fin del método main
9 } // Fin de la clase ForMejorado
LUN
MAR
MIE
JUE
VIE
SAB
DOM
102
mentos del arreglo dias hayan sido leídos. Al finalizar la eje-
cución del programa, se visualiza en pantalla la impresión de
todos los elementos del arreglo dias.
LUN
MAR
MIE
JUE
VIE
SAB
DOM
4.6Conclusión
En este capítulo, se mostraron los arreglos y cómo inicializar-
los. Los valores que son inicializados por defecto, se enseñaron
a recorrer los arreglos a través de la instrucción for y con for
mejorado. Los arreglos permiten trabajar con un conjunto de
valores del mismo tipo en un único objeto y brindan beneficios
al trabajar en la construcción de los programas. Éstos ayudan
a reducir código, mejorar la lectura de del código, y permiten
trabajar de forma más natural. En el siguiente capítulo se tiene
una introducción al paradigma de la Programación Orientada a
Objetos (POO); se identificarán los fundamentos y la forma en
que se utiliza en Java.
103
5.Introducción de la POO
5.1Introducción
La programación actual es un proceso que ha ido evolucio-
nando. Existen diferentes estilos para programar. A esto se le
conoce como paradigma. Un paradigma dice cuáles son las
características para un determinado estilo de programación.
Los lenguajes de programación se apegan a estas caracterís-
ticas, y por eso se dice que cierto lenguaje de programación
es de tal o cual paradigma. Java fue creado con base en las
características del paradigma de la Programación Orientada
a Objetos (POO). Es común hacer referencia a este paradigma
como POO, y a veces como OOP, por sus iniciales en inglés,
Object-oriented programming. De aquí en adelante, en este
libro, se hará referencia a este paradigma como POO.
En este capítulo, se mencionan características básicas de
la POO, y se muestran principalmente los métodos. Se ilustra
cómo definir los métodos en las clases, y se comprueba el fun-
cionamiento de éstos.
105
5.2Paradigma de la POO
Hace algunos años, la programación se realizaba a través de
sentencias. Los programas eran ejecutados de forma lineal, es
decir, los programas contaban con una lista de instrucciones,
pero no existían otras estructuras de control. Con el tiempo,
se incorporaron las estructuras de control, y posteriormente
se comenzaron a crear estilos de programación en los que se
permitía la modularidad, es decir, dividir el código del pro-
grama en fragmentos separados.El objetivo, realmente, no es
entrar en detalles históricos, por lo que estos serán tratados
en términos generales.
Conforme los años pasaron, se crearon diferentes estilos
de programación, es decir, diferentes paradigmas. La POO fue
uno de ellos. A diferencia de los otros paradigmas, la POO
incorporaba la clasificación y creación de entidades. Este pa-
radigma comenzó a popularizarse y actualmente es el para-
digma de mayor uso en la programación.
5.3Abstracción
La unidad básica de la POO es la clase. En Java, no es posible
crear un programa sin antes tener una clase, pero realmente,
¿qué representan las clases?
Si se deja de pensar por un momento en la programación.
Los seres humanos utilizan la clasificación para, prácticamen-
te, todo. Se clasifican a las comunidades por Continentes,
Países, Estados, Ciudades. Se clasifican a los animales, según
su estructura; con base en su alimentación, según la forma en
que se reproducen. Se clasificamos los colores en primarios y
secundarios. La clasificación permite organizar y conocer las
características de un grupo de entidades. Esta forma de pen-
samiento fue llevado a la programación, donde se pensó en
entidades con sus atributos y comportamientos.
En este punto ya se tiene una idea de la forma en que se
trabaja la POO. Como ya se mencionó, la clase es la unidad
básica de trabajo en la POO. La clase es la representación de una
entidad a trabajar en los programas. Está tendrá características
y comportamientos, por ejemplo, una clase Automóvil podría
tener las características de número de puertas, tipo de combus-
tible, marca y modelo, y podría tener los comportamientos de
acelerar, frenar, encender, apagar. A esta representación dentro
de los programas, se le conoce como abstracción.
La abstracción es una representación más simple de algo
complejo. Si se desea utilizar la representación de las perso-
nas, seguramente será creada una clase Persona con las ca-
racterísticas que se desean trabajar en los programas. En ella,
se establece que la clase Persona tendrá un nombre, un
apellido paterno, un apellido materno, una edad, un peso, et-
cétera. Al crear una abstracción de las personas, sólo son con-
sideradas las características de las personas que interesan ser
trabajadas en el programa. En la figura 5.1, se trabaja con la
abstracción para crear una clase Persona, sin embargo, será
abordado rápidamente el concepto de los campos antes de
analizar el programa de la figura 5.1.
5.4Campos
Cuando se define una clase, se especifican las caracterís-
ticas con las que va a contar el futuro objeto. Las clases son
definidas por atributos y comportamientos. Los atributos son
las variables definidas en el cuerpo de la clase. Éstas son lla-
madas campos. También se conocen como variables de ins-
tancia, en este libro, se hace referencia a los atributos de la
107
clase como campos. Los comportamientos son las acciones
que el objeto puede realizar. Éstos, son conocidos dentro de
la clase como métodos, sin embargo, a los métodos, se abor-
darán en el siguiente tema. Por ahora el enfoque principal co-
rresponde en entender los campos.
Persona.java
1 package c05.p01;
2
3 class Persona {
4 String nombre;
5 String apellidoPaterno;
6 String apellidoMaterno;
7 int edad;
8 int peso;
9 } // Fin de la clase Persona
PruebaPersona.java
1 package c05.p01;
2
3 class PruebaPersona {
4 public static void main(String[] args) {
5 Persona persona1 = new Persona();
6
7 // Se imprimen los valores iniciales del objeto
“persona1”
8 System.out.println( “Nombre: “ +
persona1.nombre);
9 System.out.println(“Ap. Paterno: “ +
persona1.apellidoPaterno);
108
10 System.out.println(“Ap. Materno: “ +
persona1.apellidoMaterno);
11 System.out.println(“Edad: “ +
persona1.edad );
12 System.out.println(“Peso: “ +
persona1.peso );
13
14 // Se asignan valores a los campos del objeto “persona1”
15 persona1.nombre = “Alex”;
16 persona1.apellidoPaterno = “Torres”;
17 persona1.apellidoMaterno = “Flores”;
18 persona1.edad = 20;
19 persona1.peso = 56;
20
21 // Se imprimen los valores del objeto “persona1”
22 System.out.println();
23 System.out.println(“Nombre: “ +
persona1.nombre);
24 System.out.println(“Ap. Paterno: “ +
persona1.apellidoPaterno);
25 System.out.println(“Ap. Materno: “ +
persona1.apellidoMaterno);
26 System.out.println(“Edad: “ +
persona1.edad);
27 System.out.println(“Peso: “ +
persona1.peso );
28
29 } // Fin del método main
30 } // Fin de la clase PruebaPersona
109
Nombre: null
Ap. Paterno: null
Ap. Materno: null
Edad: 0
Peso: 0
Nombre: Alex
Ap. Paterno: Torres
Ap. Materno: Flores
Edad: 20
Peso: 56
3 class Persona {
1 package c05.p01;
110
La palabra reservada package, se utiliza para agrupar un
conjunto de clases, y que Java esté enterado de ello. Más ade-
lante, en este capítulo, se retoma el tema de los paquetes con
mayor detalle. c05.p01 significa que la clase se encuentra
dentro de una carpeta de nombre p01, y esta carpeta se en-
cuentra dentro de una carpeta de nombre c05. Es importante
respetar la información que se define, por lo que, es necesa-
rio guardar el archivo de la clase dentro de las carpetas men-
cionadas. Un ejemplo de una probable ruta al archivo sería
c:\ejercicios\c05\p01\Persona.java, independientemente de
dónde se encuentre ubicada la carpeta c05. Lo importante es
que el archivo Persona.java esté dentro de una carpeta p01, y
a su vez, esta carpeta esté dentro de una carpeta de nombre
c05. Otro dato importante, que no debe de olvidar, es que el
nombre del archivo debe ser exactamente igual al nombre de
la clase. Esto incluye los caracteres en minúsculas y mayúscu-
las. Si se nombra a la clase como Persona, el archivo se debe
guardar como Persona.java. Si se nombra al archivo como
persona.java, la compilación fallará. Para compilar la clase
Persona, se debe realizar de la siguiente manera:
111
La clase Persona (figura 5.1) no cuenta con un método
main, por lo que, ésta no puede ser ejecutada como un pro-
grama. Para probar el funcionamiento de la clase Persona,
se ha creado una clase llamada PruebaPersona, la cual sí
incluye un método main con las características necesarias
para poder ser ejecutada la clase como un programa. La clase
PruebaPersona se muestra en la figura 5.2.
La clase PruebaPersona también indica en la línea 1,
1 package c05.p01;
112
Por el momento, no es necesario la comprensión de cómo
funcionan los paquetes. En otros temas, más adelante, se co-
nocerá con mayor detalle el funcionamiento de los paquetes.
Sin embargo, es importante conocer la forma de ejecutar los
programas que se realicen de aquí en adelante.
Al analizar el funcionamiento de la clase PruebaPerso-
na. En la línea 5,
113
es un comentario de línea que ofrece información sobre las
acciones que serán realizadas.
En la línea 8,
8 System.out.println(“Nombre:
“+persona1.nombre);
114
“Peso: “, puesto que el campo peso es de tipo int y
aún no tiene asignado un valor. Java le asigna por defecto el
valor de 0, es así como el texto que se imprime en pantalla es
“Peso: 0”.
115
objeto persona1, sin embargo, en vista de que, en las líneas
anteriores, a cada uno de los campos les fue asignado un
valor, el resultado en este caso es:
Nombre: Alex
Ap. Paterno: Torres
Ap. Materno: Flores
Edad: 20
Peso: 56
5.5Métodos
En las clases, se definen los atributos y comportamientos
con los que contará el objeto cuando éste sea creado. Por
cierto, el proceso de crear un objeto, a partir de una clase,
se conoce como instanciación, o simplemente, instanciar una
clase. Los atributos de la clase son los campos y los compor-
tamientos son los métodos. Los métodos son un conjunto de
instrucciones que son ejecutados cuando éstos son invocados,
y ¿cómo son invocamos? De forma similar a como se accede
a los campos, es decir, se menciona el objeto; se agrega el
símbolo de punto, .; y se menciona al método a invocar.
Los métodos son las acciones que el objeto puede realizar.
Una clase Extraterrestre, en un programa, podría tener
definidas las acciones de desplazarse; atacar; y tal vez, defen-
derse. Cada clase define tantos métodos como sean pertinen-
tes. Pero ¿cómo se crean los métodos? La sintaxis para definir
los métodos dentro de las clases se muestra en la figura 5.3.
116
Identificador
Nivel de Tipo de dato
(Nombre del Parámetros
acceso que devuelve
método)
public void imprimirTexto ( ){
// Sentencias a ejecutar
}
Figura 5.3 | Sintaxis de los métodos
117
5.6Convención de nombres de Clases, Campos y
Métodos
Tal vez note que en los nombres de las clases se han
creado en programas previos, comienzan con mayúsculas, y
cada palabra se ha puesto en mayúscula dejando el resto del
nombre en minúsculas. Por ejemplo, en la figura 5.2, fue de-
finida la clase PruebaPersona. Por convención, en Java, el
nombre de las clases se escribe en mayúsculas y minúsculas
con la primera letra de cada palabra en mayúsculas. Esto no
significa que, si no se aplica de este modo, el programa falla.
No, simplemente es una convención para asignar nombres a
las clases. Esto ayuda a mejorar la lectura de los programas, y
generalmente los programas especializados para el desarrollo
de programas incluyen esta convención.
Con respecto a los campos y los métodos, el nombre debe
iniciar con la primera letra en minúscula, y posteriormen-
te con la primera letra de cada palabra en mayúsculas. Por
ejemplo, algunos nombres de campos válidos son: apelli-
doPaterno, codigoPostal, entidadFederati-
va. Así también, algunos ejemplos de nombres válidos para
métodos son imprimirPersona, agregarRegistro,
eliminarUsuario.
Recuerde que la convención de los nombres de clases,
campos y métodos es un acuerdo para realizar el código de los
programas, y aunque no se obliga a seguir esta convención,
es una buena práctica apegarse a ella. Al mismo tiempo que
mejora la calidad como programadores en el desarrollo de
software.
118
5.7Métodos sin parámetros
En estos momentos, ya se ha trabajado con métodos. Al
imprimir texto en pantalla, se invoca al método print o
println. Al crear programas, se define el método main.
Al leer un valor entero del usuario. Se invoca al método
nextInt de la clase Scanner.
Ahora se aprenderá a definir métodos propios en una
clase. Anteriormente se identificó la sintaxis para definir los
métodos. Se mencionó que se establece el nivel de acceso;
el valor de retorno; un identificador; y dentro de los parén-
tesis los parámetros. Primero, se analizará y se procederá a
aprender a definir métodos sin parámetros que no retornan
valores. Para una clara comprensión, preste atención al pro-
grama de la figura 5.4.
Persona.java
1 package c05.p02;
2
3 class PruebaPersona {
4 String nombre;
5 String apellidoPaterno;
6 String apellidoMaterno;
7 int edad;
8 int peso;
9
10 public void imprimirCampos(){
11 System.out.println(“Nombre: “+nombre);
System.out.println(“Ap. Paterno: “ +
12 apellidoPaterno);
System.out.println(“Ap. Materno: “ +
13 apellidoMaterno);
14 System.out.println(“Edad: “ + edad);
119
15 System.out.println(“Peso: “ + peso);
16 } // Fin del método imprimirCampos
17
18 } // Fin de la clase Persona
PruebaPersona.java
1 package c05.p02;
2
3 class PruebaPersona {
4 public static void main(String[] args) {
5 Persona persona1 = new Persona();
6
7 // Se imprimen los valores iniciales del objeto “persona1”
8 persona1.imprimirCampos();
9 System.out.println();
10
11 // Se asignan valores a los campos del objeto “persona1”
12 persona1.nombre = “Alex”;
13 persona1.apellidoPaterno = “Torres”;
14 persona1.apellidoMaterno = “Flores”;
15 persona1.edad = 20;
16 persona1.peso = 56;
17
18 // Se imprimen los valores del objeto “persona1”
19 persona1.imprimirCampos();
20
21 } // Fin del método main
22 } // Fin de la clase PruebaPersona
120
Nombre: null
Ap. Paterno: null
Ap. Materno: null
Edad: 0
Peso: 0
Nombre: Alex
Ap. Paterno: Torres
Ap. Materno: Flores
Edad: 20
Peso: 56
1 package c05.p02;
121
final llevan los paréntesis. En este caso, se tiene un método
que no devuelve valores, por lo que es indicado con la palabra
reservada void. Así también, éste es un método que no re-
quiere información para ejecutar las sentencias, por lo que los
paréntesis permanecen vacíos. Más adelante, en este capítu-
lo, se abordan los métodos que definen parámetros.
122
5 Persona persona1 = new Persona();
8 persona1.imprimirCampos();
Nombre: null
Ap. Paterno: null
Ap. Materno: null
Edad: 0
Peso: 0
12 persona1.nombre = “Alex”;
13 persona1.apellidoPaterno = “Torres”;
14 persona1.apellidoMaterno = “Flores”;
15 persona1.edad = 20;
16 persona1.peso = 56;
123
En la línea 19,
19 persona1.imprimirCampos();
Nombre: Alex
Ap. Paterno: Torres
Ap. Materno: Flores
Edad: 20
Peso: 56
124
PruebaPersona.java
1 package c05.p03;
2
3 class PruebaPersona {
4 String nombre;
5 String apellidoPaterno;
6 String apellidoMaterno;
7 int edad;
8 int peso;
9
10 public void imprimirCampos(){
11 System.out.println(“Nombre: “+nombre)
12 System.out.println(“Ap. Paterno: “ +
apellidoPaterno );
13 System.out.println(“Ap. Materno: “ +
apellidoMaterno );
14 System.out.println(“Edad: “ + edad );
15 System.out.println(“Peso: “ + peso );
16 } // Fin del método imprimirCampos
17
18 } // Fin de la clase Persona
PruebaPersona.java
1 package c05.p03;
2
3 class PruebaPersona {
4 public static void main(String[] args) {
5 // Creación de objetos de tipo Persona
6 Persona persona1 = new Persona();
7 Persona persona2 = new Persona();
8 Persona persona3 = new Persona();
125
9
10 // Asignación de valores
11 persona1.nombre = “Alex”;
12 persona1.apellidoPaterno = “Torres”;
13 persona1.apellidoMaterno = “Flores”;
14 persona1.edad = 21;
15 persona1.peso = 56;
16
17 persona2.nombre = “Beto”;
18 persona2.apellidoPaterno = “Aguirre”;
19 persona2.apellidoMaterno = “Cruz”;
20 persona2.edad = 20;
21 persona2.peso = 61;
22
23 persona3.nombre = “Carla”;
24 persona3.apellidoPaterno = “Reyes”;
25 persona3.apellidoMaterno = “Uscanga”;
26 persona3.edad = 19;
27 persona3.peso = 58;
28
29 // Impresión en pantalla
30 persona1.imprimirCampos();
31 System.out.println();
32
33 persona2.imprimirCampos();
34 System.out.println();
35
36 persona3.imprimirCampos();
37
38 } // Fin del método main
39 } // Fin de la clase PruebaPersona
126
Nombre: Alex
Ap. Paterno: Torres
Ap. Materno: Flores
Edad: 21
Peso: 56
Nombre: Beto
Ap. Paterno: Aguirre
Ap. Materno: Cruz
Edad: 20
Peso: 61
Nombre: Carla
Ap. Paterno: Reyes
Ap. Materno: Uscanga
Edad: 19
Peso: 58
Figura 5.7 | Prueba de la clase Persona.
127
La línea 36 invoca al método imprimirCampos del
objeto persona3.
Lo importante del programa es comprender que cada uno
de los objetos creados a partir de la clase Persona, son di-
ferentes en el sentido de que cada uno de ellos cuenta con sus
propios valores en los campos, y que al invocar a alguno de
sus métodos, en este caso, al método imprimirCampos.
Las acciones corresponden con los valores que cada objeto
posee de forma independiente.
128
cado. En el ejemplo de la figura 5.8, el parámetro texto de
tipo String es una variable que se utiliza dentro del cuerpo
del método para llevar a cabo las acciones que se requieren.
La figura 5.9 y 5.10 muestran un ejemplo de cómo se define
un método con un parámetro y su invocación.
Operaciones.java
1 package c05.p04;
2
3 class Operaciones {
4
5 public void imprimirTexto(String texto){;
6 System.out.println( texto );
7 } // Fin del método imprimirTexto
8
9 } // Fin de la clase Operaciones
PruebaOperaciones.java
1 package c05.p04;
2
3 class PruebaOperaciones {
4 public static void main(String[] args) {
5 Operaciones operaciones =
new Operaciones();
6
7 operaciones.imprimirTexto(
“Primer Texto” );
8 operaciones.imprimirTexto(
“Segundo Texto” );
9 operaciones.imprimirTexto(
“Tercer Texto” );
10
129
11 } // Fin del método main
12 } // Fin de la Clase PruebaOperaciones
Primer Texto
Segundo Texto
Tercer Texto
130
5.9Métodos con varios parámetros
Los métodos no sólo definen un parámetro, en realidad, se
definen tantos parámetros como lo consideremos pertinente.
Para definir más de un parámetro, lo realizamos separando
por comas, ,, cada uno de los parámetros.
Tipo de Identificador
Nivel de
dato que (Nombre del Parámetros
acceso
devuelve método)
public void concatenar- (String text1,
Textos String text2){
// Sentencias a ejecutar
}
Figura 5.11 | Sintaxis de método con varios parámetros
131
13
14 } // Fin de la clase Operaciones
Figura 5.12 | Clase que define un método con un
parámetro
PruebaOperaciones.java
1 package c05.p05;
2
3 class PruebaOperaciones {
4 public static void main(String[] args) {
5 Operaciones operaciones =
new Operaciones();
6
7 operaciones.concatenarTexto(“Primero”,
“Segundo”);
8 operaciones.concatenarTexto(“Tercero”,
“Cuarto”);
9
10 operaciones.imprimirSuma(10,20);
11 operaciones.imprimirSuma(30,40);
12
13 } // Fin del método main
14 } // Fin de la Clase PruebaOperaciones
Primero Segundo
Tercero Cuarto
Suma: 30
Suma: 70
132
5 public void concatenarTexto( String texto1,
String texto2){
6 System.out.println(texto1 + “ “ + texto2);
133
7 operaciones.concatenarTexto(“Primero”,
“Segundo”);
8 operaciones.concatenarTexto(“Tercero”,
“Cuarto”);
10 operaciones.imprimirSuma(10,20);
11 operaciones.imprimirSuma(30,40);
134
5.10Métodos que devuelven datos
Los métodos se utilizan para ejecutar un conjunto de ins-
trucciones. Éstos pueden definir o no parámetros para llevar
a cabo las operaciones. Hasta el momento, únicamente se
han utilizado métodos que no retornan datos, sin embargo,
los métodos pueden entregarnos información. Cuando un
método retorna un dato como respuesta, primero se ejecutan
las instrucciones definidas dentro del cuerpo del método, y
una vez que se tiene el valor que se desea devolver, éste es
devuelto a través de la palabra reservada return.
Tipo de Identifica-
Nivel de
dato que dor (Nombre Parámetros
acceso
devuelve del método)
public int sumar ( int numero1, int numero2 ){
}
Figura 5.14 | Sintaxis de método que retorna un dato
135
obtiene un error al intentar compilar el código, por ejemplo, si
el método de la figura 5.14 no tuviera la línea con la sentencia
return suma;, al intentar compilar, se obtendría un error.
Operaciones.java
1 package c05.p06;
2
3 class Operaciones {
4
5 public int sumar(int numero1,int numero2)
{
6 int suma = numero1 + numero2;
7 return suma;
8 } // Fin del método sumar
9
10 public int restar( int numero1,
int numero2){
11 return numero1 - numero2;
12 } // Fin del método restar
13
14 public int cuadrado( int numero ){
15 return numero * numero;
16 } // Fin del método cuadrado
17
18 } // Fin de la clase Operaciones
Figura 5.15 | Clase que define un método con un
parámetro
136
PruebaOperaciones.java
1 package c05.p06;
2
3 class PruebaOperaciones {
4 public static void main(String[] args) {
5 Operaciones operaciones =
new Operaciones();
6
7 int resultado=operaciones.sumar(10, 20);
8 System.out.println( resultado );
9
10 System.out.println(
operaciones.restar(30,9) );
11
12 System.out.println(
operaciones.cuadrado(11) );
13
14 } // Fin del método main
15 } // Fin de la Clase PruebaOperaciones
30
21
121
137
En la clase Operaciones (figura 5.15), el primer método es
definido desde la línea 5 hasta la línea 8.
138
tica, en lugar de almacenar el resultado en una variable y devol-
verlo, tal como ocurre en el método sumar.
El último método definido en la clase Operaciones es el
método cuadrado en la línea 14.
Las líneas 7 y 8,
139
para que sea asignado a un parámetro. El valor devuelto por el
método sumar es asignado a la variable resultado. En la línea 8,
se imprime en pantalla el valor que posee la variable resulta-
do. Se puede observar que el resultado en pantalla es 30.
La línea 10,
10 System.out.println(
operaciones.restar(30,9) );
En la línea 12,
12 System.out.println(
operaciones.cuadrado(11) );
140
5.11Sobrecarga de métodos
La sobrecarga de métodos es una potente característica
que permite definir varios métodos con un mismo nombre
como identificador. Esto resulta muy útil para definir accio-
nes a realizar con base en los argumentos que son enviados
durante la invocación.
Si los métodos tienen el mismo nombre, ¿cómo Java de-
termina qué método ejecutar? Para determinar el método
a ser ejecutado, Java revisa los parámetros de los métodos
sobrecargados. Java no toma en cuenta el tipo de datos de
retorno o el nivel de acceso de éste. Java realizará la selección
con base en los parámetros. Esta selección está basada en el
número de parámetros y el tipo de dato de los parámetros.
Veamos un ejemplo de la sobrecarga de métodos.
Operaciones.java
1 package c05.p07;
2
3 class Operaciones {
4
5 public void mostrarDatos( int numero ){
6 System.out.println( “Parámetros: int” );
7 } // Fin del método mostrarDatos
8
9 public void mostrarDatos( String texto ){
10 System.out.println(
“Parámetros: String”);
11 } // Fin del método mostrarDatos
12
13 public void mostrarDatos( int numero,
String texto){
14 System.out.println(
“Parámetros: int, String”);
141
15 } // Fin del método mostrarDatos
16
17 public void mostrarDatos( String texto,
int numero ){
18 System.out.println(
“Parámetros: String, int” );
19 } // Fin del método mostrarDatos
20
21 } // Fin de la clase Operaciones
Figura 5.17 | Clase con métodos sobrecargados
PruebaOperaciones.java
1 package c05.p07;
2
3 class PruebaOperaciones {
4 public static void main(String[] args) {
5 Operaciones operaciones =
new Operaciones();
6
7 operaciones.mostrarDatos( 99 );
8 operaciones.mostrarDatos( “Hola” );
9 operaciones.mostrarDatos( 99, “Hola” );
10 operaciones.mostrarDatos( “Hola”, 99 );
11
12 } // Fin del método main
13 } // Fin de la Clase PruebaOperaciones
Parámetros: int
Parámetros: String
Parámetros: int, String
Parámetros: String, int
142
En la clase Operaciones de la figura 5.17, se definen 4
métodos sobrecargados, es decir, tienen el mismo nombre.
Para que clase Operaciones sea ser compilada, debe existir
una diferencia con respecto a los parámetros. Java analiza 3
características de los parámetros; el número de parámetros,
el tipo de dato de los parámetros y el orden de los paráme-
tros. Si dos o más de los métodos sobrecargados tienen las
mismas características que Java analiza, la compilación fallará.
El método de la línea 5 tiene un parámetro de tipo int. El
método de la línea 9 tiene un parámetro, pero éste es de tipo
String, por lo que los métodos no tendrán problemas al
compilar. El método de la línea 13 tiene dos parámetros, uno
de tipo int y otro de tipo String. Este método no tiene
conflicto con los anteriores porque el número de parámetros
es diferente, así que Java no tendrá problema en determinar
cuando se quiera invocar a este método. Por último, el método
de la línea 17 tiene dos parámetros, uno de tipo String y
otro de tipo int. Este método tiene el mismo número de pa-
rámetros y tipos de datos que el método de la línea 13,
143
después un parámetro de tipo int, mientras que el método
de la línea 13 define primero un parámetro de tipo int, y
después un parámetro de tipo String, así que ninguno
de los métodos sobrecargados entra en conflicto, porque
todos pueden ser diferenciados por Java al momento de la
invocación.
Recuerde, los métodos sobrecargados son diferenciados
por Java por:
En la línea 7,
7 operaciones.mostrarDatos( 99 );
En la línea 8,
144
8 operaciones.mostrarDatos( “Hola” );
En la línea 9,
En la línea 10,
10 operaciones.mostrarDatos( “Hola”, 99 );
145
los datos utilizados como argumentos es ejecutado, y el resul-
tado en pantalla es Parámetros: String, int.
5.12Conclusión
En este capítulo se aprendieron conceptos básicos sobre
la Programación Orientada a Objetos. Aprendimos a definir
clases, e instanciar objetos. Así también, definimos y acce-
dimos a campos de objetos, pero principalmente, trabaja-
mos con los métodos. Éstos son muy importantes porque
nos brindan muchos beneficios al crear nuestros programas
como la reducción de código; mejora en la lectura de nuestro
código; reduce la complejidad de nuestros programas; mejora
el rendimiento; entre otras razones.
En el siguiente capítulo, continuaremos profundizando
sobre algunos temas y características de la POO, y el modo en
que lo llevamos a cabo en Java.
146
6.POO: Constructores e
Instancias
6.1Introducción
En el capítulo anterior, se dieron a conocer conceptos
básicos de la POO, y se trabajó con los métodos. En este ca-
pítulo, se muestran algunas otras características de la POO.
Principalmente los niveles de acceso. Se trabajará con los
constructores, los campos y métodos static, y se utilizarán
objetos como argumentos. Todos estos conceptos que traba-
jaremos en Java, brindarán las bases aplicables para cualquier
lenguaje de programación que implemente la POO.
6.2Niveles de acceso
Primeramente, serán estudiados los niveles de acceso. En
temas anteriores, sólo se mencionaron los niveles de acceso,
para que se fuera familiarizando con el término, pero no
llegamos a utilizarlos más allá de colocar niveles de acceso
public o simplemente, no colocar nada. De hecho, también
es un nivel de acceso el no poner nada, pero eso se aborda en
un momento más.
147
En Java, tenemos 4 niveles de acceso: public, protec-
ted, default (sin modificador) y private. Cada uno de
ellos brinda acceso o no desde la misma clase; desde las clases
del paquete; desde una subclase; o desde cualquier clase. La
figura 6.1 muestra los niveles de acceso.
148
paquete. Este nivel de acceso también es conocido como
nivel paquete.
Por último, el modificado private es el nivel de acceso
de mayor restricción. El elemento sólo estará disponible
dentro de la misma clase.
Los niveles de acceso permiten tener control sobre la visi-
bilidad de los elementos desde otras clases. Por el momento,
sólo se analizan y comprueban los niveles de acceso public
y private. El resto de los niveles de acceso, serán retoma-
dos después de comprender y trabajar con la herencia.
Persona.java
1 package c06.p01;
2
3 class Persona {
4 public String nombre;
5 public int edad;
6
7 public void imprimirCampos(){
8 System.out.println(“Nombre: “ +
nombre);
9 System.out.println(“Edad: “ + edad);
10 System.out.println();
11 } // Fin del método imprimirCampos
12
13 } // Fin de la clase Persona
Figura 6.2 | Clase con campos y métodos de nivel de
acceso public.
PruebaPersona.java
1 package c06.p01;
2
3 class PruebaPersona {
149
4 public static void main(String[] args) {
5 Persona persona = new Persona();
6
7 persona.imprimirCampos();
8 persona.nombre = “Alex”;
9 persona.edad = 20;
10 persona.imprimirCampos();
11
12 } // Fin del método main
13 } // Fin de la clase PruebaPersona
Nombre: null
Edad: 0
Nombre: Alex
Edad: 20
1 package c06.p01;
150
vacío, lo que significaba que los campos tenían nivel de acceso
default o nivel paquete. Para efectos de los ejercicios an-
teriores, e incluso de éste, no se tiene un cambio apreciable.
Lo que sí se sabe, es que los campos nombre y edad pueden
ser accedidos desde cualquier clase, incluso desde clases que
no estén dentro del mismo paquete.
En la línea 7,
persona.imprimirCampos();
151
Nombre: null
Edad: 0
En las líneas 8 y 9,
8 persona.nombre = “Alex”;
9 persona.edad = 20;
persona.imprimirCampos();
Nombre: Alex
Edad: 20
152
Se procede a guardar los cambios, y compilar nuevamente
la clase Persona. Al compilar nuevamente la clase Prue-
baPersona. ¿Qué sucedió? ¿Se obtuvo el siguiente error?:
153
de acceso public, y que éste permita recuperar o asignar
valores a los campos nombre y edad de la clase Persona.
Piénsese por un momento. Imagínese un método que retorne
el valor del campo nombre. Podría ser llamado getNom-
bre. ¿y qué tal otro método que nos permita asignar un valor
al campo nombre? Podría ser llamado setNombre, y éste
sería definido con un parámetro que reciba el valor y lo asigne
al campo. ¿Qué tal suena? ¿Parece confuso? Bueno, quizás
porque aún, no se construye en código, pero una vez realiza-
do, la idea será más clara.
154
19 } // Fin del método setNombre
20
21 public int getEdad(){
22 return edad;
23 } // Fin del método getEdad
24
25 public void setEdad(int valor){
26 edad = valor;
27 } // Fin del método setEdad
28
29 } // Fin de la clase Persona
Figura 6.4 | Clase con métodos sobrecargados
155
17 public void setNombre(String valor){
18 nombre = valor;
19 } // Fin del método setNombre
156
PruebaPersona.java
1 package c06.p02;
2
3 class PruebaPersona {
4 public static void main(String[] args) {
5 Persona persona = new Persona();
6
7 System.out.println(persona.getNombre());
8 System.out.println(persona.getEdad());
9
10 persona.setNombre( “Alex” );
11 persona.setEdad( 20 );
12
13 persona.imprimirCampos();
14
15 } // Fin del método main
16 } // Fin de la clase PruebaPersona
null
0
Nombre: Alex
Edad: 20
157
Este método devuelve el valor que tiene asignado el campo
nombre, el cual tiene el valor que Java le asignó por defecto,
por lo que se imprime null en pantalla. En esta línea,
se observa que, aunque no es posible acceder al campo
nombre, que tiene nivel de acceso private, sí es posible
hacer uso del método getNombre, que es public, el cual
puede leer ese campo y devolvernos el valor al invocarlo.
En la línea 8,
8 System.out.println( persona.getEdad() );
se invoca al método getEdad del objeto persona con base
en las instrucciones definidas en la clase Persona (figura
6.4). Éste método devuelve el valor que posee el campo
edad, que en ese instante es 0, por lo que el resultado en
pantalla es 0.
La línea 10,
10 persona.setNombre( “Alex” );
se invoca al método setNombre y se le pasa como argumen-
to el valor de “Alex”. Con base en las instrucciones defini-
das en la clase Persona (figura 6.4), el método utiliza el valor
recibido para asignarlo al campo edad.
En la línea 11,
11 persona.setEdad( 20 );
se invoca al método setEdad y se envía como argumento
el valor int de 20. Dentro de las instrucciones del método
setEdad, se asigna el valor de 20 al campo edad.
En la línea 13,
13 persona.imprimirCampos();
se invoca al método imprimirCampos, el cual hace uso de los
campos nombre y edad para imprimirlos en pantalla.
Nombre: Alex
Edad: 20
Al ver en pantalla el resultado de la invocación del método
imprimirCampos, se aprecia que, efectivamente los
158
valores de los campos nombre y edad del objeto persona
fueron modificados en las invocaciones a los métodos set-
Nombre y setEdad de las líneas 11 y 12.
Bien, pero aún no sé ¿por qué debería utilizar métodos
para asignar o recuperar los datos de los campos? Ésa sería
una pregunta válida. Se verá un ejemplo de por qué es reco-
mendable que los campos siempre se manejen con nivel de
acceso private en lugar de public. Si se tuviiese un campo en
una clase Persona como este:
public int edad;
Se da oportunidad a que cualquier clase acceda al campo
para recuperar o asignar un valor. Si en alguna otra clase, se
crea una instancia de la clase Persona y le dan por nombre
el identificador de persona, una asignación sería realizada
de la siguiente manera:
persona.edad = 20;
Eso está bien, incluso, pensar que es una forma más práctica
de realizarlo, si se viviera en un mudo perfecto y sin errores.
Piénsese qué sucedería si alguien por error o intencionalmen-
te asignara un valor negativo.
persona.edad = -4;
La lógica del programa no tendrá sentido, y muy seguramente
funcionará de forma incorrecta, puesto que se espera que el
valor del campo edad siempre sea un valor igual o mayor a 0.
Ahora, ¿cómo validar y controlar los valores que serán
asignado al campo edad? Si en lugar del campo edad como
public, se asigna como private, ninguna otra clase
podrá manipular el campo. Ahora, en el método setEdad,
se agregar una validación antes de asignar el valor al campo
edad. Se muestra cómo queda el fragmento de código:
159
private int edad; public void setEdad( int valor ){
if( valor < 0 ){
edad = 0;
}else{
edad = valor;
}
} // Fin del método setEdad
persona.setEdad( -4 );
6.3Constructores
Los constructores son los encargados de preparar al objeto
que será creado. Toda clase cuenta con un constructor, así es,
toda clase cuenta con un constructor. Cuando en una clase
no se define un constructor, Java define un constructor por
defecto. En los programas elaborados, se han realizado llama-
das a los constructores de las clases cada vez que creaba una
160
instancia. Por ejemplo, el último programa (figura 6.5) incluía
la siguiente línea:
Persona persona = new Persona();
En esta línea se crea una instancia de la clase Persona. La
parte resaltada, Persona() es la llamada al constructor. La
palabra reservada new es el encargado de asignar memoria al
objeto que es creado, y devuelve la referencia de dicha ubica-
ción en memoria. El operador new siempre es seguido por la
llamada a un constructor.
Anteriormente se mencionó la analogía de un plano arqui-
tectónico y un edificio. El plano es como la clase de la POO, éste
define las características con las que contará el futuro objeto.
Cuando se lleva a cabo la construcción del edificio, se realiza
con base en el plano arquitectónico. Cuando un objeto en la
POO es creado, se realiza con base en la clase. Ahora piénsese
antes de crear el edificio. Se necesita saber en qué ubicación
será construido. Algún espacio de suelo es designado para rea-
lizar la construcción del edificio. Pues bueno, lo mismo pasa con
los objetos en la POO. Antes de construir un objeto, se necesita
saber dónde será construido el objeto, es decir, en qué espacio
en la memoria de la computadora será construido el objeto. De
eso se encarga el operador new. El constructor vendría a ser la
acción de construir y levantar el edificio.
La sintaxis de un constructor tiene parecido a la sintaxis
de los métodos.
Nivel de Identificador (mismo
Parámetros
acceso nombre de la clase)
public Persona ( ){
// Sentencias
}
Figura 6.6 | Sintaxis del constructor
161
por lo que no existe un tipo de datos de retorno. El nombre
del constructor siempre es el mismo que el de la clase, es
decir, si estamos dentro de una clase de nombre Persona,
el nombre del constructor es Persona. Por último, en los
constructores también se definen parámetros como en los
métodos, éstos van dentro de los paréntesis. En caso de no
requerir parámetros, los paréntesis quedan vacío.
Los constructores realizan el proceso de creación de los
objetos. Dentro de las instrucciones del constructor, se es-
tablecen acciones para inicializar los campos de la instancia.
Será retomada la clase Persona, pero está vez haciendo uso
de un constructor.
Persona.java
1 package c06.p03;
2
3 class Persona {
4 private String nombre;
5 private int edad;
6
7 public Persona(){
8 nombre = “(Sin nombre)”;
9 edad = 0;
10 } // Fin del constructor
11
12 public void imprimirCampos(){
13 System.out.println(“Nombre: “ +
nombre);
14 System.out.println(“Edad: “ + edad);
15 System.out.println();
16 } // Fin del método imprimirCampos
17
18 public String getNombre(){
162
19 return nombre;
20 } // Fin del método getNombre
21
22 public void setNombre(String valor){
23 nombre = valor;
24 } // Fin del método setNombre
25
26 public int getEdad(){
27 return edad;
28 } // Fin del método getEdad
29
30 public void setEdad(int valor){
31 edad = valor;
32 } // Fin del método setEdad
33
34 } // Fin de la clase Persona
Figura 6.7 | Clase con constructor
163
nombre y edad. En el caso del campo nombre, le es asig-
nando el String “(Sin nombre)”. El campo edad es
inicializado con el valor de 0.
Se comprueba la clase Persona a través de un programa
que crea una instancia de esta clase.
PruebaPersona.java
1 package c06.p03;
2
3 class PruebaPersona {
4 public static void main(String[] args) {
5 Persona persona = new Persona();
6
7 persona.imprimirCampos();
8
9 persona.setNombre( “Alex” );
10 persona.setEdad( 20 );
11
12 persona.imprimirCampos();
13
14 } // Fin del método main
15 } // Fin de la clase PruebaPersona
164
tor persona, todas las instrucciones definidas en éste, son
ejecutadas. Para esta situación, el constructor Persona()
inicializa los campos nombre y edad con los valores especi-
ficados en la clase Persona (figura 6.7).
En la línea 7, se invoca al método imprimirCampos
del objeto persona. Este método imprime en pantalla los
valores de los campos nombre y edad. El resultado en pan-
talla es
9 persona.setNombre( “Alex” );
10 persona.setEdad( 20 );
165
Nombre: Alex
Edad: 20
166
9 edad = pEdad;
10 } // Fin del constructor
11
12 public void imprimirCampos(){
13 System.out.println(“Nombre: “ + nombre);
14 System.out.println(“Edad: “ + edad);
15 System.out.println();
16 } // Fin del método imprimirCampos
17
18 public String getNombre(){
19 return nombre;
20 } // Fin del método getNombre
21
22 public void setNombre(String valor){
23 nombre = valor;
24 } // Fin del método setNombre
25
26 public int getEdad(){
27 return edad;
28 } // Fin del método getEdad
29
30 public void setEdad(int valor){
31 edad = valor;
32 } // Fin del método setEdad
33
34 } // Fin de la clase Persona
Figura 6.9 | Clase con un constructor con parámetros
167
7 public Persona(String pNombre, int pEdad){
8 nombre = pNombre;
9 edad = pEdad;
10 } // Fin del constructor
PruebaPersona.java
1 package c06.p04;
2
3 class PruebaPersona {
4 public static void main(String[] args) {
5 Persona persona = new Persona(
“Alex”, 20);
6
7 persona.imprimirCampos();
8
9 persona.setNombre( “Beto” );
10 persona.setEdad( 19 );
11
12 persona.imprimirCampos();
13
14 } // Fin del método main
15 } // Fin de la clase PruebaPersona
168
Nombre: Alex
Edad: 20
Nombre: Beto
Edad: 19
Figura 6.10 | Prueba de la clase Persona.
Nombre: Alex
Edad: 20
Nombre: Beto
Edad: 19
6.5Sobrecarga de constructores
En el capítulo anterior, se trabajaron con los métodos so-
brecargados y las características de los parámetros que utiliza
Java para poder diferenciarlos, puesto que todos los métodos
sobrecargados comparten el mismo nombre. Ahora serán es-
tudiado los constructores sobrecargados. En sí, un construc-
tor sobrecargado es la definición de más de un constructor en
169
un a clase, no tendría sentido decir que son constructores con
el mismo nombre, porque al ser un constructor, está implícito
el hecho de tener el mismo nombre que la clase, así que al
mencionar que existe más de un constructor, se da por hecho
que el nombre será el mismo de la clase para cada constructor.
Los métodos sobrecargados son diferenciados por las ca-
racterísticas de los parámetros. En los constructores sobre-
cargados es igual. Los constructores sobrecargados serán
diferenciados por Java en base a 3 características:
170
Rectangulo.java
1 public class Rectangulo {
2 private int base;
3 private int altura;
4
5 public Rectangulo(){
6 base = 1;
7 altura = 1;
8 } // Fin del constructor
9
10 public Rectangulo(int pBase, int pAltura){
11 base = pBase;
12 altura = pAltura;
13 } // Fin del constructor
14
15 public void imprimirCampos(){
16 System.out.println( “Base: “ + base );
17 System.out.println( “Altura: “+altura);
18 System.out.println();
19 } // Fin del método imprimirCampos
20
21 } // Fin de la clase Rectángulo
Figura 6.11 | Clase con constructores sobrecargados
171
Veamos las acciones que realiza cada uno de los
constructores.
En primer constructor definido en la clase,
5 public Rectangulo(){
6 base = 1;
7 altura = 1;
8 } // Fin del constructor
172
en comprender y atender, principalmente el tema de los cons-
tructores sobrecargados.
Realicemos un programa que permita poner a prueba
nuestra clase Rectangulo.
PruebaRectangulo.java
1 package c06.p05;
2
3 public class PruebaRectangulo {
4 public static void main(String[] args) {
5 Rectangulo rectangulo1=new
Rectangulo();
6 Rectangulo rectangulo2 =
new Rectangulo(7,11);
7 Rectangulo rectangulo3 =
new Rectangulo(13,17);
8
9 rectangulo1.imprimirCampos();
10 rectangulo2.imprimirCampos();
11 rectangulo3.imprimirCampos();
12
13 } // Fin del método main
14 } // Fin de la clase PruebaRectangulo
Base: 1
Altura: 1
Base: 7
Altura: 11
Base: 13
Altura: 17
Figura 6.12 | Prueba de la clase Rectangulo.
173
gulo son creadas haciendo uso de los dos constructores so-
brecargados definidos en la clase Rectangulo. En la línea 5,
6 Rectangulo rectangulo2 =
new Rectangulo(7,11);
7 Rectangulo rectangulo3 =
new Rectangulo(13,17);
174
En las líneas 9, 10 y 11;
9 rectangulo1.imprimirCampos();
10 rectangulo2.imprimirCampos();
11 rectangulo3.imprimirCampos();
Base: 1
Altura: 1
Base: 7
Altura: 11
Base: 13
Altura: 17
6.6Campos static
En la POO, se definen clases que permiten especificar las
características que tendrá el objeto cuando sea creado. Los
atributos, se trabajan como campos de la instancia y los com-
175
portamientos, se trabajan como métodos. Los campos de la
instancia son independientes para cada objeto, es decir, cada
objeto cuenta con su propio espacio en memoria para ese
recurso. En todos los programas realizados hasta el momento,
cada vez que se ha creado un nuevo objeto de alguna clase
definida por nosotros, se ha observado que los valores de los
campos de cada objeto no se comparten, es decir, cuando se
trabajó con objetos de la clase Persona, el valor asignado al
campo edad de un objeto no realizaba cambios en el campo
edad de cualquier otro objeto de tipo Persona. Es impor-
tante comprender el uso de los campos de los objetos para
entender lo que son los campos static, también conocidos
como campos de clase.
Los campos static o campos de clase son campos cuyo
valor es compartido por todos los objetos que sean creado de
la clase. Véase un ejemplo.
ClaseA.java
1 package c06.p06;
2
3 public class ClaseA {
4 public int campoA;
5 public int campoB;
6 public static int campoCompartido;
7 } // Fin de la clase ClaseA
Figura 6.13 | Clase con campos de instancia y un campo de
clase.
176
palabra reservada static después del nivel de acceso como
se puede observar en la línea 6.
Probemos la clase ClaseA y sus campos en un programa.
PruebaClaseA.java
1 package c06.p06;
2
3 public class PruebaClaseA {
4 public static void main(String[] args) {
5 ClaseA obj1 = new ClaseA();
6 ClaseA obj2 = new ClaseA();
7
8 obj1.campoA = 10;
9 obj2.campoA = 20;
10 System.out.println( obj1.campoA + “, “ +
obj2.campoA);
11
12 obj1.campoB = 100;
13 obj2.campoB = 200;
14 System.out.println( obj1.campoB + “, “ +
obj2.campoB);
15
16 obj1.campoCompartido = 1000;
17 obj2.campoCompartido = 2000;
18 System.out.println( obj1.campoCompartido + “,
“ +
obj2.campoCompartido);
19
20 } // Fin del método main
21 } // Fin de la clase PruebaClaseA
10, 20
100, 200
2000, 2000
Figura 6.14 | Prueba de la clase ClaseA.
177
El programa de la figura 6.14 comienza con la instanciación
de 2 objetos en las líneas 5 y 6.
8 obj1.campoA = 10;
9 obj2.campoA = 20;
10 System.out.println( obj1.campoA + “, “ +
obj2.campoA);
12 obj1.campoB = 100;
13 obj2.campoB = 200;
178
objeto obj1. En la línea 13, se asigna el valor de 200 al campo
campoB del objeto obj2. Al imprimir los valores de ambos
objetos, tal y como se realiza en la línea 14,
14 System.out.println( obj1.campoB + “, “ +
obj2.campoB);
16 obj1.campoCompartido = 1000;
17 obj2.campoCompartido = 2000;
18 System.out.println( obj1.campoCompartido + “, “
+ obj2.campoCompartido);
179
static, se verá reflejado cuando cualquier otra instancia
recupere el valor de dicho campo static.
Algo más a saber sobre los campos static, es que los
campos pueden ser utilizados sin necesidad de instanciar un
objeto, por eso también se les conoce como campos de clase.
Para acceder a los campos static sin necesidad de una instan-
cia, se escribe el nombre de la clase seguido un punto, ., y el
nombre del campo. Para la clase ClaseA de la figura 6.13.,
es posible acceder al campo static campoCompartido a
través de la sentencia ClaseA.campoCompartido.
Ahora, se realiza un programa que accede a un campo
static a través de la mención de la clase y a través de una
instancia para comprobar que el campo se puede acceder sin
necesidad de un objeto.
ClaseB.java
1 package c06.p07;
2
3 public class ClaseB {
4 public static int campoStatic;
5 } // Fin de la clase ClaseA
Figura 6.15 | Clase con un campo de clase.
180
PruebaClaseB.java
1 package c06.p07;
2
3 public class PruebaClaseB {
4 public static void main(String[] args) {
5 ClaseB obj1 = new ClaseB();
6 ClaseB obj2 = new ClaseB();
7
8 System.out.println(“obj1: “ +
obj1.campoStatic);
9 System.out.println(“obj2: “ +
obj2.campoStatic);
10 System.out.println(“ClaseB: “ +
ClaseB.campoStatic +”\n”);
11
12 obj1.campoStatic = 10;
13 System.out.println(“obj1: “ +
obj1.campoStatic);
14 System.out.println(“obj2: “ +
obj2.campoStatic);
15 System.out.println(“ClaseB: “ +
ClaseB.campoStatic +”\n”);
16
17 obj2.campoStatic = 200;
18 System.out.println(“obj1: “ +
obj1.campoStatic);
19 System.out.println(“obj2: “ +
obj2.campoStatic);
20 System.out.println(“ClaseB: “ +
ClaseB.campoStatic +”\n”);
21
22 ClaseB.campoStatic = 3000;
23 System.out.println(“obj1: “ +
obj1.campoStatic);
181
24 System.out.println(“obj2: “ +
obj2.campoStatic);
25 System.out.println(“ClaseB: “ +
ClaseB.campoStatic +”\n”);
26
27 } // Fin del método main
28 } // Fin de la clase PruebaClaseB
obj1: 0
obj2: 0
ClaseB: 0
obj1: 10
obj2: 10
ClaseB: 10
obj1: 200
obj2: 200
ClaseB: 200
obj1: 3000
obj2: 3000
ClaseB: 3000
Figura 6.16 | Prueba de la clase ClaseB
8 System.out.println( “obj1:” +
obj1.campoStatic);
9 System.out.println( “obj2:” +
obj2.campoStatic);
182
10 System.out.println( “ClaseB:” +
ClaseB.campoStatic);
obj1:0
obj2:0
ClaseB:0
En la línea 12,
12 obj1.campoStatic = 10;
13 System.out.println( “obj1:” +
obj1.campoStatic);
14 System.out.println( “obj2:” +
obj2.campoStatic);
15 System.out.println( “ClaseB:” +
ClaseB.campoStatic);
183
obj1: 10
obj2: 10
ClaseB: 10
En la línea 17,
17 obj2.campoStatic = 200;
18 System.out.println( “obj1: “ +
obj1.campoStatic);
19 System.out.println( “obj2: “ +
obj2.campoStatic);
20 System.out.println( “ClaseB: “ +
ClaseB.campoStatic + “\n”);
obj1: 200
obj2: 200
ClaseB: 200
En la línea 22,
22 ClaseB.campoStatic = 3000;
184
dad de una instancia. En esta línea, se trabaja con el campo
static de nombre campoStatic mencionando única-
mente la clase, que en este caso, es ClaseB. El resultado de
imprimir los valores en pantalla es:
obj1: 3000
obj2: 3000
ClaseB: 3000
6.7Métodos static
En los últimos 2 programas, se trabajó con los campos
static. Aprendimos a trabajar con los campos static, también
conocidos como campos de clase, sin necesidad de una ins-
tancia. Ahora vamos a trabajar con los métodos static. Si se
tiene claro cómo funcionan los campos static, no se tendrá
ningún problema en comprender los métodos static. Cuando
a un método le es asignada la palabra static, este método
puede ser utilizado sin necesidad de instanciar un objeto, tal y
como ocurre con los campos static. Véase este programa para
comprenderlo mejor.
Operaciones.java
1 package c06.p08;
2
3 public class Operaciones {
4 public static int sumar(int numero1,
int numero2){
5 return numero1 + numero2;
6 } // Fin del método sumar
7
8 public static int restar(int numero1,
int numero2){
9 return numero1 - numero2;
185
10 } // Fin del método restar
11
12 } // Fin de la clase Operaciones
Figura 6.17 | Clase con métodos static.
PruebaOperaciones.java
1 package c06.p08;
2
3 public class PruebaOperaciones {
4 public static void main(String[] args) {
5 Operaciones obj1 = new Operaciones();
6
7 System.out.println( obj1.sumar(10,20)
);
8 System.out.println(
Operaciones.sumar(10,20) );
9
10 System.out.println(obj1.restar(30,20));
11 System.out.println(
Operaciones.restar(30,20) );
12
13 } // Fin del método main
14 } // Fin de la clase PruebaOperaciones
186
30
30
10
10
30
30
10
10
187
6.8Objetos como argumentos
Un aspecto importante de entender al trabajar con pará-
metros y argumentos es comprender las implicaciones de uti-
lizar tipos de datos primitivos y tipos de datos por referencia.
Primeramente, recordar que los parámetros son definidos al
momento de escribir la clase, mientras que los argumentos
son los datos que se envían al momento de realizar la invoca-
ción de un método.
No se tiene la intención profundizar con respecto a los
tipos de datos por referencia, sin embargo, es importante
comprender que cualquier dato que no sea de tipo primiti-
vo es un tipo de dato por referencia, es decir, un objeto. En
Java, únicamente existen 8 tipos de datos primitivos: byte,
short, int, long, float, double, boolean y char.
Para entender la diferencia entre trabajar con datos pri-
mitivos y datos por referencia como argumentos, se necesita
verlo en un programa y analizar los resultados.
Acciones.java
1 package c06.p09;
2
3 public class Acciones {
4
5 public static void imprimeIncremento(
int valor ){
6 valor = valor + 10;
7 System.out.println( “Valor: “ + valor );
8 } // Fin del método imprimeIncremento
9
10 } // Fin de la clase Acciones
Figura 6.19 | Clase con un campo de clase.
188
Principal.java
1 package c06.p09;
2
3 public class Principal {
4 public static void main(String[] args) {
5 int variable1 = 50;
6 System.out.println(
“Variable (antes):” + variable1 );
7 Acciones.imprimeIncremento( variable1
);
8 System.out.println(
“Variable (después): “ + variable1 );
9
10 } // Fin del método main
11 } // Fin de la clase Principal
Variable (antes):50
Valor: 60
Variable (después): 50
189
se asigna al parámetro valor el valor numérico que posee
más 10, es decir, el resultado de valor + 10. Posterior-
mente, en la línea 7,
6 System.out.println(
“variable (antes):” + variable1 );
Acciones.imprimeIncremento(
7 variable1 );
190
dentro del cuerpo del método imprimeIncremento de la
clase Acciones (figura 6.19).
Finalmente, en la línea 8,
8 System.out.println(
“variable (después): “ + variable1 );
Persona.java
1 package c06.p10;
2
3 public class Persona {
4 public int edad;
5 } // Fin de la clase Persona
Figura 6.21 | Clase Persona.
Acciones.java
1 package c06.p10;
2
3 public class Acciones {
4
5 public static void imprimeCambioDeEdad(
Persona persona ){
191
6 persona.edad = persona.edad + 10;
7 System.out.println(
“Edad: “ + persona.edad );
8 } // Fin del método imprimeCambioDeEdad
9
10 } // Fin de la clase Acciones
Figura 6.22 | Clase con un campo de clase.
Principal.java
1 package c06.p10;
2
3 public class Principal {
4 public static void main(String[] args) {
5 Persona objeto1 = new Persona();
6 objeto1.edad = 15;
7 System.out.println(
“Edad (antes):” + objeto1.edad );
8 Acciones.imprimeCambioDeEdad( objeto1
);
9 System.out.println(
“Edad (después): “ + objeto1.edad );
10
11 } // Fin del método main
12 } // Fin de la clase Principal
Edad (antes):15
Edad: 25
Edad (después): 25
Figura 6.23 | Programa para comprobar un objeto como
argumento
192
clase principal es utilizada para iniciar el programa puesto
que es la que tiene definido el método main.
La clase Persona (figura 6.21) es una clase que define un
campo public de nombre edad y de tipo int.
La clase Acciones (figura 6.22) define un método static
con nivel de acceso public de nombre imprimeCambio-
DeEdad. El método no retorna ningún valor, pero sí define un
parámetro de tipo Persona el cual es nombrado persona.
Dentro del cuerpo del método, al campo edad del objeto
persona le es asignado el valor que posee más 10, es decir,
persona.edad = persona.edad + 10. Antes de
terminar, el método imprimeCambioDeEdad muestra en
pantalla el texto “Edad: “ seguido del valor que posee el
campo edad del objeto persona, es decir, “Edad: “ +
persona.edad. En términos generales, este método recibe
un objeto de tipo Persona, incrementa el valor del campo
edad en 10 e imprime el nuevo valor del campo edad.
La clase Principal (figura 6.23) es la encargada de compro-
bar lo que sucede con un objeto cuando uno de sus campos es
modificado dentro de un método en el que es utilizado como
argumento. En la línea 5,
6 objeto1.edad = 15;
7 System.out.println(
“Edad (antes):” + objeto1.edad );
193
se imprime en pantalla el texto “Edad (antes):” junto
con el valor actual del campo edad. El resultado en pantalla es
Edad (antes):15.
En la línea 8,
8 Acciones.imprimeCambioDeEdad( objeto1 );
Finalmente, en la línea 9,
9 System.out.println(
“Edad (después): “ + objeto1.edad );
Edad (antes):15
Edad: 25
Edad (después): 25
194
objeto1 y se observa que el cambio que se realizó dentro
del método se ve reflejado en el objeto objeto1. Entonces
es necesario tomar en cuenta que, al utilizar objetos como
argumentos, si el método que recibe nuestro objeto realiza
cambios en los campos, éstos persistirán cuando el método
haya terminado de ejecutar sus acciones tal y como ocurrió
en este programa.
6.9Conclusión
En este capítulo se aprendió a trabajar con los niveles de
acceso public y private. En el siguiente capítulo se hará
uso del resto de ellos. Así también, en este capítulo se trabajó
con los constructores, los parámetros de los constructores y
la sobrecarga de éstos. Se estudiaron los campos y métodos
static. Por último, se revisaron los objetos como argumen-
tos en los métodos y la diferencia al trabajar con tipos de
datos primitivos como argumentos. En el siguiente capítulo se
aprenderán los fundamentos de la Herencia, la cual conforma
parte importante de las características de la POO.
195
7POO: Herencia
7.1Introducción
La herencia es una característica importante en la POO. Con
ésta se crean clases que generalicen las características para
que otra clase pueda tomar estas características y agregar las
propias.
7.2Herencia
La herencia brinda la posibilidad de tomar una clase y
extender las características de ésta, es decir, hacer uso de
aquello que haya sido definido en la primera clase, pero agre-
gando nuevos campos o métodos o reescribiendo las acciones
de alguno de los métodos de la primera clase. Se realizará un
programa que muestre cómo funciona la herencia en la POO.
Persona.java
1 package c07.p01;
2
3 public class Persona {
4 private String nombre;
5 private String apellidoPaterno;
6 private String apellidoMaterno;
197
7
8 public Persona(){
9 nombre =””;
10 apellidoPaterno = “”;
11 apellidoMaterno = “”;
12 } // Fin del constructor
13
14 public String getNombre() {
15 return nombre;
16 } // Fin del método getNombre
17
18 public void setNombre(String pNombre) {
19 nombre = pNombre;
20 } // Fin del método setNombre
21
22 public String getApellidoPaterno() {
23 return apellidoPaterno;
24 } // Fin del método getApellidoPaterno
25
26 public void setApellidoPaterno(
String pApellidoPaterno) {
27 apellidoPaterno = pApellidoPaterno;
28 } // Fin del método getApellidoPaterno
29
30 public String getApellidoMaterno() {
31 return apellidoMaterno;
32 } // Fin del método getApellidoMaterno
33
34 public void setApellidoMaterno(
String pApellidoMaterno) {
35 apellidoMaterno = pApellidoMaterno;
36 } // Fin del método setApellidoMaterno
198
37
38 public void imprimirCampos() {
39 System.out.println( “Persona:” +
40 “\n\tnombre = “ + nombre +
41 “\n\tapellidoPaterno = “ +
apellidoPaterno +
42 “\n\tapellidoMaterno = “ +
apellidoMaterno );
43 } // Fin del método imprimirCampos
44
45 } // Fin de la clase Persona
Figura 7.1 | Clase Persona
199
12
13 } // Fin del método main
14 } // Fin de la clase PruebaPersona
Persona:
nombre = Alberto
apellidoPaterno = Arenas
apellidoMaterno = Aguirre
Figura 7.2 | Programa para comprobar la clase Persona
Cliente.java
1 package c07.p01;
2
3 public class Cliente {
4 private String nombre;
5 private String apellidoPaterno;
6 private String apellidoMaterno;
7 private int numeroDeCliente;
8
9 public Cliente(){
10 nombre =””;
11 apellidoPaterno = “”;
200
12 apellidoMaterno = “”;
13 numeroDeCliente = 0;
14 } // Fin del constructor
15
16 public String getNombre() {
17 return nombre;
18 } // Fin del método getNombre
19
20 public void setNombre(String pNombre) {
21 nombre = pNombre;
22 } // Fin del método setNombre
23
24 public String getApellidoPaterno() {
25 return apellidoPaterno;
26 } // Fin del método getApellidoPaterno
27
28 public void setApellidoPaterno(
String pApellidoPaterno) {
29 apellidoPaterno = pApellidoPaterno;
30 } // Fin del método getApellidoPaterno
31
32 public String getApellidoMaterno() {
33 return apellidoMaterno;
34 } // Fin del método getApellidoMaterno
35
36 public void setApellidoMaterno(
String pApellidoMaterno) {
37 apellidoMaterno = pApellidoMaterno;
38 } // Fin del método setApellidoMaterno
39
40 public int getNumeroDeCliente(){
41 return numeroDeCliente;
201
42 } // Fin del método getNumeroDeCliente
43
44 public void setNumeroDeCliente(
int pNumeroDeCliente){
45 numeroDeCliente = pNumeroDeCliente;
46 } // Fin del método setNumeroDeCliente
47
48 public void imprimirCampos() {
49 System.out.println( “Cliente:” +
50 “\n\tnombre = “ + nombre +
51 “\n\tapellidoPaterno = “ +
apellidoPaterno +
52 “\n\tapellidoMaterno = “ +
apellidoMaterno +
53 “\n\tnumeroDeCliente = “ +
numeroDeCliente );
54 } // Fin del método imprimirCampos
55
56 } // Fin de la clase PruebaCliente
Figura 7.3 | Clase Cliente
202
PruebaCliente.java
1 package c07.p01;
2
3 public class PruebaCliente {
4 public static void main(String[] args) {
5 Cliente cliente1 = new Cliente();
6
7 cliente1.setNombre(“Alberto”);
8 cliente1.setApellidoPaterno(“Arenas”);
9 cliente1.setApellidoMaterno(“Aguirre”);
10 cliente1.setNumeroDeCliente(1001);
11
12 cliente1.imprimirCampos();
13
14 } // Fin del método main
15 } // Fin de la clase PruebaCliente
Cliente:
nombre = Alberto
apellidoPaterno = Arenas
apellidoMaterno = Aguirre
numeroDeCliente = 1001
Figura 7.4 | Programa para comprobar la clase Cliente
203
que ya tiene la clase Persona y sólo trabajar en las nuevas
características de la clase Cliente. Ahí es donde entra la
herencia.
Persona.java
1 package c07.p02;
2
3 public class Persona {
4 private String nombre;
5 private String apellidoPaterno;
6 private String apellidoMaterno;
… ...
45 } // Fin de la calse Persona
Figura 7.5 | Clase Persona
Cliente.java
1 package c07.p02;
2
3 public class Cliente extends Persona{
4
5 private int numeroDeCliente;
6
7 public Cliente(){
204
8 setNombre(“”);
9 setApellidoPaterno(“”);
10 setApellidoMaterno(“”);
11 numeroDeCliente = 0;
12 } // Fin del constructor
13
14 public int getNumeroDeCliente(){
15 return numeroDeCliente;
16 } // Fin del método getNumeroDeCliente
17
18 public void setNumeroDeCliente(
int pNumeroDeCliente){
19 numeroDeCliente = pNumeroDeCliente;
20 } // Fin del método setNumeroDeCliente
21
22 public void imprimirCampos() {
23 System.out.println( “Cliente:” +
24 “\n\tnombre = “ + getNombre() +
25 “\n\tapellidoPaterno = “ +
getApellidoPaterno() +
26 “\n\tapellidoMaterno = “ +
getApellidoMaterno() +
27 “\n\tnumeroDeCliente = “ +
numeroDeCliente );
28 } // Fin del método imprimirCampos
29
30 } // Fin de la clase Cliente
Figura 7.6 | Clase Cliente que extiende a la clase Persona
205
PruebaCliente.java
1 package c07.p01;
2
3 public class PruebaCliente {
4 public static void main(String[] args) {
5 Cliente cliente1 = new Cliente();
6
7 cliente1.setNombre(“Alberto”);
8 cliente1.setApellidoPaterno(“Arenas”);
9 cliente1.setApellidoMaterno(“Aguirre”);
10 cliente1.setNumeroDeCliente(1001);
11
12 cliente1.imprimirCampos();
13
14 } // Fin del método main
15 } // Fin de la clase PruebaCliente
Cliente:
nombre = Carlos
apellidoPaterno = Cadena
apellidoMaterno = Castillo
numeroDeCliente = 2001
Figura 7.7 | Programa para comprobar la clase Cliente
206
extendiendo a la clase Persona, la clase Cliente hereda
todos los métodos de acceso public.
En la clase Persona (figura 7.3), en la línea 3,
7 public Cliente(){
8 setNombre(“”);
9 setApellidoPaterno(“”);
10 setApellidoMaterno(“”);
11 numeroDeCliente = 0;
12 } // Fin del constructor
207
se define un constructor para inicializar los campos. Observe
que el valor para el campo nombre es asignado a través del
método setNombre. Debido a que el campo nombre en la
clase Persona fue definido con nivel de acceso private,
en la clase Cliente, no se accede directamente al campo,
pero eso no significa que no se pueda trabajar con él, sí se
puede, pero a través de los métodos con nivel de acceso
public que haya definido la clase Persona, en este caso,
el método setNombre. Lo mismo sucede con los campos
apellidoPaterno y apellidoMaterno, a los que se
les asigna valor a través de los métodos setApellidoPa-
terno y setApellidoMaterno, los cuales fueron defini-
dos por la clase Persona y heredados por la clase Cliente.
En el caso del campo numeroDeCliente, éste sí puede ser
accedido directamente, puesto que es definido en la clase
Cliente, es así como en la línea 11 se asigna el valor de 0 a
este campo.
De la línea 14 a la 20,
208
22 public void imprimirCampos() {
23 System.out.println( “Cliente:” +
24 “\n\tnombre = “ + getNombre() +
25 “\n\tapellidoPaterno = “ +
getApellidoPaterno() +
26 “\n\tapellidoMaterno = “ +
getApellidoMaterno() +
27 “\n\tnumeroDeCliente = “ +
numeroDeCliente );
28 } // Fin del método imprimirCampos
209
7.3Nivel de acceso protected y default
En el capítulo anterior se trabajó con los niveles de acceso
public y private. Ahora se muestran los niveles de
acceso protected y default (sin modificador).
Modificador Clase Paquete Subclase Cualquiera
public Sí Sí Sí Sí
protected Sí Sí Sí No
Sin mo- Sí Sí No No
dificador
(default)
private Sí No No No
Figura 7.8 | Niveles de acceso
210
Beta podría acceder al elemento, puesto que está dentro del
mismo paquete y la clase AlfaSub, aunque no está dentro
del mismo paquete, sí está heredando de la clase Alfa, por
lo que podría acceder al elemento con nivel de acceso pro-
tected. La única clase que no podría acceder al elemento
sería la clase Gama. Ahora, si un elemento de la clase Alfa
tuviera un elemento con el nivel de acceso default, este
elemento podría ser accedido por la clase Alfa y por la clase
Beta. La clase AlfaSub y Gama no podrían acceder puesto
que están en otro paquete.
211
Alfa.java
1 package c07.p03.uno;
2
3 public class Alfa {
4
5 public int campoPublic;
6 int campoDefault;
7 protected int campoProtected;
8 private int campoPrivate;
9
10 public Alfa(){
11 campoPublic = 0;
12 campoDefault = 0;
13 campoProtected = 0;
14 campoPrivate = 0;
15 } // Fin del campo Alfa
16
17 } // Fin de la clase Alfa
Figura 7.11 | Clase Alfa con campo con diferentes niveles
de acceso.
212
Beta.java
1 package c07.p03.uno;
2
3 public class Beta {
4
5 public Beta(){
6 Alfa alfa = new Alfa();
7
8 alfa.campoPublic = 0;
9 alfa.campoDefault = 0;
10 alfa.campoProtected = 0;
11 // alfa.campoPrivate = 0; /* No se tiene
acceso */
12 } // Fin del constructor
13
14 } // Fin de la clase Beta
Figura 7.12 | Clase Beta que crea una instancia de la clase
Alfa y comprueba el acceso a los campos.
213
no puede ser accedido, si se llegase a quitar el comentario de
línea, la clase lanzaría un error al intentar compilarla, puesto
que los elementos con nivel de acceso private sólo pueden
ser accedidos desde la misma clase en la que son definidos.
AlfaSub.java
1 package c07.p03.dos;
2
3 import c07.p03.uno.Alfa;
4
5 public class AlfaSub extends Alfa {
6
7 public AlfaSub(){
8 Alfa alfa = new Alfa();
9
10 alfa.campoPublic = 0;
11 // alfa.campoDefault = 0; /* No se
tiene acceso */
12 // alfa.campoProtected = 0; /* No se
tiene acceso */
13 // alfa.campoPrivate = 0; /* No se
tiene acceso */
14
15 campoPublic = 0;
16 // campoDefault = 0; /* No se tiene
acceso */
17 campoProtected = 0;
18 // campoPrivate = 0; /* No se tiene
acceso */
19 } // Fin del constructor
20
21 } // Fin de la clase
Figura 7.13 | Clase AlfaSub que extiende a la clase Alfa y
comprueba el acceso a los campos.
214
De las 4 clases que trabajandas (Alfa, Beta, AlfaSub
y Gama) probablemente la clase AlfaSub (figura 7.13) sea
la que nos aporte más información para entender los niveles
de acceso. Esta clase se encuentra en un paquete diferente
a la clase Alfa y Beta. Ésta se encuentra en el paquete
c07.p03.dos. La clase AlfaSub extiende a la clase Alfa,
por lo que hereda sus campos, pero no significa que pueda
accederlos de forma directa. Así también, la clase AlfaSub
comprueba dos cosas: a qué campos puede acceder de una
instancia Alfa y a qué campos heredados, de la clase Alfa,
puede acceder de forma directa. En las líneas 10, 11, 12 y 13,
se muestra que la clase sólo puede acceder al campo cam-
poPublic. El resto de los campos no pueden ser accedidos.
En las 15, 16, 17 y 18, se muestra el acceso a los campos he-
redados de la clase Alfa. El campo campoPublic, en la
línea 15, es accedido sin problema, puesto que es public.
El campo campoDefault, en la línea 16, no es accedido,
puesto que la clase no se encuentra dentro del mismo paquete
que la clase Alfa. El campo campoProtected, en la línea
17, sí es accedido por el hecho de estar heredando de la clase
Alfa aún y cuando no estamos dentro del mismo paquete.
Por último, el campo campoPrivate no es accedido, lo
cual en estos momentos, entendemos que sólo podría reali-
zarse dentro de la misma clase en la que es definido.
215
Gama.java
1 package c07.p03.dos;
2
3 import c07.p03.uno.Alfa;
4
5 public class Gama {
6
7 public Gama(){
8 Alfa alfa = new Alfa();
9
10 alfa.campoPublic = 0;
11 // alfa.campoDefault = 0; /* No se
tiene acceso */
12 // alfa.campoProtected = 0; /* No se
tiene acceso */
13 // alfa.campoPrivate = 0; /* No se
tiene acceso */
14 } // Fin del constructor
15
16 } // Fin de la clase Gama
216
daciones al trabajar con clases, es brindar el mínimo privilegio
de acceso necesario a los miembros de la clase.
7.4Conclusión
En este capítulo se aprendió sobre la herencia, muy im-
portante en la creación de nuestros programas, puesto
que permite crear clases que generalicen las características
comunes de otras, de este modo, es posible tomar una clase
con características generales y especializarla con característi-
cas específicas en una nueva clase, sin necesidad de reescribir
el código. Así también se profundizó con mayor detalle en la
comprensión de los modificadores de acceso con los que se
controla la visibilidad de los miembros de una clase.
217
Referencias
219
de julio de 2020, en https://docs.oracle.com/javase/
tutorial/java/javaOO/accesscontrol.html
Convenciones de código para el lenguaje de programación
Java: 9. Convenciones de nomenclatura. Oracle.
com. (2010) Consultado el 14 de julio de 2020, en
https://www.oracle.com/java/technologies/javase/co-
deconventions-namingconventions.html.
Creando Objetos (Los Tutoriales Java ™> Aprendiendo
el Lenguaje Java> Clases y Objetos). Docs.oracle.
com. (2006) Consultado el 14 de julio de 2020, en
https://docs.oracle.com/javase/tutorial/java/javaOO/
objectcreation.html.
Guía de instalación. Centro de ayuda de Oracle. (2018) Con-
sultado el 14 de julio de 2020, en https://docs.oracle.
com/en/java/javase/11/install/installation-jdk-micro-
soft-windows-platforms.html.
Las declaraciones if-then y if-then-else (The Java ™ Tutorials>
Aprendiendo el lenguaje Java> Conceptos básicos del
lenguaje) . Docs.oracle.com. (2006) Consultado el 14
de julio de 2020, en https://docs.oracle.com/javase/
tutorial/java/nutsandbolts/if.html.
Matrices (Tutoriales de Java ™> Aprendizaje del lengua-
je Java> Conceptos básicos del lenguaje) . Docs.
oracle.com. (2006) Consultado el 14 de julio de
2020, en https://docs.oracle.com/javase/tutorial/java/
nutsandbolts/arrays.html.
Operadores de igualdad, relacionales y condicionales (Los
Tutoriales de Java ™> Aprendizaje del lenguaje
Java> Conceptos básicos del lenguaje) . Docs.oracle.
com. (2006) Consultado el 14 de julio de 2020, en
https://docs.oracle.com/javase/tutorial/java/nutsand-
bolts/op2.html.
220
Sánchez Allende, J., Fernández Manjón, B., Moreno Díaz, P.,
Sánchez, C., y Hueca Fernández Toribio, G. (2009).
Programación en JAVA (3a. ed.). McGraw-Hill España.
Schildt, H. y Rojas, E. (2010). Fundamentos de Java. Mc-
Graw-Hill Interamericana.
Santini, S. (2011). A discipline of java programming. Editorial
Universidad Autónoma de Madrid.
Tipos de datos primitivos (Tutoriales de Java ™> Aprendiza-
je del lenguaje Java> Conceptos básicos del lengua-
je) . Docs.oracle.com. (2006) Consultado el 14 de julio
de 2020, en https://docs.oracle.com/javase/tutorial/
java/nutsandbolts/datatypes.html.
Zohonero Martínez, I. y Joyanes Aguilar, L. (2008). Estructu-
ras de datos en Java. McGraw-Hill España.
Zukowski, J. (2007). Usando For-Loops mejorados con tus
clases . blogs.oracle.com. Consultado el 14 de julio
de 2020, en https://blogs.oracle.com/corejavatechtips/
using-enhanced-for-loops-with-your-classes.
Zohonero Martínez, I. y Joyanes Aguilar, L. (2008). Estructu-
ras de datos en Java. McGraw-Hill España
221