POO (Programación Orientada a Objetos), public, private y clases en Java - 1
Para entrar al conocido mundo de la programación orientada a objetos en Java se necesita comprender el concepto de clase y sus utilidades. Para esto resaltaremos dos puntos: La definición y su estructura.
1. En Java, las clases son la base para la programación orientada a objetos (POO). Una clase es una plantilla o modelo que define un conjunto de propiedades y comportamientos comunes que comparten los objetos que se crean a partir de ella.
2. Para definir una clase en Java, se utiliza la palabra reservada “class”, seguida del nombre de la clase. Dentro de una clase se pueden definir variables, métodos y constructores. Los métodos son funciones que se definen dentro de una clase y se utilizan para realizar operaciones específicas.
Veamos un ejemplo:
Supongamos que has creado una clase llamada "Estudiante" que hace referencia a un estudiante universitario. Para crearla, debes hacer clic derecho en la carpeta "src" ubicada en el "Package Explorer", seleccionar "New" y luego "class".
(Haz clic en las imágenes si no son muy claras)
Observa que no se marcó la casilla “public static void
main(String[] args)”, ya que este método se encuentra en la clase “App” ya
creada en posts anteriores. Si no tienes esta clase créala con el método “main”
marcando la casilla y luego la clase “Estudiante”.
Luego de creada la clase, debes agregar las características
correspondientes del estudiante, como el nombre, universidad y carrera. Puedes hacerlo
declarando variables con las características como nombre.
En la imagen se puede
observar que las variables se han declarado como tipo "String", lo cual es adecuado
dado que se asignarán valores de texto. Sin embargo, es importante notar que se
utiliza un modificador llamado “private” que antecede al tipo. Este modificador
restringe el acceso a las variables únicamente a la misma clase donde fueron
declaradas. Por lo tanto, si desde la clase “App” intentamos acceder a un
objeto “Estudiante” y a alguna propiedad con el modificador “private”, no será posible
hacerlo. Sin embargo, si llamamos a alguna propiedad dentro de la misma clase “Estudiante”,
sí será posible acceder a ella. Este concepto se llama encapsulamiento y es una
medida de seguridad que ayuda a prevenir errores y asegura que el código sea
más robusto y fácil de mantener en el futuro.
Se
accede a la propiedad nombre mediante el uso de “this” y se asigna a un nueva
variable “a” sin problemas.
Se instancia
la clase “Estudiante” en la clase “App” y se intenta acceder a la propiedad
nombre sin éxito.
La forma correcta de acceder a los atributos o variables de clase es mediante el uso de “getters” y “setters”, lo que significa que debes declarar métodos “get” para acceder a las variables de “Estudiante” desde otra clase, y métodos “set” para asignar un valor a las mismas variables desde otra clase.
Para crear estos métodos, haz clic derecho en la ventana con
el código, selecciona “Source” y luego haz clic en “Generate Getters and Setters…”.
También puedes utilizar el atajo o “shortcut” “Alt + Shift + s” y en la pequeña
ventana hacer clic en “Generate Getters and Setters…”.
Como ya mencioné anteriormente, con los métodos “get” y “set”,
podrás acceder a los atributos de la clase “Estudiante de forma segura y
controlada evitando el acceso directo a las variables privadas desde una clase externa
y es una buena práctica de programación.
Como último consejo de este punto, si tu código no es fácil
de leer puedes presionar las teclas “Ctrl + Shift + f” y tu código tendrá un
espaciado correcto.
Constructor y métodos.
Hasta ahora, hemos creado una clase “Estudiante” con tres
atributos privados para restringir su acceso solo a la misma clase, y también
hemos creado los métodos “getter” y “setter” para acceder a estos atributos desde
fuera de la clase.
Ahora necesitamos crear un contructor para la clase. Para
hacerlo, puedes hacer clic derecho en la ventana del código, seleccionar “Source”
y luego “Generate Constructor using Fields…”. Este constructor será útil más
adelante, pero asegúrate de generarlo después de la declaración de las variables.
Si no está en el lugar correcto, puedes copiarlo y pegarl
o en el lugar adecuado.
En la siguiente imagen, el constructor se encuentra a partir de la fila 8.
Para abordar el tema de métodos tomemos como referencia a los “getters” y “setters” de la clase “Estudiante”. Estos tienen el modificador “public”, lo que les permite ser accedidos desde fuera de la clase. En el caso de los “setters”, son de tipo “void”, lo que significa que solo ejecutan el código que está dentro de las llaves “{}”, sin devolver ningún valor. Sin embargo, pese a no devolver valores, es necesario pasarles un valor como argumento o parámetro en el paréntesis del método. En este paréntesis, se especifica el nombre del parámetro y su tipo de dato.
Instancia
de clase
Sitúate en
la clase “App” haciendo doble clic en el archivo “App.java” en el “Package
Explorer”. Dentro del método “main()” deberás crear una variable de nombre “estudiante”
y tipo de dato “Estudiante” de la siguiente forma:
Ahora debes asignarle
un valor de tipo “Estudiante”, pero ¿a qué se refiere esto?
Veamos otro ejemplo para comparar. Si declaramos la variable llamada “vari1” de tipo “String”, debemos agregarle un valor de tipo “String”, es decir, un texto. Si declaramos la variable “num1” de tipo “Integer”, le debemos asignar un valor del tipo correspondiente, que en este caso sería un número. Sin embargo, al declarar la variable llamada ”estudiante” y asignarle el tipo “Estudiante”, debemos asignarle un valor de tipo “Estudiante” que no tenemos. Es aquí donde entra en juego el concepto de instancia de clase. Usando la palabra reservada “new”, podemos utilizar la clase “Estudiante” como una plantilla para crear un objeto de tipo “Estudiante”.
Sin embargo,
aún no acaba la instrucción para instanciar a la clase “Estudiante”, debemos
llamar al constructor agregando unos paréntesis. Si revisas la clase “Estudiante”
abriendo el archivo “Estudiante.java”, el constructor tiene los siguientes parámetros:
nombre, universidad y carrera. Entonces debemos agregar sus valores dentro del
paréntesis en el mismo orden.
Al instanciar
la clase “Estudiante” se ha creado un objeto de la clase “estudiante”, con todos
los atributos y métodos correspondientes. Adicionalmente, por el constructor pasaron
los parámetros “Flavio”, “UNFV” y “Física”, de forma que tengamos un objeto con
esos valores.
Si estás
siguiendo el post y de la mano escribiendo el código, te propongo mostrar lo
que has aprendido creando un nuevo objeto llamado “estudiante2” y agregando tu
nombre, universidad o alguna institución educativa a la que asistes y carrera
respectivamente como parámetros. Para el ejemplo, agregaré “Pepito”, “Universidad
FAS”, “Estadística”.
Antes de
continuar voy a plantear una analogía. Supongamos que nuestro amigo en común “Monty”
tiene dos mascotas: un perro y un gato. Él anota tres características de cada
uno como sigue:
Mascota1:
-
Tipo:
perro
-
Nombre:
Scrapy
-
Años:
7
Mascota2:
-
Tipo:
gato
-
Nombre:
Pelusa
-
Años:
5
Se ha dado cuenta que si tiene una plantilla para mascotas puede rellenar los campos cada vez que tenga una mascota nueva. de la siguiente forma:
Mascota:
-
Tipo:
-
Nombre:
-
Años:
Tanto la “mascota1”
y “mascota2” son conocidos como objetos o instancias en programación, ya que
son entidades que poseen características o atributos, al igual que cualquier
otro objeto en nuestro alrededor. Ambos fueron creados a partir de la misma clase
(plantilla), llamada “Mascota”, por tanto, tienen las mismas variables, pero
sus valores pueden ser iguales o diferentes.
El mismo
concepto se aplica a nuestras instancias previas, “estudiante” y “estudiante2”,
las cuales también fueron creadas a partir de la misma clase (plantilla) “Estudiante”,
y por ende, comparten las mismas variables con valores diferentes.
Para verificar el correcto funcionamiento
de nuestro código, es necesario imprimir los nombres de cada estudiante. Para lograrlo,
puedes hacer uso de la clase “System” y el método “getNombre()” de cada
estudiante, el cual permitirá obtener el nombre de cada una de las instancias
de la clase “Estudiante”. Es importante recordar que las instancias fueron
creadas a partir de una misma clase, por lo que comparten los mismos métodos,
incluyendo el constructor.
Vamos a
ejecutar el código. Si no recuerdas como hacerlo, puedes hacer clic derecho sobre
la clase “App.java” en el “Package Explorer”, luego seleccionar “Run As” y finalmente
hacer clic en “Java Application”.
Como puedes ver los nombres de cada
instancia son diferentes, de esta forma puedes crear varios objetos de un mismo
tipo. Lo que sucede es que en memoria se asigna un espacio diferente para cada
uno, pese a ser del mismo tipo “Estudiante” tienen un identificador diferente. Si
deseas ver el identificador, imprime directamente el objeto, no su método “getNombre()”.
Este concepto será de gran ayuda cuando tengas realizar cierta lógica con el
objeto más adelante.
Constructor
sin parámetros
Siguiendo
con el ejemplo anterior, abre la clase “Estudiante.java”, copia y pega el
constructor, pero borra los parámetros y las instrucciones dentro de las llaves.
Procura que este constructor sin parámetros se encuentre justo debajo de las
variables y por encima del constructor con parámetros.
Ahora crea instancia nuevamente la
clase “Estudiante” con el nombre “estudiante3”, y el paréntesis déjalo vacío,
sin parámetros. Verás que no habrá error.
De esta
forma puedes crear un objeto con parámetros específicos, si los agregas en el
paréntesis o un objeto limpio con atributos sin valor si dejas vacío el paréntesis.
Tienes libertad de crear los constructores con el número de parámetros que
creas necesarios para tu proyecto.
Si en este
momento imprimes el valor del atributo “nombre” de “estudiante3” llamando al
método “getNombre()” no debería mostrarse nada en consola porque no tiene
valor.
Vamos a hacer
uso del método “setNombre()” y “setUniversidad()”, y luego imprimiremos el sus
valores. Para hacerlo agrega la instrucción “estudiante3.setNombre(“Bob”)”. Observa
que dentro del paréntesis le pasamos el valor que queremos guardar en el
atributo nombre como un parámetro. Eres libre de cambiar el valor si deseas,
pero es necesario agregarlo, ya que, el método “setNombre” requiere un parámetro
en la clase “Estudiante”. Repite este proceso con el método “setUniversidad()”
pasando el valor que prefieras como parámetro y luego imprime los valores
usando la clase “System”. Puedes guiarte
de la siguiente imagen.
Si algo no
te ha quedado claro aún, vuelve a leer cuantas veces sea necesario. Estos
conceptos te sacarán de apuros en un futuro.
Antes de
finalizar, me gustaría dejar unas actividades del tema y una específica de
Monty.
- Crea
el objeto “estudiante4” con el constructor sin parámetros.
- Agrega
un nombre al “estudiante4”.
- Agrega
una universidad al “estudiante4”.
- Imprime
los valores en consola de nombre y universidad del estudiante 4.
- Sin
borrar nada del código, cambia el nombre del “estudiante4” por “Patricio Estrella”.
- Imprime
nuevamente en consola los valores de nombre y universidad del estudiante 4.
- Haz
cambios en los valores de los atributos de los estudiantes anteriores como se hizo
con el estudiante 4.
Como último punto
a detallar, te comento que la clase estudiante puede tener como atributo a otra
clase. Por ejemplo, Monty ha dejado como tarea que crees la clase Mascota que
se comentó líneas arriba y la agregues como atributo de la clase Estudiante. ¿Podrías
resolverlo? La solución se verá en la segunda parte de este post.
¡Felicidades! Ya estás un paso más cerca de crear una aplicación con Java.
Comentarios
Publicar un comentario