Paquetes y archivos de Java

Ha llegado el momento, en el curso, de explicar el tema de los modificadores de acceso en Java y el uso de paquetes y archivos. Un tema importante para poder empezar a manejar programas más complejos y mejor estructurados.

En este capítulo, no explicaré prácticamente nada de los modificadores de acceso. Eso será en el siguiente.

¿Qué son los paquetes de Java?

En Java, podemos agrupar clases relacionadas en un paquete. Esto nos permite organizar nuestro código y evitar conflictos de nombres repetidos. Además, podemos usar los modificadores de acceso para controlar el alcance de las clases y métodos de nuestros paquetes.

Para crear un paquete en Java, debemos añadir una declaración de paquete al inicio de nuestro archivo de código. Por ejemplo:

package paquetePruebas;

Para poder emplear este paquete, no podemos tener el archivo en la carpeta principal del proyecto, ‘src’.

Crear un paquete de Java

Para crear un paquete de Java, iremos a la carpeta src y haremos click derecho > new > package.

paquetes java

Una vez tenemos el paquete creado en la raíz y el archivo Main.java colocado en el paquete, ya podemos incluir la línea sin problemas:

package paquetePruebas;

Todas las clases que se encuentren en el mismo archivo y debajo de la declaración de paquete formarán parte de ese paquete. También podemos crear subpaquetes dentro de un paquete padre, simplemente añadiendo más niveles de carpetas:

package paquetePruebas.subpaquete;

Sin embargo, de momento, no lo voy a complicar tanto. Trabajaremos de momento con un paquete, los subpaquetes para otro día.

Cuando queremos usar una clase de un paquete en otra clase, debemos importarla al inicio del archivo de código. Por ejemplo:

import paquetePruebas.MiClase;

class Main {
    public static void main(String[] args) {
        MiClase obj = new MiClase();
    }
}

Vamos a hacer la prueba en nuestros archivos del proyecto.

Creamos una archivo nuevo de Java en la carpeta src:

archivos java

Este será su contenido. Una clase vacía por el momento.

public class Test {
    
}

Ahora, para poder utilizar la clase Usuario que está dentro del paquete y el archivo Main.java, debemos hacer un import de dicha clase:


import paquetePruebas.Usuario;

Sin embargo, arroja el siguiente error:

Error en la consola

‘paquetePruebas.Usuario’ is not public in ‘paquetePruebas’. Cannot be accessed from outside package

El error dice que la clase Usuario del paquetePruebas, no puede ser accedida desde fuera del paquete.

¿Recuerdas que hace unos capítulos dije que si a una clase no le dábamos un modificador de acceso se quedaba siempre en private-package?

El modificador private package, el cual explicaré en el siguiente capítulo, permite que se acceda a dicha clase solo desde elementos que están en el propio paquete. Sin embargo, el archivo Test.java desde el cual estoy haciendo el import, está fuera del paquete. De forma que no tengo acceso a dicha clase.

Entonces, la solución, es que le de el modificador de acceso public a la clase Usuario.

No te preocupes por los modificadores de acceso, te los explicaré mejor en el siguiente capítulo.

Sencillamente, con public dejamos la clase visible (pública) fuera del paquete también.

El problema está, que al hacer esto, me da error:

public class Usuario { }

Error en la consola

Class ‘Usuario’ is public, should be declared in a file named ‘Usuario.java’

El error dice que la clase Usuario es pública y debe ser declarada en un archivo llamado Usuario.java.

Estoy con el archivo Main.java. Este archivo ya tiene una clase llamada Main que es Public.

En Java, no es posible tener más de una clase con modificador de acceso public en un archivo de Java. Esto se debe a que el compilador de Java solo permitirá que una clase tenga el modificador de acceso public.

Entonces ya sabes lo que toca. Dentro del paquete paquetePruebas, vamos a crear un archivo donde poner la clase Usuario como pública. Este archivo se debe llamar como su clase, Usuario.java.

clases de java

IntelliJ IDEA, puesto que hemos creado este archivo en el paquete, ya nos añade en todos los archivos pertenecientes la línea de la declaración de paquete:

package paquetePruebas;

Entonces, el archivo Usuario.java, quedará así:

package paquetePruebas;

public class Usuario {
    //Atributos
    public String nombre;
    String apellidos;
    int edad;
    String direccion;
    String telefono;

