Aprende Java Fácil. Introducción

Capítulo 1. Introducción

Una vida despreocupada en Salamanca / Introducción y tipos de datos

Durante toda mi vida me he sentido intocable. No he tenido grandes preocupaciones y siempre he contado con el apoyo de amigos y familiares. No era consciente de que, en cualquier momento, mi suerte podría cambiar radicalmente. La mayoría de la gente piensa que tiene todo bajo control, pero hay cosas que no dependen de uno mismo. Son precisamente esas cosas las que pueden pillarte por sorpresa en cualquier momento. Eso es exactamente lo que me pasó a mí.

Tengo entendido que quieres aprender a programar en Java. No te preocupes, yo voy a enseñarte y, además, lo haré de forma sencilla. En realidad, la programación no es difícil, al menos no tan difícil como parece. Pero, antes de empezar, deja que me presente.

Mi nombre real es Pelayo, aunque todos me llaman Peli. Soy estudiante de primer año de universidad. Vivo en Salamanca y me gustaría dedicarme a la informática. De momento, las cosas no están saliendo como pensaba. Lo cierto es que ya hemos entrado en la segunda mitad del semestre y apenas he aparecido por clase. Muchos de los profesores ni siquiera me conocen.

Para ser honesto, he dedicado la mayor parte del tiempo a pasarlo bien y conocer gente. Sé que probablemente, debería empezar a estudiar cuanto antes, pero esa no es mi prioridad.

Aprende programación

Este fin de semana voy a celebrar una fiesta en mi piso y quiero que sea perfecta. No me gusta alardear, pero creo que, poco a poco, las reuniones en mi casa se están haciendo muy populares. En realidad, no vivo solo; por lo tanto, no es exactamente mi piso. Comparto casa con otros dos universitarios, Rich y Chani. La verdad es que son mejores estudiantes que yo, aunque tampoco se puede decir que sean muy responsables. No nos conocíamos de antes, pero en poco tiempo nos hemos hecho buenos amigos.

Aprende a programar

Rich es un estudiante de intercambio inglés, aunque habla un perfecto castellano. Siempre va muy bien vestido y pasa muchas horas delante del espejo. Eso no significa que sea arrogante. Al contrario, es una persona muy humilde y carismática.

Cae bien a todo el mundo y siempre es el centro de atención. Eso le gusta. Durante los últimos meses hemos pasado mucho tiempo juntos y se ha convertido en mi mejor amigo.

En realidad, fue la primera persona que conocí aquí, o al menos, la primera con quien empecé a entablar amistad. En mi primera clase me tocó sentarme a su lado. No recuerdo por qué empezamos a hablar, pero desde el primer minuto parecía como que lo conocía de toda la vida.

Ese mismo día me comentó que no quería vivir en la residencia de estudiantes. Yo aún no tenía alojamiento, así que le propuse compartir casa. Aceptó de inmediato. El problema era que, entre dos, no nos alcanzaba para pagar el alquiler de un piso. Necesitábamos a una tercera persona. Pusimos un anuncio en el tablón online de la universidad y un joven asiático nos contactó a las pocas horas. Se trataba de Chani, quien se convirtió en nuestro nuevo amigo

Chani también es un estudiante de intercambio, concretamente de Corea del Sur. Se está esforzando por aprender nuestro idioma, pero no le resulta fácil. A veces, pienso que para mí sería imposible aprender coreano.

Es bastante introvertido, pero eso no le impide asistir a todas las fiestas. Pasa casi todo el día encerrado en su habitación, durmiendo o jugando con el ordenador. Solamente sale de su cuarto para cocinar e ir al baño. Parece un vampiro. En cuanto cae la noche, decide que es momento para activarse y pasar el rato con nosotros.

Aprende a programar en Java

Somos un grupo de amigos poco convencional, pero nos funciona bien. La convivencia es muy buena. No discutimos nunca y respetamos mucho nuestro espacio. Un par de veces a la semana pedimos pizza y cenamos todos en nuestro amplio salón. Durante la semana apenas traemos invitados, pero no nos sentimos solos ya que nos tenemos los unos a los otros. No podría haber tenido más suerte eligiendo a mis compañeros.

