Desarrollo de Software

Preguntas de POO que deberias dominar para entrevistas tecnicas

OOP Interview Questions You Should Master

Muchos programadores pierden entrevistas no porque no sepan programar, sino porque no logran explicar con claridad conceptos que usan todos los dias. La Programacion Orientada a Objetos (POO) es uno de los temas mas evaluados, y aun asi muchos candidatos se traban cuando les piden explicar la diferencia entre abstraccion y encapsulamiento, o cuando usar una interfaz en lugar de una clase abstracta.

Esta guia recopila las preguntas mas comunes de POO en entrevistas, organizadas desde los fundamentos hasta los principios de diseno, para que puedas responder con claridad y confianza.

Fundamentos

Que es la Programacion Orientada a Objetos?

Explicacion simple: La POO es un paradigma de programacion que organiza el codigo alrededor de "objetos" -- entidades que combinan datos (atributos) y comportamiento (metodos). En lugar de escribir scripts procedurales largos, modelas conceptos del mundo real como objetos que interactuan entre si.

Respuesta de entrevista: "La POO es un paradigma que estructura el software alrededor de objetos que encapsulan estado y comportamiento. Promueve la reutilizacion, modularidad y mantenibilidad a traves de sus cuatro pilares: encapsulamiento, abstraccion, herencia y polimorfismo."

Ejemplo: Un objeto Carro tiene atributos como color y velocidad, y metodos como acelerar() y frenar().

Que es una clase?

Explicacion simple: Una clase es un plano o plantilla que define la estructura y el comportamiento que tendran los objetos de ese tipo. No contiene datos reales -- describe que datos y metodos tendra un objeto.

Respuesta de entrevista: "Una clase es un plano que define los atributos y metodos que tendra un objeto. Actua como una plantilla a partir de la cual se crean instancias (objetos)."

Ejemplo: La clase Perro define que todo perro tiene un nombre y puede ladrar(), pero no es un perro especifico hasta que creas una instancia.

Que es un objeto?

Explicacion simple: Un objeto es una instancia concreta de una clase. Es la entidad real que vive en memoria con valores reales asignados a los atributos definidos por su clase.

Respuesta de entrevista: "Un objeto es una instancia de una clase que contiene estado real y puede ejecutar los comportamientos definidos en su clase."

Ejemplo: miPerro = new Perro("Rex") -- aqui miPerro es un objeto de la clase Perro con el nombre "Rex".

Cual es la diferencia entre una clase y un objeto?

Explicacion simple: Una clase es la receta; un objeto es el plato que cocinas a partir de ella. La clase define la estructura; el objeto es la instancia concreta con valores reales.

Respuesta de entrevista: "Una clase es la definicion o plantilla, mientras que un objeto es una instancia viva de esa clase en memoria. Puedes crear multiples objetos a partir de una sola clase, cada uno con diferente estado."

Ejemplo: Carro es la clase. miCarro = new Carro("rojo") y tuCarro = new Carro("azul") son dos objetos diferentes.

Los 4 Pilares de la POO

Que es el Encapsulamiento?

Explicacion simple: El encapsulamiento significa ocultar los datos internos de un objeto y exponer solo lo necesario a traves de metodos publicos. Protege el estado interno de modificaciones externas no deseadas.

Respuesta de entrevista: "El encapsulamiento restringe el acceso directo al estado interno de un objeto y proporciona acceso controlado a traves de metodos publicos (getters/setters). Esto protege la integridad de los datos y reduce el acoplamiento."

Ejemplo: Una clase CuentaBancaria tiene un atributo privado saldo. No puedes modificarlo directamente -- debes usar los metodos depositar() o retirar(), que validan la operacion antes de cambiar el saldo.

Que es la Abstraccion?

Explicacion simple: La abstraccion significa mostrar solo las caracteristicas esenciales de un objeto y ocultar los detalles complejos de implementacion. El usuario sabe que hace un objeto, pero no como lo hace internamente.

Respuesta de entrevista: "La abstraccion expone solo el comportamiento relevante de un objeto mientras oculta su complejidad interna. Simplifica la interaccion proporcionando una interfaz clara sin revelar detalles de implementacion."

Ejemplo: Cuando llamas a servicioEmail.enviar(email), no necesitas saber como funciona internamente la conexion SMTP, la autenticacion o el formato del mensaje.

Que es la Herencia?

