Creado por: Rodrigo Hernández para el laboratorio de Introducción a la Programación y Computación 1.
Este archivo contiene conceptos que te pueden ayudar a utilizar este paradigma de programación para la realización de tus proyectos y prácticas en Java.
La programación orientada a objetos (POO) es un paradigma de programación que utiliza objetos y sus interacciones para diseñar aplicaciones y programas de computadora. Este enfoque se basa en la creación de clases que representan entidades del mundo real y los objetos que se derivan de estas clases.
Un objeto es una instancia de una clase. Una clase es un modelo o plantilla a partir de la cual se crean objetos. Por lo tanto, un objeto es una instancia de una clase. Cuando se crea un objeto, se asigna memoria y se inicializa.
Una clase es una plantilla para crear objetos. Define los datos y el comportamiento de un tipo de objeto. Las clases se utilizan para definir objetos y contienen variables de instancia y métodos.
-
Definir una clase: La clase es la plantilla para crear objetos. Define los datos y el comportamiento de un tipo de objeto.
- Para crear una clase es necesario crear un nuevo archivo con extensión
.java
. Te tiene que quedar inicialmente este código:
NOTA:
El nombre del archivo debe ser el mismo nombre de la clase que estamos creando.Ejemplo de crear una Clase Carro
public class Carro { }
- Para crear una clase es necesario crear un nuevo archivo con extensión
-
Definir los atributos de la clase: Los atributos son las características de un objeto. Se definen dentro de la clase.
Por ejemplo en esta clase Carro, podemos definir que tiene los siguientes atributos:
- Color
- Marca
- Modelo
- Año
Entonces teniendo los atributos definidos, los agregamos a la clase:
public class Carro { //Atributos String color; String marca; String modelo; int año; }
-
Definir el constructor de la clase: El constructor es una subrutina cuya misión es inicializar un objeto de una clase. En el constructor se asignan los valores iniciales del nuevo objeto.
En base a los atributos definidos en el paso anterior, crearemos su constructor.
public class Carro { //Atributos String color; String marca; String modelo; int año; //Constructor public Carro(String color, String marca, String modelo, int año) { this.color = color; this.marca = marca; this.modelo = modelo; this.año = año; } }
-
Definir los métodos de la clase: Los métodos son las acciones que un objeto puede realizar. Se definen dentro de la clase.
Por ejemplo en esta clase Carro, podemos definir que tiene los siguientes métodos:
- Encender
- Apagar
- Acelerar
- Frenar
Entonces teniendo los métodos definidos, los agregamos a la clase:
public class Carro { //Atributos String color; String marca; String modelo; int año; //Constructor public Carro(String color, String marca, String modelo, int año) { this.color = color; this.marca = marca; this.modelo = modelo; this.año = año; } //Métodos public void encender() { System.out.println("El carro está encendido"); } public void apagar() { System.out.println("El carro está apagado"); } public void acelerar() { System.out.println("El carro está acelerando"); } public void frenar() { System.out.println("El carro está frenando"); } }
-
Encapsular los atributos de la clase: Para encapsular es necesario para que no cualquiera tenga acceso a los atributos de nuestra clase, asi que los ponemos privados y agregamos métodos para leer y editar estos métodos.
public class Carro { //Atributos //ATRIBUTOS ENCAPSULADOS private String color; private String marca; private String modelo; private int año; //Constructor public Carro(String color, String marca, String modelo, int año) { this.color = color; this.marca = marca; this.modelo = modelo; this.año = año; } //Métodos public void encender() { System.out.println("El carro está encendido"); } public void apagar() { System.out.println("El carro está apagado"); } public void acelerar() { System.out.println("El carro está acelerando"); } public void frenar() { System.out.println("El carro está frenando"); } //Métodos para encapsular los atributos //GET: Es para leer los atributos del objeto public String getColor() { return color; } public String getMarca() { return marca; } public String getModelo() { return modelo; } public int getAño() { return año; } //SET: Es para modificar los valores de los atributos del objeto public void setColor(String color) { this.color = color; } public void setMarca(String marca) { this.marca = marca; } public void setModelo(String modelo){ this.modelo = modelo; } public void setAño(int año){ this.año = año; } }
-
Crear un objeto de la clase: Para crear un objeto de una clase, se utiliza la palabra clave
new
seguida del nombre de la clase y de los paréntesis.La sintaxis es la siguiente
NOMBRE_OBJETO nombre_variable = new NOMBRE_OBJETO(LOS_ATRIBUTOS_QUE_ME_PIDE_EL_CONSTRUCTOR);
Por ejemplo, para crear un objeto de la clase Carro, se hace de la siguiente manera:
public class Main { public static void main(String[] args) { //Creación de un objeto de la clase Carro Carro miCarro = new Carro("Rojo", "Toyota", "Corolla", 2021); } }
-
Utilizar los métodos y atributos del objeto: Para utilizar los métodos y atributos de un objeto, se utiliza el operador punto
.
seguido del nombre del método o atributo.Por ejemplo, para utilizar el método
encender
del objetomiCarro
, se hace de la siguiente manera:public class Main { public static void main(String[] args) { //Creación de un objeto de la clase Carro Carro miCarro = new Carro("Rojo", "Toyota", "Corolla", 2021); //Utilización del método encender miCarro.encender(); } }
-
Imprimir los atributos del objeto: Para imprimir los atributos de un objeto, se utiliza el método
System.out.println()
.Por ejemplo, para imprimir el color del objeto `miCarro`, se hace de la siguiente manera: ```java public class Main { public static void main(String[] args) { //Creación de un objeto de la clase Carro Carro miCarro = new Carro("Rojo", "Toyota", "Corolla", 2021); //Utilización del método encender miCarro.encender(); //Imprimir el color del carro System.out.println("El color del carro es: " + miCarro.getColor()); } } ```
-
Modificar los atributos del objeto: Para modificar los atributos de un objeto, se utiliza el método
set
seguido del nombre del atributo y el valor que se desea asignar.Por ejemplo, para modificar el color del objeto
miCarro
, se hace de la siguiente manera:public class Main { public static void main(String[] args) { //Creación de un objeto de la clase Carro Carro miCarro = new Carro("Rojo", "Toyota", "Corolla", 2021); //Utilización del método encender miCarro.encender(); //Imprimir el color del carro System.out.println("El color del carro es: " + miCarro.getColor()); //Modificar el color del carro miCarro.setColor("Azul"); //Imprimir el color del carro System.out.println("El color del carro es: " + miCarro.getColor()); } }
La herencia es una característica de la programación orientada a objetos que permite a una clase heredar atributos y métodos de otra clase. La clase que hereda se conoce como subclase y la clase de la cual hereda se conoce como superclase.
Para heredar de una clase, se utiliza la palabra clave extends
seguida del nombre de la superclase.
Además usamos el super
para heredar y setear los valores del constructor de su clase padre.
Ejemplo:
-
Clase Padre:
public class Figura{ private String nombre; private int lados; public Figura(String nombre, int lados){ this.nombre = nombre; this.lados = lados; } public String getNombre(){ return nombre; } public int getLados(){ return lados; } public void setNombre(String nombre){ this.nombre = nombre; } public void setLados(int lados){ this.lados = lados; } }
-
Clase Hija:
public class Triangulo extends Figura{ private double base; private double altura; public Triangulo(double base, double altura){ super("Triángulo", 3); this.base = base; this.altura = altura; } public double getBase(){ return base; } public double getAltura(){ return altura; } public void setBase(double base){ this.base = base; } public void setAltura(double altura){ this.altura = altura; } }
El polimorfismo es una característica de la programación orientada a objetos que permite a una clase tener múltiples formas. Esto significa que una clase puede tener varios métodos con el mismo nombre pero con diferentes implementaciones.
Ejemplo:
-
Clase Padre:
public class Animal{ public void sonido(){ System.out.println("Sonido de un animal"); } }
-
Clase Hija:
public class Perro extends Animal{ public void sonido(){ System.out.println("Guau guau"); } }
public class Gato extends Animal{ public void sonido(){ System.out.println("Miau miau"); } }
public class Main{ public static void main(String[] args){ Animal animal = new Animal(); Perro perro = new Perro(); Gato gato = new Gato(); animal.sonido(); //Retorna en consola: Sonido de un animal perro.sonido(); //Retorna en consola: Guau guau gato.sonido(); //Retorna en consola: Miau miau } }
Una clase abstracta es una clase que no se puede instanciar. Se utiliza para definir una clase base que contiene métodos abstractos que deben ser implementados por las subclases. Ejemplo:
-
Clase Abstracta:
public abstract class Figura{ private String nombre; private int lados; public Figura(String nombre, int lados){ this.nombre = nombre; this.lados = lados; } public abstract double area(); }
-
Clase Hija:
public class Triangulo extends Figura{ private double base; private double altura; public Triangulo(double base, double altura){ //Se llama al constructor de la clase padre super("Triángulo", 3); this.base = base; this.altura = altura; } public double getBase(){ return base; } public double getAltura(){ return altura; } public void setBase(double base){ this.base = base; } public void setAltura(double altura){ this.altura = altura; } //SIEMPRE VA A OBLIGAR A USAR LA FUNCIÓN ÁREA @Override public double area(){ return (base * altura) / 2; } }
Una interfaz es una colección de métodos abstractos. Una clase puede implementar una o más interfaces. Las interfaces se utilizan para definir un contrato que una clase debe cumplir. Además las clases de una interfaz heredan utilizando la palabra reservado implements
.
A diferencia de una clase abstracta, las interfaces no contienen atributos, sino únicamente métodos.
Ejemplo:
-
Interfaz:
public interface Figura{ public double area(); }
-
Clase que implementa la interfaz:
public class Triangulo implements Figura{ private double base; private double altura; public Triangulo(double base, double altura){ this.base = base; this.altura = altura; } public double getBase(){ return base; } public double getAltura(){ return altura; } public void setBase(double base){ this.base = base; } public void setAltura(double altura){ this.altura = altura; } //FUNCION OBLIGATORIA A IMPLEMENTAR AL ESTAR HEREDANDO DE UNA INTERFAZ @Override public double area(){ return (base * altura) / 2; } }