Nos encanta la zona común de nuestra casa. Es muy grande y espaciosa. Cuenta con unas ventanas enormes y acceso a la terraza. Hemos conseguido unos sofás muy baratos e incluso un pequeño futbolín con el que se entretienen las visitas. Nunca había vivido en una casa mejor que esta y el precio es mucho más barato de lo que parece.

Aprende Java Fácil. Introcucción.

Paso casi todo mi día aquí acostado, muchas veces en compañía de Rich. Él sabe que apenas estoy asistiendo a las clases de la universidad y le preocupa que no vaya a aprobar ninguno de mis exámenes. Así que se ha ofrecido a enseñarme a programar en Java. Sabe bastante del tema y explica las cosas de forma sencilla y clara.

Pero bueno, no me enrollo más. Hechas las presentaciones, creo que es un buen momento para recordar las enseñanzas de Rich. Así que, en lo que queda del capítulo, me centraré en repasar y afianzar algunos conceptos. Será algo muy básico, simplemente una pequeña introducción al mundo de Java y sus tipos de datos más utilizados.

Introducción. Definición de POO y presentación de los tipos de datos.

Lo primero que siempre se menciona cuando se enseña Java es que es un tipo de programación orientada a objetos. Da igual de dónde saques la información o quién te lo esté explicando, siempre vas a encontrarte con frases como estas:

“La programación orientada a objetos (POO) es un paradigma de programación que se basa en el concepto de «objetos». Estos objetos son entidades que combinan datos y funciones (llamadas métodos) relacionadas en una sola unidad. La idea principal detrás de la programación orientada a objetos es modelar el mundo real en el software, lo que permite representar de manera más precisa y eficiente los elementos y procesos del mundo real en nuestros programas”.

Si no has entendido nada, no te preocupes. Si lo has hecho, enhorabuena, vas un paso por delante de la mayoría de novatos. Cuando programas en Java, al igual que en muchos otros lenguajes, el código no se escribe de forma lineal. Eso sería poco práctico. Hay que tener en cuenta que ciertos programas o aplicaciones complejas tienen decenas o incluso cientos de miles de líneas de código.

Es mucho más práctico dividir ese código en pequeños grupos que interactúen entre sí. Esto nos ayudará, por ejemplo, a identificar y solucionar errores en el código de forma mucho más rápida, a reutilizar código ya escrito y a evitar la duplicación del mismo, a dividir las tareas entre varias personas de forma sencilla, a realizar un mantenimiento del código eficaz y organizado, a implementar características nuevas en la aplicación y, en definitiva, a hacer nuestra vida más sencilla.

Atención ahora, porque voy a plantear una posible pregunta de examen: dime los cuatro conceptos fundamentales en los que se basa la programación orientada a objetos.

La POO se basa en cuatro conceptos fundamentales:

Clases: Una clase es como un plano o plantilla que define las características y comportamientos comunes de un tipo particular de objeto. Define los datos que puede contener un objeto (llamados atributos) y las operaciones que puede realizar (llamadas métodos). Por ejemplo, si pensamos en un objeto «coche», la clase correspondiente puede definir los atributos como color, modelo y velocidad, y los métodos como acelerar y frenar.

Objetos: Los objetos son instancias concretas de una clase. Cada objeto tiene su propia copia de los datos definidos en la clase, pero comparte los métodos definidos en la misma. Por ejemplo, si tenemos una clase «Coche», un objeto específico podría ser un coche rojo modelo Toyota Corolla con una velocidad actual de 60 km/h.

Encapsulación: La encapsulación es el concepto de ocultar los detalles internos de un objeto y exponer solo la funcionalidad necesaria a través de interfaces bien definidas. Esto se logra definiendo los atributos de la clase como privados y proporcionando métodos públicos (getters y setters) para acceder y modificar estos atributos de manera controlada. La encapsulación ayuda a mantener el código modular, facilita el mantenimiento y reduce el riesgo de errores.

Herencia: La herencia es un mecanismo que permite que una clase (llamada subclase o clase derivada) herede los atributos y métodos de otra clase (llamada superclase o clase base). Esto permite la reutilización de código y la creación de jerarquías de clases, donde las clases más específicas pueden agregar o modificar el comportamiento heredado. Por ejemplo, una clase «Vehículo» puede ser una superclase de las clases «Coche» y «Camión», que heredan sus características básicas, pero pueden tener comportamientos específicos adicionales.