Explicacion simple: La herencia permite que una clase herede atributos y metodos de otra clase (la clase padre). Promueve la reutilizacion de codigo al permitir que las clases hijas extiendan o especialicen el comportamiento de las clases padre.

Respuesta de entrevista: "La herencia es un mecanismo donde una clase hija adquiere las propiedades y comportamientos de una clase padre. Permite la reutilizacion de codigo y establece una relacion 'es-un' entre tipos."

Ejemplo: Perro y Gato ambos extienden Animal. Heredan el metodo comer() pero pueden sobrescribir hacerSonido() con su propia implementacion.

Que es el Polimorfismo?

Explicacion simple: El polimorfismo significa que el mismo metodo puede comportarse de manera diferente dependiendo de que objeto lo invoque. Te permite escribir codigo que trabaja con un tipo general pero ejecuta el comportamiento especifico de cada subtipo.

Respuesta de entrevista: "El polimorfismo permite que objetos de diferentes clases respondan a la misma llamada de metodo de su propia manera. Permite escribir codigo flexible que trabaja con tipos base mientras ejecuta comportamiento especifico del subtipo en tiempo de ejecucion."

Ejemplo: Un metodo hacerSonido() en una referencia Animal producira "Guau" si el objeto es un Perro y "Miau" si es un Gato.

Cual es la diferencia entre Abstraccion y Encapsulamiento?

Explicacion simple: La abstraccion decide que mostrar al mundo exterior (la interfaz). El encapsulamiento decide como proteger los datos internos (la implementacion). La abstraccion simplifica; el encapsulamiento protege.

Respuesta de entrevista: "La abstraccion se enfoca en exponer solo la interfaz relevante y ocultar la complejidad, mientras que el encapsulamiento se enfoca en restringir el acceso al estado interno. La abstraccion es sobre diseno; el encapsulamiento es sobre control de acceso. Se complementan mutuamente."

Ejemplo: Una clase abstracta ProcesadorPago define procesarPago() (abstraccion). La clase concreta ProcesadorStripe mantiene la API key como campo privado (encapsulamiento).

Interfaces y Clases Abstractas

Que es una Interfaz?

Explicacion simple: Una interfaz es un contrato que define que metodos debe implementar una clase, sin proporcionar ninguna implementacion. Especifica comportamiento sin dictar como debe hacerse.

Respuesta de entrevista: "Una interfaz define un contrato de metodos que las clases implementadoras deben cumplir. No contiene implementacion -- solo firmas de metodos. Permite polimorfismo y desacoplamiento."

Ejemplo: Una interfaz Conducible define acelerar() y frenar(). Tanto Carro como Motocicleta la implementan, cada uno a su manera.

Que es una Clase Abstracta?

Explicacion simple: Una clase abstracta es una clase que no puede instanciarse directamente. Puede contener tanto metodos implementados (comportamiento compartido) como metodos abstractos (que las subclases deben implementar). Esta entre una clase regular y una interfaz.

Respuesta de entrevista: "Una clase abstracta proporciona una implementacion parcial que las subclases deben completar. Puede tener metodos concretos (logica compartida) y metodos abstractos (sobrescritura obligatoria). A diferencia de las interfaces, puede contener estado y logica de constructor."

Ejemplo: Una clase abstracta Forma implementa getColor() (compartido) y declara calcularArea() como abstracto (cada forma lo calcula diferente).

Cuando usar una Interfaz vs. una Clase Abstracta?

Explicacion simple: Usa una interfaz cuando quieras definir un contrato que clases no relacionadas puedan implementar. Usa una clase abstracta cuando quieras compartir codigo comun entre clases estrechamente relacionadas.

Respuesta de entrevista: "Usa una interfaz cuando necesites un contrato puro entre tipos no relacionados -- define que hacer, no como. Usa una clase abstracta cuando necesites implementacion compartida entre clases relacionadas. En lenguajes con herencia simple, las interfaces tambien permiten una forma de herencia multiple."

Ejemplo: Serializable es una interfaz -- cualquier clase puede ser serializable. Vehiculo es una clase abstracta -- solo tipos de vehiculos deberian extenderla y compartir su logica de encenderMotor().

Principios SOLID

SOLID es un conjunto de cinco principios de diseno que te ayudan a escribir codigo orientado a objetos mantenible, flexible y escalable.

S -- Principio de Responsabilidad Unica (SRP)

