- Editando una clase.
Ya tenemos varias clases creadas en nuestro entorno de desarrollo. Pero el código existente es un código de ejemplo que, aunque nos puede ser útil en algún momento. Vamos a escribir nuestro código partiendo de cero.
/* Ejemplo - Curso de Iniciación a Java */ public class Ejemplo { |
Seguidamente hacemos AutoLayout, compilamos el código y cerramos el editor. En la ventana principal de BlueJ veremos el icono de la clase Ejemplo. Nos situamos sobre él y pulsamos el botón derecho
En el menú desplegable, elegimos la opción void main (String[ ] arg). Pulsamos OK y nos aparece la ventana de consola de BlueJ. En la ventana de consola nos muestra el mensajes de texto.
Nota: Independientemente del IDE (BlueJ, Eclipse, NetBeans, etc.) que usemos, los procesos que “en el fondo” tienen lugar son los mismos. La gestión se podrá hacer en un tipo de ventana u otra, y pulsando unos botones u otros, pero lo que realmente permite que estos entornos den lugar a resultados es el sistema Java (destacando compilador y máquina virtual) que se encuentra en nuestro ordenador.
Otro concepto que vamos a introducir ahora es el de bloque. Vamos a denominar bloque al código comprendido dentro de los símbolos { y }. Por lo tanto en el programa anterior podríamos distinguir dos bloques. En ocasiones indicaremos junto al símbolo de cierre del bloque algún comentario que nos permita saber a qué bloque cierra ese símbolo. Esto no es necesario ni obligado, pero cuando los programas son largos nos puede ayudar. Ejemplo:
/* Ejemplo - Curso de iniciación a Java */ public class Ejemplo { public static void main(String [ ] arg) { System.out.println("Hola Java"); } //Cierre del main } //Cierre de la clase |
TIPOS DE DATOS (VARIABLES) EN JAVA.
Los primeros lenguajes de programación no usaban objetos, solo variables. Una variable podríamos decir que es un espacio de la memoria del ordenador a la que asignamos un contenido que puede ser un valor numérico (sólo números, con su valor de cálculo) o de tipo carácter o cadena de caracteres (valor alfanumérico que constará sólo de texto o de texto mezclado con números).
Como ejemplo podemos definir una variable a que contenga 32 y esto lo escribimos como a = 32. Posteriormente podemos cambiar el valor de a y hacer a = 78. O hacer “a” equivalente al valor de otra variable “b” así: a = b.
Dado que antes hemos dicho que un objeto también ocupa un espacio de memoria: ¿en qué se parecen y en qué se diferencia un objeto de una variable? Consideraremos que las variables son entidades elementales: un número, un carácter, un valor verdadero o falso… mientras que los objetos son entidades complejas que pueden estar formadas por la agrupación de muchas variables y métodos. Pero ambas cosas ocupan lo mismo: un espacio de memoria (que puede ser más o menos grande).
En Java diferenciamos dos tipos de datos: por un lado, los tipos primitivos, que se corresponden con los tipos de variables en lenguajes como C y que son los datos elementales que hemos citado. Por otro lado, los tipos objeto (que normalmente incluyen métodos).
Veamos los tipos de datos en Java sobre un esquema de síntesis:
Este esquema no es necesario aprendérselo de memoria en todos sus detalles, aunque sí lo iremos memorizando poco a poco a medida que lo utilicemos, por lo menos hasta tener en nuestra cabeza los nombres de todos los tipos primitivos y envoltorio y sus características (si son objetos o no y su rango aproximado). A continuación mostramos el mismo esquema en formato de tabla:
TIPOS DE DATOS EN JAVA | NOMBRE | TIPO | OCUPA | RANGO APROXIMADO | |
TIPOS PRIMITIVOS (sin métodos; no son objetos; no necesitan una invocación para ser creados) | byte | Entero | 1 byte | -128 a 127 | |
short | Entero | 2 bytes | -32768 a 32767 | ||
int | Entero | 4 bytes | 2*109 | ||
long | Entero | 8 bytes | Muy grande | ||
float | Decimal simple | 4 bytes | Muy grande | ||
double | Decimal doble | 8 bytes | Muy grande | ||
char | Carácter simple | 2 bytes | --- | ||
boolean | Valor true o false | 1 byte | --- | ||
TIPOS OBJETO (con métodos, necesitan una invocación para ser creados) | Tipos de la biblioteca estándar de Java | String (cadenas de texto) Muchos otros (p.ej. Scanner, TreeSet, ArrayList…) | |||
Tipos definidos por el programador / usuario | Cualquiera que se nos ocurra, por ejemplo Taxi, Autobus, Tranvia | ||||
arrays | Serie de elementos o formación tipo vector o matriz. Lo consideraremos un objeto especial que carece de métodos. | ||||
Tipos envoltorio o wrapper (Equivalentes a los tipos primitivos pero como objetos.) | Byte | ||||
Short | |||||
Integer | |||||
Long | |||||
Float | |||||
Double | |||||
Character | |||||
Boolean | |||||
Vamos a comentar distintas cuestiones:
1. Un objeto es una cosa distinta a un tipo primitivo, aunque “porten” la misma información. Tener siempre presente que los objetos en Java tienen un tipo de tratamiento y los tipos primitivos, otro. Que en un momento dado contengan la misma información no significa en ningún caso que sean lo mismo. Iremos viendo las diferencias entre ambos poco a poco. De momento, recuerda que el tipo primitivo es algo elemental y el objeto algo complejo. Supón una cesta de manzanas en la calle: algo elemental. Supón una cesta de manzanas dentro de una nave espacial (considerando el conjunto nave + cesta): algo complejo. La información que portan puede ser la misma, pero no son lo mismo.
2. ¿Para qué tener esa aparente duplicidad entre tipos primitivos y tipos envoltorio? Esto es una cuestión que atañe a la concepción del lenguaje de programación. Tener en cuenta una cosa: un tipo primitivo es un dato elemental y carece de métodos, mientras que un objeto es una entidad compleja y dispone de métodos. Por otro lado, de acuerdo con la especificación de Java, es posible que necesitemos utilizar dentro de un programa un objeto que “porte” como contenido un número entero. Desde el momento en que sea necesario un objeto habremos de pensar en un envoltorio, por ejemplo Integer. Inicialmente nos puede costar un poco distinguir cuándo usar un tipo primitivo y cuándo un envoltorio en situaciones en las que ambos sean válidos. Seguiremos esta regla: usaremos por norma general tipos primitivos. Cuando para la estructura de datos o el proceso a realizar sea necesario un objeto, usaremos un envoltorio.
3. Los nombres de tipos primitivos y envoltorio se parecen mucho. En realidad, excepto entre int e Integer y char y Character, la diferencia se limita a que en un caso la inicial es minúscula (por ejemplo double) y en el otro es mayúscula (Double). Esa similitud puede confundirnos inicialmente, pero hemos de tener muy claro qué es cada tipo y cuándo utilizar cada tipo.
4. Una cadena de caracteres es un objeto. El tipo String en Java nos permite crear objetos que contienen texto (palabras, frases, etc.). El texto debe ir siempre entre comillas. Muchas veces se cree erróneamente que el tipo String es un tipo primitivo por analogía con otros lenguajes donde String funciona como una variable elemental. En Java no es así.
5. Hay distintos tipos primitivos enteros. ¿Cuál usar? Por norma general usaremos el tipo int. Para casos en los que el entero pueda ser muy grande usaremos el tipo long. Los tipos byte y short los usaremos cuando tengamos un mayor dominio del lenguaje.
6. ¿Cuántos tipos de la biblioteca estándar de Java hay? Cientos o miles. Es imposible conocerlos todos.
7. ¿Un array es un objeto? Los arrays los consideraremos objetos especiales, los únicos objetos en Java que carecen de métodos.
DECLARACIÓN E INICIALIZACIÓN DE VARIABLES EN JAVA.
Nos valdremos primeramente de algunos tipos primitivos usados habitualmente como son int (entero), String (cadena de caracteres), boolean (valor booleano verdadero o falso), float (decimal simple), etc.
/* Ejemplo - Curso de Iniciación a a Java */ public class Ejemplo2 { private int precio; /* Las instrucciones y declaraciones finalizan con */ private int importe_acumulado; private String profesor; private String aula; private int capacidad; private boolean funciona; private boolean esVisible; private float diametro; private float peso; private short edad; private long masa; private char letra1; } //Cierre de la clase |
Hemos declarado variables de tipo primitivo u objeto usando la sintaxis private tipoElegido nombreVariable;
La palabra clave private es un indicador de en qué ámbito del programa va a estar disponible la variable. Supón que el programa es un edificio con gente trabajando y que hay elementos en el edificio, por ejemplo una impresora, que pueden tener un uso: individual para una persona, colectivo para un grupo de personas, colectivo para todas las personas de una planta, colectivo para todas las personas de un departamento aunque estén en varias plantas, o colectivo para todo el edificio. Pues bien, las variables en Java van a quedar disponibles para su uso en ciertas partes del programa según especifiquemos con las palabras clave public, private, protected, package, etc. Lo veremos más adelante, ahora simplemente nos interesa ver cómo declarar variables y usaremos de forma preferente la palabra clave private.
El hecho de declarar una variable implica que se reserva un espacio de memoria para ella, pero no que ese espacio de memoria esté ocupado aunque pueda tener un contenido por defecto. Ten en cuenta que en Java no puedes aplicar algunas normas que rigen en otros lenguajes, como que al declarar una variable entera ésta contendrá por defecto el valor cero. En Java esta situación puede dar lugar a errores de compilación: una variable entera no debemos suponer que contenga nada. Para que contenga algo debemos asignarle un contenido. Veamos ejemplos de asignación de contenido:
/* Ejemplo - Curso de Iniciación a Java */ Precio = 42; /* Entero tipo int. Un número sin punto decimal se interpreta normalmente como int. */ importe_acumulado = 210; // Entero tipo int profesor = “Ernesto Juárez Pérez”; // Tipo String aula = “A-44”; // Tipo String capacidad = 1500; // Entero tipo int funciona = true; // Tipo boolean esVisible = false; // Tipo boolean diametro = 34.25f; // Tipo float. Una f o F final indica que es float. peso = 88.77; /* Tipo double. Un número con punto decimal se interpreta normalmente como double. */ edad = 19; // Entero tipo short masa = 178823411L; // Entero tipo long. Una l o L final indica que es long. letra1 = ‘h’; // Tipo char (carácter). Se escribe entre comillas simples. |
Hemos planteado la declaración de variables en primer lugar y la asignación de contenido en segundo lugar y por separado porque será una forma habitual de trabajar en Java.
Esto no significa que en determinadas ocasiones no podamos declarar e inicializar (asignar contenido) simultáneamente. Por ejemplo: int edad = 19; será una expresión válida y que utilizaremos en determinadas ocasiones, según iremos viendo.
La inicialización es un paso importante de cara a permitir un uso seguro de una variable. Es tan importante, que en general plantearemos que se haga como paso previo a cualquier otra cosa. Por ejemplo, si pensamos utilizar una variable denominada precio lo primero que haremos será establecer un valor de precio o, si no lo conocemos o lo vamos a establecer más adelante, estableceremos explícitamente un valor por defecto: por ejemplo precio = - 99; ó precio = 0;. Utilizar una variable sin haberla inicializado es una práctica no recomendada en Java (mal estilo de programación) que puede dar lugar a errores o al malfuncionamiento de los programas.
- Paso de parámetros.
MÉTODOS PROCEDIMIENTO (VOID) Y FUNCIÓN (RETURN)
Creemos una clase taxi, de la cual creamos varios objetos. en la parte inferior izquierda de la pantalla del entorno de desarrollo. Si pulsamos con botón derecho del ratón sobre ellos se nos despliegan los métodos (operaciones) disponibles para cada objeto.
Pulsa sobre el taxi1 y elige la opción String getDistrito.
La ejecución de un método se denomina habitualmente “invocación” del método o “llamada” al método. Los métodos disponibles los define la clase, pero se invocan sobre cada objeto en particular. Al invocar el método getDistrito() se nos abre una ventana de BlueJ denominada Method Result donde nos indica: returned String “Desconocido”. Le hemos pedido al objeto que nos diga cuál es su distrito y nos devuelve “Desconocido”. La razón para ello es que en el constructor de la clase incluimos una línea de inicialización de distrito para todo objeto de tipo Taxi con el valor “Desconocido”. Si en vez de ese valor hubiésemos establecido otro, ese sería el que ahora obtendríamos.
Cierra esa ventana y repite el proceso eligiendo ahora la opción void setDistrito (String valorDistrito). En el recuadro donde solicita el distrito escribe “Oeste”. No olvides incluir las comillas obligadas por tratarse de un String. Seguidamente, vuelve a invocar el método getDistrito y comprueba el resultado obtenido.
Los métodos que hemos definido en la clase Taxi podemos clasificarlos de la siguiente manera:
a) Métodos tipo función: son métodos que nos devuelven algo. Un método es tipo función si comienza con un tipo (no consideramos ahora la palabra clave public). Por ejemplo String getDistrito() comienza con el tipo String lo que significa que nos devuelve una cadena de caracteres, mientras que int getTipoMotor() comienza con el tipo int lo que significa que nos devuelve un entero. Tener en cuenta que un método tipo función devuelve solo un dato u objeto como resultado, no varios. La devolución del resultado se expresa con la palabra clave return seguida del dato u objeto a devolver, por ejemplo return tipoMotor;. La sentencia return implica que termina la ejecución del código en el método y estará típicamente en la línea final. De existir una línea por detrás de una sentencia return, nunca llegaría a ejecutarse (tendremos que matizar esto porque el uso de condicionales nos permitirá tener más de un return en un método). De forma genérica:
/* Ejemplo - Curso de Iniciación a Java */ //Comentario descriptivo de qué hace el método public tipoValorDevuelto nombreDelMétodo (tipo parámetro1, tipo parámetro2…) { Código del método return ResultadoQueDevuelveElMétodo; } |
b) Métodos tipo procedimiento: son métodos que realizan ciertas operaciones sin devolver un valor u objeto concreto. Un método es tipo procedimiento si comienza con la palabra clave void (que traducido del inglés viene siendo “vacío” o “nulo”). En estos casos podemos decir que el tipo de retorno es void. De forma genérica:
/* Ejemplo - Curso de Iniciación a Java */ //Comentario descriptivo de qué hace el método public void nombreDelMétodo (tipo parámetro1, tipo parámetro2…) { Código del método } |
En general un método con tipo de retorno void no llevará sentencia return, aunque en Java se permite que un método de este tipo incluya la sentencia return;. Si ocurre esto, la sentencia da lugar a que el método finalice en ese punto sin ejecutar ninguna línea más de código. Solo tiene sentido su uso asociado a que se cumplan ciertas condiciones.
¿Puede un método ser al mismo tiempo función y procedimiento? Formalmente debemos evitarlo. Podríamos tratar de agrupar operaciones, pero es una situación que trataremos de evitar. Nos plantearemos como objetivo que todo método tipo función se centre en devolvernos aquello que nos interesa sin realizar otros procesos. Igualmente buscaremos que todo procedimiento realice un proceso concreto y no varios. Cada método debe realizar una tarea concreta, específica y bien definida. Un método no debe ocuparse de dos tareas.
- El nombre de la Clase pública no coincide con el nombre del archivo
Cada archivo .java puede contener sólo una Clase pública. - Una Clase no está en el directorio correcto
Este error de sintaxis ocurre si el comando javac no puede encontrar un archivo .java en el directorio esperado. - Usando equals contra la asignación ( == versus = )
En Java este error puede ser incluso un error de lógica o sintaxis. Para comparar 2 referencias para igualarlas se usa el operador == (el operador de igualdad). Para asignar el valor de la derecha a la variable de la izquierda se usa el operador = (operador de asignación). - Error en mayúsculas y minúsculas.
Java es un lenguaje case sensitive, esto es que debemos respetar las mayúsculas y minúsculas. (miVariable no es igual a mivariable). - Olvidar que los índices en Java empiezan en 0.
Los índices de los arrays de Java y las listas empiezan en 0. - NullPointerException
El NullPointerException, la maldición de los programadores en Java. Los NullPointerExceptions son errores de lógica causados cuando un programa intenta acceder a métodos o atributos en una referencia que está nula.
Fecha tope el día 16 de marzo de 2026 a las 23:59 horas.
Por correo electrónico a: luis.vazquez@lugo.uned.es
Ejemplo de Código Java para Actividad 3
En el asunto del correo indicar: Actividad 3 y Nombre y Apellidos
Adjuntar los ficheros.java creados para resolver el problema planteado "Fichero.java"
No hay comentarios:
Publicar un comentario