No es necesario que aprendas estos términos de memoria. Vamos a trabajar con ellos en los siguientes temas y, poco a poco, se irán afianzando en tu cabeza. Aunque te conviene familiarizarte con ellos y conocer su existencia. De momento, nos quedamos simplemente con la idea de que Java es un lenguaje orientado a objetos.

Programar es una actividad poco intuitiva en la que se utilizan muchos términos desconocidos. Poco a poco, todo comenzará a tener sentido, pero recuerda que deberás ser constante y no tirar la toalla.

Tipos de datos y variables:

No sé si te gusta cocinar, pero seguro que alguna vez has tratado de preparar alguna receta en tu casa. Si comparamos la programación con la cocina, podríamos decir que los tipos de datos son los ingredientes, la materia prima que utilizamos para crear nuestro programa.

Las variables, en cambio, son los lugares donde guardas esos ingredientes para usarlos más adelante en tu receta, como frascos o tazones que contienen harina, azúcar, etc.

–      Tipos de datos.

En Java, los tipos de datos se clasifican en dos grupos principales: tipos de datos primitivos y tipos de datos de referencia.

Tipos de datos primitivos: Son los tipos básicos integrados en el lenguaje. Existen ocho en total:

      • byte: Un tipo entero de 8 bits que permite almacenar valores entre -128 y 127.
      • short: Un entero de 16 bits que puede manejar valores entre -32,768 y 32,767.
      • int: Un entero de 32 bits que abarca valores entre -2^31 y 2^31 – 1.
      • long: Un entero de 64 bits que permite representar valores desde -2^63 hasta 2^63 – 1.
      • float: Un número de punto flotante de 32 bits, con una precisión de aproximadamente 6- 7 dígitos decimales.
      • double: Un número de punto flotante de 64 bits, con una precisión de alrededor de 15 dígitos decimales.
      • char: Representa un único carácter Unicode de 16 bits.
      • boolean: Solo puede tener dos valores posibles: true o false.

      Tipos de datos de referencia: En lugar de contener directamente los datos, estos tipos almacenan referencias a objetos en la memoria. Algunos de los más comunes incluyen:

      • String: Una secuencia de caracteres utilizada para representar texto. A diferencia de muchos lenguajes, en Java no es un tipo primitivo, sino de referencia.
      • Arrays: Estructuras que almacenan múltiples elementos del mismo tipo de manera contigua en la memoria.

      – Variables

      En Java, una variable es un contenedor que almacena datos que pueden cambiar durante la ejecución de un programa. Repito: los datos dentro de una variable pueden cambiar a medida que se va ejecutando el programa. Las variables tienen un nombre que se utiliza para referirse a ellas y un tipo de datos que especifica qué tipo de valores pueden contener.

      Por ejemplo: int variable = 7;

      En la variable anterior podemos ver que el tipo de dato es int y que su nombre es “variable”. Además, vemos que, en estos momentos, su valor es 7. Puede que ese valor durante la ejecución del programa varíe, pero ahora es 7.

      Cuando declaramos una variable, debemos hacerlo dependiendo del tipo de dato que necesitemos. Las variables quedan condicionadas por el tipo de dato que albergan. Una variable numérica no podrá albergar datos de texto. Por lo tanto, podemos referirnos a ellas con la misma calificación que damos a los tipos de datos. Eso provoca que, en muchas ocasiones, veamos escritos indistintamente ambos términos y, al final, resulte confuso.

      Es más sencillo explicarlo con un ejemplo. Imagínate que necesitamos crear una variable llamada “nombre”. Esa variable albergará un tipo de dato de texto (String), en concreto con el nombre de Pedro. Así que aquí la tenemos:

      String nombre = «Pedro»;

      Esa variable es ahora una variable de tipo “String” ya que alberga un tipo de dato de texto.

      Hay bastantes tipos de datos y es bueno que conozcas todos. Aunque, de momento y para los ejercicios que vamos a ir haciendo, simplemente te hará falta conocer unos pocos. Como he comentado en el párrafo anterior, los tipos de datos están ligados a las variables. Por eso, y para no liarnos, a partir de ahora utilizaremos solamente el término variable.

      Veamos ahora una definición un poco más extensa sobre las variables que vas a necesitar conocer:

      Variables enteras (int): Las variables enteras se utilizan para almacenar números enteros. Por ejemplo, podemos usar una variable entera para representar la edad de una persona o la cantidad de productos en inventario. En Java, declaramos una variable entera utilizando la palabra clave «int», seguida del nombre de la variable y opcionalmente, su valor inicial.

      Por ejemplo:

      int edad = 25;

      Variable de texto (String): Se utiliza para almacenar secuencias de caracteres, es decir, texto. Para definir una variable de tipo String, simplemente usamos la palabra clave String, seguida del nombre de la variable y opcionalmente, asignamos un valor. Aquí tienes un ejemplo de cómo definir una variable String en Java:

      String miNombre = «Juan»;

      Variables de punto flotante (float y double): Estas variables se utilizan para almacenar números con decimales. La diferencia entre float y double radica en la precisión del número decimal que pueden almacenar. En Java, usamos «float» para números de precisión simple y «double» para números de precisión doble. Por ejemplo:

      float altura = 1.75f; double pi = 3.14159;

      Variables booleanas (boolean): Una variable booleana solo puede tomar uno de dos valores: verdadero (true) o falso (false). Estas variables son útiles para representar condiciones lógicas. Por ejemplo:

      boolean esMayorDeEdad = true;

      Variables de caracteres (char): Las variables de caracteres se utilizan para almacenar un solo carácter. Por ejemplo, podemos usar una variable de caracteres para representar una letra o un símbolo. En Java, declaramos una variable de carácter utilizando la palabra clave «char». Por ejemplo:

      char inicial = ‘A’;

      Las ventajas de especificar el tipo de datos que una variable puede contener son las siguientes:

      1. Hacer nuestro código más sencillo y fácil de entender: si no especificáramos el tipo de datos que una variable puede contener, el código resultaría casi imposible de entender para ti y para otros programadores. Saber qué tipo de datos espera una variable ayuda a comprender cómo se utilizará en el programa.
      2. Detección de errores: Si intentas asignar un valor de un tipo incorrecto a una variable, se te advertirá sobre este error. Esto ayuda a encontrar errores incluso antes de que el programa se ejecute, lo que facilita la tarea de programación y evita errores en tiempo real.
      3. Mejor rendimiento: En algunos casos, el tipado de variables puede mejorar el rendimiento del programa, ya que el código puede ser optimizado sabiendo los tipos de datos que se están utilizando.
      4. Facilita el mantenimiento del código: Cuando vuelvas a revisar o modificar tu código en el futuro, tener tipos de datos indicados puede ayudarte a recordar cómo se supone que se deben usar ciertas variables. Si es otra persona quien revisa el código, esto se vuelve todavía más útil. Esto facilita el mantenimiento y la actualización del código a medida que el proyecto evoluciona.

      Diferencia entre la asignación y la declaración de variables.

      Ahora que ya sabemos qué tipos de datos hay, necesitamos saber cómo implementarlos en nuestro código. Ya hemos visto algunos ejemplos en los párrafos anteriores:

      String miNombre = «Juan»; int edad = 25;

      double pi = 3.14159;

      boolean esMayorDeEdad = true; char inicial = ‘A’;

      Como puedes apreciar siempre empezamos escribiendo el tipo de dato que necesitamos. Por ejemplo, String, int, double, boolean, char. Después, el nombre que hemos elegido para la variable. Todo ello seguido por un signo de igual. Posteriormente, el valor asignado y siempre terminando en punto y coma.

      Fíjate en que, para el tipo de dato String, el texto asignado debe estar siempre entre comillas dobles: «Juan». En el caso de un char, el carácter que queramos en nuestra variable debe estar entre comillas simples: ‘A’.

      Ahora bien, no siempre es necesario asignar un valor a nuestra variable. Simplemente podemos declararla y hacer uso de ella posteriormente. Por ejemplo, empezamos un ejercicio que nos pide crear una variable String llamada nombre y otra variable int denominada matrícula. Como puedes ver, no es necesario asignarles ningún valor.

      String nombre;

      int matricula;

      Puede que en estos momentos te parezca que esto no tiene sentido. ¿Por qué no asignar un valor nada más crear una variable? Es básicamente por motivos de orden y estructura. En cuanto empieces a tener algo de soltura con los ejercicios, verás que todo tiene una razón de ser.

      Es posible que te estés preguntando cómo asignar un valor a una variable que ya ha sido declarada. Vamos a continuar con los dos ejemplos que hemos visto dos párrafos más arriba (nombre y matrícula). Simplemente lo haremos de la siguiente forma:

      nombre = «Juan»;

      matricula = 55;

      Lo único que debemos hacer es tener en cuenta el tipo de dato que queremos utilizar (String e int en el ejemplo). Después, simplemente seguiremos la estructura normal que ya habíamos visto: nombre de la variable, signo igual y el valor que queremos añadir.

      Convención en el nombre de las variables en Java

      En Java, las variables siguen ciertas reglas de convención para nombrarlas. Aquí te explico las principales:

      Empiezan con letra minúscula: El nombre de una variable debe comenzar con una letra minúscula. Por ejemplo: edad, estatura, anchura, etc.

      Usa camelCase: Esto significa que, si el nombre de la variable está compuesto más de una palabra, la primera letra de cada palabra después de la primera se escribe en mayúscula, sin espacios ni guiones. Por ejemplo: edadActual, estaturaCompleta, anchuraTotal, etc.

      Significativo y descriptivo: Intenta usar nombres que indiquen lo que se está representando. Por ejemplo, en lugar de x o y, podrías usar edad o saldoCuenta.

      Evita caracteres especiales: Solo se permiten letras, números y el guion bajo _. Otros caracteres como espacios, guiones (-), puntos (.), entre otros, no deben de ser usados en el nombre de una variable.

      No uses palabras clave de Java: Evita usar palabras reservadas por Java (como int, float, while, etc.) como nombres de variables, si lo haces, puede que después haya errores en tu código.

      No uses acentos ni caracteres especiales: Java no permite utilizar acentos ni caracteres especiales en los nombres de variables.

      Siguiendo estas reglas, tus programas serán más fáciles de leer y entender para ti y para otras personas que lean tu código.

      Resumen de lo aprendido

      En este primer capítulo, has iniciado tu incursión en el mundo de la programación en Java.

      ¡Enhorabuena! No todo el mundo se atreve con este reto. Ahora ya se puede decir que tienes una idea general de cómo se estructura Java y lo que significa el término “programación orientada a objetos” (POO).

      Además, ya sabes cuáles son los cuatro pilares fundamentales de la POO: clases, objetos, encapsulación y herencia. Si alguno de estos conceptos aún no te queda claro, no te preocupes, es normal. No creo que mucha gente lo entienda todo a la primera. Siendo realistas, no hemos profundizado mucho en el tema y aún quedan muchos interrogantes por resolver. Aunque desde este punto, aprender nuevos conceptos te resultará mucho más sencillo.

      A estas alturas, seguramente te sientas más a gusto hablando de los tipos de datos y de las variables. Son conceptos más concretos y fáciles de asimilar. Cuando empecemos con la parte práctica, van a ser indispensables en todos nuestros ejercicios. Sabemos que existen tipos de datos primitivos y de referencia. Además, hemos hecho hincapié en la importancia que tiene en Java la especificación de los tipos de datos. Con ello se consigue mejorar la claridad, detectar errores y facilitar el mantenimiento del código.

      También hemos tenido tiempo para aprender cuál es la diferencia entre la asignación y la declaración de variables.

      Aunque de momento no sea una prioridad en tu aprendizaje, has podido echar un vistazo a las convenciones de nomenclatura en Java para nombrar variables. Pronto vas a empezar a trabajar con variables y deberás crear tu propio código, en el que tendrás total libertad para elegir los nombres de las variables. Mi consejo es que trates de seguir esta convención para que te vayas acostumbrando a seguir buenas prácticas.

      Como resumen, diremos que ya has dado tu primer paso en el mundo de la programación. Aún queda un largo camino; entiendo que la teoría a veces es un poco aburrida, pero es totalmente necesaria. Esta introducción te servirá para establecer una base sólida con la que comprender los conceptos más avanzados que se abordarán en los siguientes capítulos.

      Seguro que ya tienes ganas de meterte en faena y empezar a escribir tus propios programas. Si te soy sincero, es mi parte favorita. Así que no te preocupes, porque pronto comenzaremos a solucionar ejercicios y a utilizar los conocimientos teóricos que estamos adquiriendo.