Explicacion simple: Una clase debe tener solo una razon para cambiar. Cada clase debe hacer una cosa y hacerla bien.

Respuesta de entrevista: "SRP establece que una clase debe tener una sola responsabilidad -- una razon para cambiar. Esto reduce el acoplamiento y hace la clase mas facil de probar y mantener."

Ejemplo: En lugar de una clase Usuario que maneja validacion, persistencia en base de datos y envio de emails, dividela en ValidadorUsuario, RepositorioUsuario y ServicioEmail.

O -- Principio Abierto/Cerrado (OCP)

Explicacion simple: Las clases deben estar abiertas para extension pero cerradas para modificacion. Deberias poder agregar nuevo comportamiento sin cambiar el codigo existente.

Respuesta de entrevista: "OCP significa que un modulo debe permitir extender su comportamiento sin modificar su codigo fuente. Esto se logra tipicamente mediante herencia, interfaces o el patron strategy."

Ejemplo: Un CalculadorDescuento usa una interfaz EstrategiaDescuento. Para agregar un nuevo tipo de descuento (ej. DescuentoBlackFriday), creas una nueva clase implementando la interfaz en lugar de editar el calculador.

L -- Principio de Sustitucion de Liskov (LSP)

Explicacion simple: Una subclase debe ser utilizable donde sea que se espere su clase padre, sin romper el programa. Si parece un pato y hace cuac como un pato, debe comportarse como un pato.

Respuesta de entrevista: "LSP establece que los objetos de una superclase deben ser reemplazables por objetos de sus subclases sin alterar la correctitud del programa. Los subtipos deben respetar el contrato de su tipo base."

Ejemplo: Si Rectangulo tiene un metodo setAncho(), una subclase Cuadrado que lo sobrescribe para tambien establecer la altura viola LSP porque cambia el comportamiento esperado de setAncho().

I -- Principio de Segregacion de Interfaces (ISP)

Explicacion simple: No obligues a una clase a implementar metodos que no necesita. Es mejor tener varias interfaces pequenas y especificas que una interfaz grande de proposito general.

Respuesta de entrevista: "ISP establece que los clientes no deben ser forzados a depender de interfaces que no usan. Divide interfaces grandes en otras mas pequenas y especificas por rol para que las clases implementadoras solo necesiten conocer los metodos relevantes para ellas."

Ejemplo: En lugar de una interfaz Trabajador con trabajar(), comer() y dormir(), crea Trabajable, Alimentable y Dormible. Un Robot implementa solo Trabajable.

D -- Principio de Inversion de Dependencias (DIP)

Explicacion simple: Los modulos de alto nivel no deben depender de modulos de bajo nivel. Ambos deben depender de abstracciones (interfaces). Esto hace tu sistema flexible y facil de cambiar.

Respuesta de entrevista: "DIP establece que los modulos de alto nivel deben depender de abstracciones, no de implementaciones concretas. Esto desacopla los componentes y hace el sistema mas facil de extender, probar y mantener mediante inyeccion de dependencias."

Ejemplo: Un ServicioNotificacion depende de una interfaz EnviadorMensaje, no de EnviadorEmail directamente. Puedes intercambiar EnviadorEmail por EnviadorSms sin cambiar el servicio.

Diseno y Conceptos de Entrevista

Que es el Acoplamiento?

Explicacion simple: El acoplamiento mide cuanto depende una clase de otra. Un acoplamiento bajo es deseable porque significa que puedes cambiar una clase sin romper otras.

Respuesta de entrevista: "El acoplamiento es el grado de interdependencia entre modulos. Un acoplamiento bajo significa que los modulos pueden cambiar independientemente, lo que mejora la mantenibilidad y la capacidad de prueba."

Ejemplo: Si ServicioOrdenes instancia directamente BaseDatosMySQL, estan fuertemente acoplados. Usar una interfaz BaseDatos en su lugar reduce el acoplamiento.

Que es la Cohesion?

Explicacion simple: La cohesion mide cuan estrechamente relacionadas estan las responsabilidades de una clase. Alta cohesion significa que cada metodo y atributo en la clase sirve a un proposito unico y claro.

Respuesta de entrevista: "La cohesion mide cuan enfocada esta una clase en una sola responsabilidad. Alta cohesion significa que todos los metodos y propiedades de una clase estan estrechamente relacionados y trabajan hacia el mismo proposito."

