
Introducción
La preparación para entrevistas técnicas a menudo implica dominar conceptos clave, y la Programación Orientada a Objetos (POO) es fundamental para muchos roles de programación. Los entrevistadores evalúan frecuentemente la comprensión de los candidatos sobre principios de POO como encapsulación, herencia, polimorfismo y abstracción. Un sólido dominio de estos conceptos es crucial no solo para responder preguntas específicas de entrevistas de programación POO, sino también para demostrar tu capacidad de escribir código limpio, mantenible y escalable. Esta guía cubre las 30 preguntas principales de entrevistas de programación POO que probablemente encontrarás. Al preparar respuestas detalladas y seguras, aumentarás significativamente tus posibilidades de éxito en tu próxima entrevista de programación enfocada en POO.
¿Qué es la POO?
La POO, o Programación Orientada a Objetos, es un paradigma de programación centrado en el concepto de "objetos". Estos objetos son instancias de "clases", que sirven como planos o plantillas. Cada objeto encapsula datos (atributos o propiedades) y los procedimientos (métodos o comportamientos) que pueden operar sobre esos datos. La idea central es modelar entidades o conceptos del mundo real como objetos, haciendo que el código sea más organizado, modular y fácil de entender y gestionar. Dominar los principios de POO es clave para abordar eficazmente las preguntas comunes de entrevistas de programación POO.
¿Por qué los entrevistadores hacen preguntas sobre POO?
Los entrevistadores hacen preguntas de entrevistas de programación POO para evaluar la comprensión fundamental de un candidato sobre los principios modernos de diseño de software. El conocimiento de POO demuestra la capacidad de estructurar el código lógicamente, promover la reutilización, gestionar la complejidad y construir sistemas flexibles. Estos conceptos son pilares en muchos lenguajes populares como Java, C++, Python y C#. Tus respuestas revelan no solo conocimiento teórico, sino también habilidades de aplicación práctica esenciales para resolver problemas de programación complejos y colaborar en proyectos grandes utilizando metodologías POO. Prepararse a fondo para las preguntas de entrevistas de programación POO demuestra tu preparación para el puesto.
Lista de vista previa
¿Qué significa POO?
¿Cuáles son los cuatro conceptos básicos de POO?
¿Qué es una clase?
¿Qué es un objeto?
¿Qué es la encapsulación?
¿Qué es la herencia?
¿Cuáles son los diferentes tipos de herencia?
¿Qué es el polimorfismo?
¿Qué es la sobrecarga y la sobrescritura de métodos?
¿Qué es la abstracción?
¿Cuál es la diferencia entre abstracción y encapsulación?
¿Qué es una interfaz?
¿Cuál es la diferencia entre una clase abstracta y una interfaz?
¿Qué son los especificadores de acceso?
¿Qué es un constructor?
¿Qué es un destructor?
¿Cuál es la diferencia entre clase y estructura?
¿Qué es una función amiga?
¿Qué es el dispatch dinámico de métodos?
¿Qué es el acoplamiento?
¿Qué es la cohesión?
¿Qué es una función virtual?
¿Qué es la recolección de basura en POO?
¿Se puede ejecutar una aplicación Java sin usar conceptos de POO?
¿Qué es el manejo de excepciones?
¿Qué es un constructor estático?
¿Qué son los delegados en C#?
¿Qué son los principios SOLID?
¿Cuál es la ventaja de programar a una interfaz?
¿Cómo mejora la POO la mantenibilidad del código?
1. ¿Qué significa POO?
Por qué te podrían preguntar esto:
Esta es una pregunta introductoria básica para medir tu familiaridad con el acrónimo e iniciar una discusión sobre los fundamentos de la POO en un contexto de programación.
Cómo responder:
Indica claramente la forma completa y menciona brevemente que es un paradigma de programación basado en objetos.
Respuesta de ejemplo:
POO significa Programación Orientada a Objetos. Es un paradigma de programación ampliamente utilizado, estructurado en torno a objetos en lugar de solo funciones y lógica, fundamental para muchos lenguajes modernos.
2. ¿Cuáles son los cuatro conceptos básicos de POO?
Por qué te podrían preguntar esto:
Esta pregunta verifica si conoces los pilares fundamentales sobre los que se construye la POO, esenciales para comprender los patrones de diseño.
Cómo responder:
Enumera y define brevemente los cuatro pilares principales: Encapsulación, Herencia, Polimorfismo y Abstracción.
Respuesta de ejemplo:
Los cuatro conceptos básicos son Encapsulación (agrupar datos/métodos), Herencia (crear nuevas clases a partir de las existentes), Polimorfismo (los objetos toman muchas formas) y Abstracción (ocultar la complejidad).
3. ¿Qué es una clase?
Por qué te podrían preguntar esto:
Comprender el concepto de clase es fundamental, ya que es el plano para crear objetos en POO.
Cómo responder:
Define una clase como un plano o plantilla que define las propiedades y comportamientos comunes a todos los objetos creados a partir de ella.
Respuesta de ejemplo:
Una clase es un plano o plantilla para crear objetos. Define la estructura (atributos) y el comportamiento (métodos) que tendrán los objetos de esa clase, como el plano de una casa.
4. ¿Qué es un objeto?
Por qué te podrían preguntar esto:
Esto sigue a la pregunta de la clase para ver si comprendes la entidad instanciada basada en el plano.
Cómo responder:
Define un objeto como una instancia de una clase, que representa una entidad específica con valores de datos reales y métodos invocables.
Respuesta de ejemplo:
Un objeto es una instancia de una clase. Es una entidad concreta creada a partir del plano de la clase, que posee valores reales para los atributos y es capaz de realizar las acciones definidas por los métodos de la clase.
5. ¿Qué es la encapsulación?
Por qué te podrían preguntar esto:
La encapsulación es un principio clave de la POO para el ocultamiento de datos y la modularidad, importante para el diseño del sistema.
Cómo responder:
Explica la encapsulación como la agrupación de datos (variables) y los métodos (funciones) que operan sobre los datos en una sola unidad (la clase), restringiendo el acceso directo a los datos.
Respuesta de ejemplo:
La encapsulación es la agrupación de datos y los métodos que operan sobre esos datos en una sola unidad, que típicamente es una clase. Ayuda al ocultamiento de datos y previene el acceso externo directo al estado interno.
6. ¿Qué es la herencia?
Por qué te podrían preguntar esto:
La herencia es crucial para la reutilización de código y el establecimiento de relaciones entre clases en POO.
Cómo responder:
Describe la herencia como un mecanismo por el cual una nueva clase (hija/derivada) adquiere propiedades y comportamientos de una clase existente (padre/base), promoviendo la reutilización de código.
Respuesta de ejemplo:
La herencia es un mecanismo de POO que permite a una clase (la hija) heredar atributos y métodos de otra clase (la padre). Esto promueve la reutilización de código y establece relaciones "es-un" entre clases.
7. ¿Cuáles son los diferentes tipos de herencia?
Por qué te podrían preguntar esto:
Esto evalúa tu conocimiento de las diversas estructuras de relación posibles a través de la herencia en lenguajes de POO.
Cómo responder:
Enumera tipos comunes como herencia simple, múltiple (menciona el soporte del lenguaje), multinivel, jerárquica e híbrida.
Respuesta de ejemplo:
Los tipos comunes incluyen Simple (un padre), Múltiple (varios padres, por ejemplo, C++), Multinivel (cadena de herencia), Jerárquica (un padre, muchos hijos) e Híbrida (combinación).
8. ¿Qué es el polimorfismo?
Por qué te podrían preguntar esto:
El polimorfismo es una piedra angular del diseño de POO flexible y extensible, que permite que el código funcione con objetos de diferentes clases de manera uniforme.
Cómo responder:
Define el polimorfismo como la capacidad de un objeto o método para adoptar muchas formas, principalmente a través de la sobrecarga y la sobrescritura de métodos.
Respuesta de ejemplo:
Polimorfismo significa "muchas formas". En POO, permite que los métodos u objetos realicen diferentes acciones en diferentes contextos, a menudo visto con la sobrecarga de métodos (en tiempo de compilación) y la sobrescritura de métodos (en tiempo de ejecución).
9. ¿Qué es la sobrecarga y la sobrescritura de métodos?
Por qué te podrían preguntar esto:
Estas son las dos formas principales en que se logra el polimorfismo, y los entrevistadores verifican si conoces la diferencia y cómo se aplican.
Cómo responder:
Explica que la sobrecarga consiste en tener múltiples métodos con el mismo nombre pero diferentes parámetros en la misma clase. Explica que la sobrescritura consiste en redefinir un método de una clase padre en una clase hija.
Respuesta de ejemplo:
La sobrecarga consiste en definir múltiples métodos con el mismo nombre pero diferentes parámetros en la misma clase (polimorfismo en tiempo de compilación). La sobrescritura consiste en redefinir un método en una clase hija que existe en la clase padre (polimorfismo en tiempo de ejecución).
10. ¿Qué es la abstracción?
Por qué te podrían preguntar esto:
La abstracción ayuda a gestionar la complejidad ocultando detalles innecesarios, crucial para sistemas grandes.
Cómo responder:
Describe la abstracción como el principio de ocultar detalles de implementación complejos y mostrar solo las características esenciales al usuario.
Respuesta de ejemplo:
La abstracción se centra en mostrar solo información esencial y ocultar los detalles de implementación. Simplifica sistemas complejos modelando clases basándose en sus propiedades y comportamientos esenciales.
11. ¿Cuál es la diferencia entre abstracción y encapsulación?
Por qué te podrían preguntar esto:
Estos conceptos a menudo se confunden, por lo que explicar la distinción muestra una comprensión profunda de los principios de POO.
Cómo responder:
Explica que la abstracción oculta la complejidad (lo que hace), mientras que la encapsulación oculta el estado y protege los datos (cómo se agrupa).
Respuesta de ejemplo:
La abstracción se ocupa de ocultar la complejidad simplificando la vista (centrándose en "qué" hace un objeto). La encapsulación agrupa datos y métodos para proteger los datos y gestionar las dependencias (centrándose en "cómo" se hace).
12. ¿Qué es una interfaz?
Por qué te podrían preguntar esto:
Las interfaces definen contratos y soportan abstracción y comportamiento similar a la herencia múltiple en lenguajes como Java.
Cómo responder:
Define una interfaz como un contrato que especifica un conjunto de métodos que las clases implementadoras deben proporcionar. Señala que no contiene detalles de implementación.
Respuesta de ejemplo:
Una interfaz es un plano de una clase. Es un contrato que declara métodos sin implementarlos. Una clase que implementa una interfaz debe proporcionar implementaciones para todos sus métodos declarados.
13. ¿Cuál es la diferencia entre una clase abstracta y una interfaz?
Por qué te podrían preguntar esto:
Una pregunta clásica de POO que evalúa tu comprensión de dos mecanismos clave de abstracción.
Cómo responder:
Resalta las diferencias clave: Las clases abstractas pueden tener métodos concretos y abstractos, estado; Las interfaces solo tienen firmas de métodos abstractos (contrato), sin estado (excepto constantes), y una clase puede implementar múltiples interfaces pero heredar solo una clase abstracta.
Respuesta de ejemplo:
Una clase abstracta puede tener implementaciones de métodos y estado, mientras que una interfaz solo define firmas de métodos (contrato). Una clase puede heredar de una clase abstracta pero implementar múltiples interfaces.
14. ¿Qué son los especificadores de acceso?
Por qué te podrían preguntar esto:
Los especificadores de acceso se relacionan directamente con la encapsulación y el control de la visibilidad, un aspecto práctico de la POO.
Cómo responder:
Explica que los especificadores de acceso (como público, privado, protegido) controlan la visibilidad y accesibilidad de los miembros de la clase (datos, métodos) para aplicar la encapsulación.
Respuesta de ejemplo:
Los especificadores de acceso (por ejemplo, público, privado, protegido) son palabras clave utilizadas en POO para controlar la visibilidad y accesibilidad de los miembros de la clase desde fuera de la clase o jerarquía de herencia, apoyando la encapsulación.
15. ¿Qué es un constructor?
Por qué te podrían preguntar esto:
Los constructores son esenciales para la creación e inicialización de objetos.
Cómo responder:
Define un constructor como un método especial utilizado para inicializar objetos, que tiene el mismo nombre que la clase y no tiene tipo de retorno.
Respuesta de ejemplo:
Un constructor es un método especial en una clase que se llama automáticamente cuando se crea un objeto de esa clase. Su propósito principal es inicializar el estado del objeto. Tiene el mismo nombre que la clase.
16. ¿Qué es un destructor?
Por qué te podrían preguntar esto:
Relevante en lenguajes con gestión de memoria manual o semi-manual (como C++) para la limpieza de recursos.
Cómo responder:
Define un destructor como un método que se llama cuando un objeto es destruido (sale de ámbito o se elimina explícitamente) para realizar tareas de limpieza, como liberar recursos. Menciona su convención de nomenclatura (tilde).
Respuesta de ejemplo:
Un destructor es un método especial (como ~NombreClase()
en C++) que se llama cuando un objeto es destruido o sale de ámbito. Su propósito es limpiar los recursos asignados por el objeto durante su vida útil.
17. ¿Cuál es la diferencia entre clase y estructura?
Por qué te podrían preguntar esto:
Evalúa la comprensión de los tipos fundamentales de agrupación de datos y sus capacidades de POO en diferentes lenguajes (por ejemplo, C++ vs. C#).
Cómo responder:
Explica que las clases soportan características completas de POO (herencia, polimorfismo, etc.) con miembros privados por defecto, mientras que las estructuras son tipos de valor más simples principalmente para la agrupación de datos, a menudo públicos por defecto.
Respuesta de ejemplo:
En lenguajes como C++, las estructuras son tipos de valor con miembros públicos por defecto, principalmente para agrupar datos. Las clases son tipos de referencia que soportan características completas de POO como herencia y polimorfismo, con miembros privados por defecto.
18. ¿Qué es una función amiga?
Por qué te podrían preguntar esto:
Específico de C++, evalúa el conocimiento de cómo otorgar a funciones externas acceso a miembros privados, a veces utilizado para la sobrecarga de operadores.
Cómo responder:
Describe una función amiga (en C++) como una función declarada fuera de una clase pero a la que se le otorga permiso especial para acceder a los miembros privados y protegidos de la clase.
Respuesta de ejemplo:
En C++, una función amiga es una función que no es miembro de una clase, pero que se declara dentro de la definición de la clase como "amiga". Se le otorga acceso especial a los miembros privados y protegidos de esa clase.
19. ¿Qué es el dispatch dinámico de métodos?
Por qué te podrían preguntar esto:
Esto se relaciona con el polimorfismo en tiempo de ejecución (sobrescritura de métodos) y cómo se selecciona el método correcto.
Cómo responder:
Explícalo como el mecanismo por el cual la llamada a un método sobrescrito se resuelve en tiempo de ejecución según el tipo real del objeto, no el tipo de la referencia.
Respuesta de ejemplo:
El dispatch dinámico de métodos es el proceso por el cual una llamada a un método sobrescrito se resuelve en tiempo de ejecución. La Máquina Virtual de Java o el entorno de ejecución determina qué versión del método sobrescrito ejecutar basándose en el tipo real del objeto.
20. ¿Qué es el acoplamiento?
Por qué te podrían preguntar esto:
El acoplamiento y la cohesión son principios de diseño de software influenciados por la estructura de la POO, relevantes para la mantenibilidad.
Cómo responder:
Define el acoplamiento como el grado de interdependencia entre módulos o clases de software. Indica que el acoplamiento bajo (débil) es deseable para facilitar el mantenimiento y la modificación.
Respuesta de ejemplo:
El acoplamiento se refiere al grado en que diferentes clases o módulos dependen unos de otros. El bajo acoplamiento significa que los módulos son relativamente independientes, lo cual es deseable para facilitar el mantenimiento y los cambios.
21. ¿Qué es la cohesión?
Por qué te podrían preguntar esto:
Complementa la pregunta de acoplamiento, centrándose en la unidad interna de un módulo.
Cómo responder:
Define la cohesión como el grado en que los elementos dentro de un módulo (clase) pertenecen juntos. Indica que la alta cohesión es un buen diseño, lo que significa que una clase tiene una responsabilidad única y bien definida.
Respuesta de ejemplo:
La cohesión se refiere al grado en que los elementos dentro de un único módulo o clase pertenecen juntos y trabajan para un único propósito. La alta cohesión es un buen diseño, lo que indica que una clase está enfocada y tiene una única responsabilidad clara.
22. ¿Qué es una función virtual?
Por qué te podrían preguntar esto:
Específico de lenguajes como C++ y C#, crucial para implementar polimorfismo en tiempo de ejecución.
Cómo responder:
Explica una función virtual como una función miembro declarada en una clase base que se espera que sea sobrescrita en las clases derivadas. Su llamada se resuelve en tiempo de ejecución utilizando dispatch dinámico.
Respuesta de ejemplo:
Una función virtual es una función en una clase base (como en C++) que se declara con la palabra clave 'virtual'. Permite que una llamada a función se resuelva en tiempo de ejecución, permitiendo el polimorfismo en tiempo de ejecución a través de la sobrescritura.
23. ¿Qué es la recolección de basura en POO?
Por qué te podrían preguntar esto:
Evalúa el conocimiento de la gestión de memoria en lenguajes como Java, C#, etc., que utilizan manejo automático de memoria.
Cómo responder:
Describe la recolección de basura como un proceso automático que identifica y recupera la memoria ocupada por objetos que ya no son referenciados por el programa, previniendo fugas de memoria.
Respuesta de ejemplo:
La recolección de basura es un proceso automático de gestión de memoria (utilizado en lenguajes como Java o C#). Encuentra automáticamente los objetos que ya no son accesibles o utilizados por el programa y desasigna su memoria.
24. ¿Se puede ejecutar una aplicación Java sin usar conceptos de POO?
Por qué te podrían preguntar esto:
Una pregunta un tanto capciosa para confirmar la comprensión de que Java es fundamentalmente orientado a objetos.
Cómo responder:
Indica claramente que no, Java está intrínsecamente orientado a objetos, requiriendo el uso de clases y objetos incluso para los programas más simples (por ejemplo, el método main está dentro de una clase).
Respuesta de ejemplo:
No, Java está diseñado en torno a los principios de POO. Cada fragmento de código reside dentro de una clase, y la ejecución comienza desde un método estático dentro de una clase, haciendo obligatorios los conceptos fundamentales de POO.
25. ¿Qué es el manejo de excepciones?
Por qué te podrían preguntar esto:
Importante para escribir código robusto, el manejo de excepciones permite la gestión controlada de errores en tiempo de ejecución.
Cómo responder:
Define el manejo de excepciones como un mecanismo para tratar errores en tiempo de ejecución (excepciones) de manera controlada, previniendo fallos del programa mediante estructuras como bloques try-catch-finally.
Respuesta de ejemplo:
El manejo de excepciones es un mecanismo en lenguajes de POO para gestionar errores en tiempo de ejecución (excepciones) de manera elegante. Permite que el programa maneje situaciones inesperadas utilizando bloques como try, catch y finally, previniendo la terminación abrupta.
26. ¿Qué es un constructor estático?
Por qué te podrían preguntar esto:
Específico de lenguajes como C#, evalúa el conocimiento de cómo se inicializan los miembros estáticos.
Cómo responder:
Explica un constructor estático como un constructor especial utilizado para inicializar miembros estáticos de una clase. Se llama automáticamente antes de que se cree la primera instancia o se accedan a miembros estáticos.
Respuesta de ejemplo:
Un constructor estático se utiliza para inicializar cualquier miembro de datos estático de una clase y se ejecuta automáticamente solo una vez cuando la clase se carga por primera vez en memoria, antes de que se cree una instancia o se haga referencia a un miembro estático.
27. ¿Qué son los delegados en C#?
Por qué te podrían preguntar esto:
Específico de C#, los delegados son construcciones potentes para punteros de función seguros en tipo y manejo de eventos, demostrando un conocimiento más profundo del lenguaje.
Cómo responder:
Define un delegado (en C#) como una referencia segura en tipo a un método. Actúa como un puntero de función y se utiliza comúnmente para eventos y callbacks.
Respuesta de ejemplo:
En C#, un delegado es un tipo que representa referencias a métodos con una lista de parámetros y un tipo de retorno particular. Se utilizan para implementar callbacks y manejo de eventos de manera orientada a objetos.
28. ¿Qué son los principios SOLID?
Por qué te podrían preguntar esto:
Los principios SOLID son directrices fundamentales para diseñar software de POO mantenible y escalable.
Cómo responder:
Enumera y nombra brevemente cada uno de los cinco principios SOLID: Responsabilidad Única, Abierto/Cerrado, Sustitución de Liskov, Segregación de Interfaces y Inversión de Dependencias.
Respuesta de ejemplo:
SOLID es un acrónimo de cinco principios de diseño: Responsabilidad Única (una razón para cambiar), Abierto/Cerrado (abierto a extensión, cerrado a modificación), Sustitución de Liskov (los tipos derivados deben ser sustituibles por los tipos base), Segregación de Interfaces (muchas interfaces específicas son mejores que una general) e Inversión de Dependencias (depender de abstracciones, no de implementaciones concretas).
29. ¿Cuál es la ventaja de programar a una interfaz?
Por qué te podrían preguntar esto:
Evalúa la comprensión de cómo las interfaces promueven diseños flexibles y débilmente acoplados en POO.
Cómo responder:
Explica que programar a una interfaz (o clase base) promueve un acoplamiento débil, permitiendo que el código funcione con cualquier implementación de la interfaz, aumentando la flexibilidad, la capacidad de prueba y la mantenibilidad.
Respuesta de ejemplo:
Programar a una interfaz significa depender de una abstracción en lugar de una clase concreta. Esto hace que tu código sea más flexible, testeable y débilmente acoplado porque puedes cambiar implementaciones de la interfaz sin modificar el código que la utiliza.
30. ¿Cómo mejora la POO la mantenibilidad del código?
Por qué te podrían preguntar esto:
Esta es una pregunta de resumen que te pide que sintetices los beneficios de la POO.
Cómo responder:
Explica que la POO mejora la mantenibilidad a través de la modularidad (las clases encapsulan la lógica), la reutilización (la herencia reduce la duplicación) y la estructura clara (la abstracción oculta la complejidad, la encapsulación protege los datos), haciendo que los sistemas grandes sean más fáciles de entender, depurar y modificar.
Respuesta de ejemplo:
La POO mejora la mantenibilidad a través de la modularidad (las clases agrupan código), la reutilización (la herencia reduce la redundancia), la encapsulación (protección de datos que simplifica la depuración) y la abstracción (ocultamiento de la complejidad). Este enfoque estructurado hace que el código sea más fácil de entender, actualizar y corregir.
Otros consejos para prepararse para una entrevista de POO
Dominar las preguntas de entrevistas de programación POO requiere más que solo memorizar definiciones. Practica la implementación de estos conceptos en código. Trabaja en ejemplos de jerarquías de herencia, polimorfismo en acción y aplicación de principios de encapsulación. Prepárate para discutir escenarios del mundo real donde has utilizado estos conceptos de POO. Como señala un experto: "Los entrevistadores buscan candidatos que no solo puedan definir términos de POO sino explicar por qué y cuándo se utilizan". Considera usar herramientas como Verve AI Interview Copilot (https://vervecopilot.com) para practicar la explicación de conceptos técnicos de manera clara y concisa bajo presión. Verve AI Interview Copilot puede proporcionar retroalimentación instantánea sobre tu articulación y estructura al responder preguntas comunes de entrevistas de programación POO. Aprovecha Verve AI Interview Copilot para refinar tus ejemplos y asegurarte de que puedes demostrar con confianza tus habilidades prácticas de POO. Recuerda, la preparación utilizando recursos como Verve AI Interview Copilot es clave para aprobar esas preguntas cruciales de entrevistas de programación POO.
Preguntas frecuentes
P1: ¿Es la POO adecuada para todos los proyectos? R1: Si bien es potente, los paradigmas procedimentales o funcionales podrían ser mejores para scripts muy simples o tipos de problemas específicos.
P2: ¿Qué es la relación "es-un" frente a "tiene-un"?
R2: "Es-un" denota herencia (por ejemplo, Perro ES-UN Animal). "Tiene-un" denota composición (por ejemplo, Coche TIENE-UN Motor).
P3: ¿Por qué a veces preferir la composición sobre la herencia?
R3: La composición ofrece más flexibilidad y evita problemas de acoplamiento estrecho y problemas de clase base frágil asociados con las jerarquías de herencia.
P4: ¿Qué es una variable de clase frente a una variable de instancia?
R4: Las variables de clase (estáticas) son compartidas por todas las instancias. Las variables de instancia son únicas para cada instancia de objeto.
P5: ¿Qué es la firma de un método?
R5: La firma de un método típicamente incluye el nombre del método y el número, tipo y orden de sus parámetros. El tipo de retorno a menudo se incluye dependiendo del contexto del lenguaje.