    // constructor de la clase
    public Usuario(String nombre, String apellidos, int edad, String direccion, String telefono) {
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.edad = edad;
        this.direccion = direccion;
        this.telefono = telefono;
    }

    //Método para mostrar la información del objeto
    public void mostrarDatos() {
        System.out.println("Nombre: " + nombre);
        System.out.println("Apellidos: " + apellidos);
        System.out.println("Edad: " + edad);
        System.out.println("Dirección: " + direccion);
        System.out.println("Teléfono: " + telefono);
    }
}

Si nos vamos ahora al archivo Test.java. Verás que solo hay un warning, pero el error ha desaparecido:

Warning

Unused import statement

Este warning, indica que lo que hemos importado, no se ha utilizado. Todo a su tiempo IntelliJ. Aún no hemos tenido tiempo de hacerlo.

Vamos a quitar las instanciaciones de la clase Main y las colocamos en la clase Test:

import paquetePruebas.Usuario;

public class Test {
    //Instancias de Usuario
    Usuario usuario1 = new Usuario("Juan", "Pérez García", 32, "Av. del Pacífico, 23", "+34-91-000-0000");
    Usuario usuario2 = new Usuario("María", "Rodríguez Martínez", 28, "C/ del Sol, 5", "+34-91-000-0000");
}

Aunque no está en este archivo la clase Usuario, podemos usarla como si estuviera en este mismo archivo, gracias al import.

Esto nos va a ahorrar escribir y repetir mucho código, puesto que lo podremos acceder allá donde necesitemos solo con paquetes e imports.

Vamos a intentar llamar al método mostrarDatos() de la clase Usuario, para que nos muestre el reporte de datos de dicho objeto:

import paquetePruebas.Usuario;

public class Test {
    //Instancias de Usuario
    Usuario usuario1 = new Usuario("Juan", "Pérez García", 32, "Av. del Pacífico, 23", "+34-91-000-0000");
    Usuario usuario2 = new Usuario("María", "Rodríguez Martínez", 28, "C/ del Sol, 5", "+34-91-000-0000");

    usuario1.mostrarDatos();
}

Sin embargo, la línea 8, arroja un nuevo error:

Error en la consola

Cannot resolve symbol ‘mostrarDatos’

Dice que no se puede resolver el símbolo «mostrarDatos». Básicamente, que no encuentra el acceso necesario para llegar a ese método.

El problema realmente, está en que en Java, no se puede acceder a un objeto y su método de esta manera fuera de un método.

Para poder acceder al método mostrarDatos de los objetos usuario1 y usuario2, debes hacerlo desde un método de la clase Test. Por ejemplo, podrías hacerlo desde el método main de la siguiente manera:

Además, si intentas ejecutar el archivo, verás que IntelliJ IDEA dice que el archivo en el editor no es ejecutable:

el archivo de java no es ejecutable

En Java, el método main es el punto de entrada de una aplicación. Es decir, es el método que se ejecuta cuando lanzamos la aplicación. Por lo tanto, si un archivo no tiene un método main, no podrá ser ejecutado como aplicación. Sin embargo, ese archivo sí podría ser utilizado por otra aplicación que sí contenga un método main. De momento, no lo vamos a complicar más y lo dejamos puesto en este archivo.

import paquetePruebas.Usuario;

public class Test {
    public static void main(String[] args) {
        //Instancias de Usuario
        Usuario usuario1 = new Usuario("Juan", "Pérez García", 32, "Av. del Pacífico, 23", "+34-91-000-0000");
        Usuario usuario2 = new Usuario("María", "Rodríguez Martínez", 28, "C/ del Sol, 5", "+34-91-000-0000");

        //Llamada al método de uno de los objetos
        usuario2.mostrarDatos();  // se llama al método mostrarDatos del objeto usuario2

    }
    
}

Ahora sí, por fín tenemos acceso y podemos utilizar una clase desde otro archivo y paquete.

Resultado en la consola

Nombre: María
Apellidos: Rodríguez Martínez
Edad: 28
Dirección: C/ del Sol, 5
Teléfono: +34-91-000-0000

Todo el temario del curso Java aquí.


Una respuesta a «Los paquetes y archivos en Java para principiantes»

  1. Buenas tardes, para no tener que aprendernos el método main, en nuestro IDE podemos escribir «main» + INTRO (pulsamos INTRO) y lo genera automáticamente. 🙂

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Trending