Ejemplo: Un RepositorioUsuario con solo metodos de base de datos (guardar(), buscarPorId(), eliminar()) tiene alta cohesion. Si tambien envia emails, la cohesion baja.

Que es la Composicion?

Explicacion simple: La composicion significa construir objetos complejos combinando objetos mas simples. En lugar de heredar comportamiento, un objeto contiene otros objetos que proporcionan la funcionalidad deseada.

Respuesta de entrevista: "La composicion es una tecnica de diseno donde una clase logra funcionalidad conteniendo instancias de otras clases en lugar de heredar de ellas. Modela una relacion 'tiene-un' y generalmente se prefiere sobre la herencia por su flexibilidad."

Ejemplo: Una clase Carro no hereda de Motor -- tiene un Motor. Puedes cambiar motores sin cambiar la jerarquia de clases del carro.

Herencia vs. Composicion: cuando usar cada una?

Explicacion simple: Usa herencia cuando exista una verdadera relacion "es-un" y el comportamiento compartido tenga sentido. Usa composicion cuando quieras flexibilidad, reutilizacion sin acoplamiento fuerte, o cuando la relacion sea "tiene-un".

Respuesta de entrevista: "Prefiere composicion sobre herencia como regla general. Usa herencia solo para relaciones genuinas 'es-un' donde la subclase es una verdadera especializacion del padre. La composicion proporciona mejor flexibilidad, capacidad de prueba y evita el problema de la clase base fragil."

Ejemplo: Un Perro "es un" Animal (la herencia tiene sentido). Un Carro "tiene un" Motor (la composicion tiene sentido). No hagas que Carro extienda Motor.

Que es la Sobrecarga de Metodos (Method Overloading)?

Explicacion simple: La sobrecarga de metodos significa tener multiples metodos con el mismo nombre en la misma clase pero con diferentes listas de parametros. La version correcta se selecciona en tiempo de compilacion.

Respuesta de entrevista: "La sobrecarga de metodos es una forma de polimorfismo en tiempo de compilacion (estatico) donde multiples metodos comparten el mismo nombre pero difieren en sus tipos de parametros, cantidad u orden. El compilador determina cual version llamar."

Ejemplo: sumar(int a, int b) y sumar(double a, double b) son metodos sobrecargados. El compilador elige el correcto basandose en los tipos de argumento.

Que es la Sobrescritura de Metodos (Method Overriding)?

Explicacion simple: La sobrescritura de metodos significa que una subclase proporciona su propia implementacion de un metodo ya definido en su clase padre. La version correcta se selecciona en tiempo de ejecucion basandose en el tipo real del objeto.

Respuesta de entrevista: "La sobrescritura de metodos es una forma de polimorfismo en tiempo de ejecucion (dinamico) donde una subclase proporciona una implementacion especifica para un metodo definido en su superclase. La JVM/runtime determina cual version llamar basandose en el tipo real del objeto."

Ejemplo: Animal define hacerSonido(). Perro lo sobrescribe para retornar "Guau". En tiempo de ejecucion, llamar a hacerSonido() en una referencia Perro ejecuta la version de Perro.

Como responder mejor en entrevistas

Usa esta estructura de 3 partes para dar respuestas claras y memorables:

  1. Definelo en una oracion -- demuestra que entiendes el concepto.
  2. Explica por que importa -- conectalo con mantenibilidad, flexibilidad o capacidad de prueba.
  3. Da un ejemplo concreto -- demuestra que puedes aplicarlo en codigo real.

Regla clave: No solo recites definiciones. Demuestra que entiendes el por que detras de cada concepto y como afecta el codigo que escribes todos los dias.

Checklist rapido antes de una entrevista

  • Puedes explicar los 4 pilares de la POO sin dudar?
  • Puedes describir cada principio SOLID con un ejemplo real?
  • Sabes cuando usar una interfaz vs. una clase abstracta?
  • Puedes explicar la diferencia entre sobrecarga y sobrescritura?
  • Puedes articular por que la composicion generalmente se prefiere sobre la herencia?
  • Puedes definir acoplamiento, cohesion y por que importan?

Si respondiste si a todas, estas listo. Si no, revisa las secciones anteriores y practica explicando cada concepto en voz alta -- esa es la verdadera habilidad de entrevista.

#poo#entrevistas#solid
Compartir:

Publicaciones relacionadas