JavaRush /Blog Java /Random-ES /Pausa para el café #111. Polimorfismo y enlace dinámico e...

Pausa para el café #111. Polimorfismo y enlace dinámico en Java. Bucle For en Java + ejemplo de sintaxis de bucle forEach

Publicado en el grupo Random-ES

Polimorfismo y enlace dinámico en Java.

Fuente: DZone El polimorfismo es uno de los conceptos centrales de la programación orientada a objetos. Si eres nuevo en la programación Java o un desarrollador experimentado, debes saber qué es el polimorfismo y cómo funciona. La mayoría de los desarrolladores afirman estar bien versados ​​en este tema, pero cuando se trata de otras características complejas como el enlace estático y dinámico, muchos de ellos pierden la confianza. Pausa para el café #111.  Polimorfismo y enlace dinámico en Java.  Bucle For en Java + ejemplo de sintaxis de bucle forEach - 1

¿Qué es el polimorfismo en Java?

Polimorfismo significa tener muchas formas. En programación, esto se refiere a la capacidad de una señal o mensaje de aparecer en más de una forma.

Ejemplo de la vida real

Una persona puede presentar muchas características al mismo tiempo. Por ejemplo, una madre puede ser simultáneamente esposa, hija, hermana, empleada de una empresa, etc. Por lo tanto, una persona puede presentar diferentes características en diferentes condiciones. Esto se conoce como polimorfismo.

La importancia del polimorfismo

El polimorfismo es una de las características más importantes de cualquier lenguaje de programación orientado a objetos (por ejemplo, Java). Con la ayuda del polimorfismo, la misma tarea se puede realizar de diferentes maneras.

Tipos de polimorfismo

En Java, el polimorfismo se puede dividir en dos categorías:
  1. Polimorfismo en tiempo de compilación (enlace estático)
  2. Polimorfismo en tiempo de ejecución (tiempo de ejecución, enlace dinámico)

Polimorfismo en tiempo de compilación

El polimorfismo en tiempo de compilación también se conoce como enlace estático. Este tipo de polimorfismo se puede lograr mediante la sobrecarga de funciones o la sobrecarga de operadores. Pero en Java, esto se limita a la sobrecarga de funciones, ya que Java no admite la sobrecarga de operadores. Sobrecarga de funciones Cuando hay al menos dos funciones o métodos con el mismo nombre de función, pero el número de parámetros que contienen es diferente, o al menos un tipo de datos del parámetro correspondiente es diferente (o ambos), entonces se llama función o sobrecarga de métodos, y estas funciones se conocen como funciones sobrecargadas. Ejemplo 1 Hasta ahora hemos estudiado qué es la sobrecarga de funciones. Ahora intentemos demostrar la sobrecarga de funciones del software.
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {

        // Returns sum of integer numbers
        return a + b;
    }
    // Method 2
    // having the same name but with 2 double parameters
    static double Addition(double a, double b)
    {
        // Returns sum of double numbers
        return a + b;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(12, 14));
        System.out.println(Addition(15.2, 16.1));

    }
}
Puede ejecutar el programa anterior aquí . Explicación del programa:
  • El programa anterior consta de dos funciones estáticas con los mismos nombres: Suma .

  • Aquí, ambas funciones contienen la misma cantidad de parámetros, pero sus parámetros correspondientes son diferentes.

  • El método 1 acepta dos parámetros enteros, mientras que el método 2 acepta dos parámetros dobles .

  • Desde la función principal, primero llamamos a la función Suma (12, 14) . Los parámetros pasados ​​son números enteros (12 y 14), por lo que aquí se llamará al Método 1 .

  • Luego llamamos a la función Suma (15.2, 16.1) . Dado que los parámetros pasados ​​son de tipo de datos doble (15.2 y 16.1), esta vez se llamará al Método 2 .

  • Así es como se logra la sobrecarga de funciones en Java en función de diferentes tipos de datos de parámetros.

Ejemplo 2 Considere el siguiente programa:
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {

        // Returns sum of integer numbers
        return a + b;
    }

    // Method 2
    // having the same name but with 3 integer parameters
    static double Addition(double a, double b)
    {

        // Returns sum of integer numbers
        return a + b;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(12, 14));
        System.out.println(Addition(15.2, 16.1));

    }
}
Puede ejecutar el programa anterior aquí . Explicación del programa:
  • El programa anterior consta de dos funciones estáticas con los mismos nombres: Suma .

  • Aquí, ambas funciones contienen un número diferente de parámetros, pero el tipo de datos de los dos primeros parámetros correspondientes es el mismo (entero).

  • El método 1 toma dos parámetros de tipo entero y el método 2 toma tres parámetros de tipo de datos enteros.

  • Desde la función principal, primero llamamos a la función Suma (2, 3) . Dado que los parámetros pasados ​​son números enteros (2 y 3), llamarán al Método 1 aquí .

  • Luego llamamos a la función Suma (4, 5, 6) . Los parámetros pasados ​​son tipos de datos dobles (4, 5, 6), por lo que esta vez llamarán al Método 2 .

  • Así es como se sobrecargan funciones en Java en función de un número diferente de parámetros.

Ejemplo 3
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {
        // Return the sum
        return a + b;
    }
    // Method 2
    // having the same name but with 3 parameters
    // 1st parameter is of type double and other parameters
    // are of type integer
    static double Addition(double a, int b,  int c)
    {
        // Return the sum
        return a + b + c;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(2, 4));
        System.out.println(Addition(4.2, 6, 10));

    }
}
Puede ejecutar el programa anterior aquí . Explicación del programa:
  • El programa anterior consta de dos funciones estáticas con los mismos nombres: Suma .

  • Ambas funciones contienen un número diferente de parámetros y el tipo de datos del primer elemento correspondiente también es diferente.

  • El método 1 toma dos parámetros enteros, mientras que el método 2 toma tres parámetros: el primero es de tipo doble y los otros dos son tipos de datos enteros.

  • Desde la función principal, primero llamamos a la función Suma (2, 4) . Dado que los parámetros pasados ​​son números enteros (2 y 4), llamarán al Método 1 aquí .

  • Luego llamamos a la función Suma (4.2, 6, 10) . El primer parámetro pasado es de tipo entero y los parámetros restantes son de tipo de datos doble (4.2, 6, 10), por lo que esta vez se llamará al Método 2 .

  • Así es como Java logra la sobrecarga de funciones basándose en diferentes números de parámetros, así como en diferentes tipos de datos de los parámetros correspondientes.

Nota. Una función no se puede sobrecargar basándose únicamente en el tipo de retorno de la función.

Polimorfismo en tiempo de ejecución

Esta opción también se conoce como vinculación dinámica. En este proceso, solo se permite llamar a una función creada para otra función en tiempo de ejecución. Podemos lograr un enlace dinámico en Java mediante la anulación de métodos.

Anulación del método

La anulación de métodos en Java ocurre cuando un método en una clase base tiene una definición en una clase derivada. Un método o función de clase base se denomina método anulado.
// Class 1
class Parent {

    // Print method
    void Print()
    {

        // Print statement
        System.out.println("Inside Parent Class");
    }
}

// Class 2
class Child1 extends Parent {

    // Print method
    void Print() { System.out.println("Inside Child1 Class"); }
}

// Class 3
class Child2 extends Parent {

    // Print method
    void Print()
    {
        // Print statement
        System.out.println("Inside Child2 Class");
    }
}

class Main {

    public static void main(String args[]) {

        // Creating an object of class Parent
        Parent parent = new Parent();
        parent.Print();

        // Calling print methods
        parent = new Child1();
        parent.Print();

        parent = new Child2();
        parent.Print();
    }
}
Puede ejecutar el programa anterior aquí . Explicación del programa:
  • El programa anterior consta de tres clases: Padre ( clase 1 ), Niño1 ( clase 2 ) y Niño2 ( clase 3 ). La clase 2 y la clase 3 heredan la clase 1 .

  • Parent tiene un método llamado Print() . Dentro de esta función imprimimos " Inside Parent Class ". Child1 y Child2 también tienen funciones Print() , que básicamente anulan la función Print() de la clase Parent e imprimen " Inside Child1 Class " y " Inside Child2 Class " respectivamente en la consola.

  • Desde la función principal, primero creamos un objeto de la clase padre llamado padre. Luego usamos este objeto para llamar al método de impresión de la clase principal . Por lo tanto, " Inside Parent Class " se imprimirá en la consola.

  • Después de eso, llamamos al constructor predeterminado de la clase Child1 y llamamos a la función Print() . Tenga en cuenta que ahora se llamará al método Print() definido en la clase Child1 porque hemos anulado el método Print() de la clase principal . Por lo tanto, " Inside Child1 Class " se imprimirá en la consola.

  • Finalmente, llamamos al constructor predeterminado de la clase Child2 y llamamos a la función Print() . Aquí se llamará al método Print() definido en la clase Child2 porque hemos anulado el método Print() de la clase principal . Por lo tanto, se imprimirá “ Inside Child2 Class ” en la consola.

  • Así es como se logra la anulación de métodos en Java.

Resultados

En este artículo, aprendimos qué es el polimorfismo en Java. Luego profundizamos en el tema y discutimos dos tipos de polimorfismo en Java: polimorfismo en tiempo de compilación y polimorfismo en tiempo de ejecución. Hemos demostrado a través de programas cómo se puede lograr un enlace estático y dinámico en Java.

Bucle For en Java + ejemplo de sintaxis de bucle forEach

Fuente: FreeCodeCamp Un bucle en programación es una secuencia de instrucciones que se ejecutan continuamente hasta que se cumple una determinada condición. En este artículo, aprenderemos sobre los bucles for y forEach en Java. Pausa para el café #111.  Polimorfismo y enlace dinámico en Java.  Bucle For en Java + ejemplo de sintaxis de bucle forEach - 2

Para la sintaxis del bucle en Java

Aquí está la sintaxis para crear un bucle for :
for (initialization; condition; increment/decrement) {
   // code to be executed
}
Veamos algunas de las palabras clave en el código:
  • for indica que vamos a crear un bucle. Le siguen paréntesis, que contienen todo lo que necesitamos para que nuestro bucle funcione.

  • La inicialización define la variable inicial como el punto de partida del ciclo, generalmente un número entero.

  • La condición especifica cuántas veces se debe ejecutar el bucle.

  • incrementar / decrementar incrementa/disminuye el valor de la variable inicial cada vez que se ejecuta el bucle. A medida que el valor de la variable aumenta/disminuye, tiende a la condición especificada.

  • Tenga en cuenta que cada palabra clave está separada por un punto y coma ( ; ).

Aquí hay unos ejemplos:
for(int x = 1; x <=5; x++) {
  System.out.println(x);
}

/*
1
2
3
4
5
*/
En el ejemplo anterior, la variable inicial es x con un valor de 1. El bucle continuará ejecutándose mientras el valor de x sea menor o igual a 5; esta es la condición. x++ incrementa el valor de x después de cada ejecución. Continuamos imprimiendo el valor de x que se detiene después de 5 porque se cumplió la condición. No es posible aumentar a 6 porque es mayor y diferente de 5. En el siguiente ejemplo, usaremos un bucle for para imprimir todos los valores de una matriz.
int[] randomNumbers = {2, 5, 4, 7};
for (int i = 0; i < randomNumbers.length; i++) {
  System.out.println(randomNumbers[i]);
}

// 2
// 5
// 4
// 7
Esto es casi lo mismo que el último ejemplo. Aquí hemos utilizado la longitud de la matriz como condición y el valor inicial de la variable como cero porque el número ordinal del primer elemento de la matriz es cero.

ForEach sintaxis de bucle en Java

El bucle forEach se utiliza específicamente para iterar a través de los elementos de una matriz. Así es como se ve su sintaxis:
for (dataType variableName : arrayName) {
  // code to be executed
}
Notarás que la sintaxis aquí es más corta que la del bucle for . Y el bucle forEach también comienza con la palabra clave for . En lugar de inicializar una variable con un valor, primero especificamos el tipo de datos (debe coincidir con el tipo de datos de la matriz). A esto le sigue el nombre de nuestra variable y el nombre del array , separados por dos puntos. A continuación se muestra un ejemplo para ayudarle a comprender mejor la sintaxis:
int[] randomNumbers = {2, 5, 4, 7};
for (int x : randomNumbers) {
  System.out.println(x + 1);
}

/*
3
6
5
8
*/
En este ejemplo, hemos iterado a través de cada elemento e incrementado su valor inicial en 1. De forma predeterminada, el bucle se detiene una vez que ha iterado a través de todos los elementos de la matriz. Esto significa que no necesitamos pasar ningún valor a nuestra variable ni especificar ninguna condición para que finalice el ciclo.

Conclusión

En este artículo, aprendimos qué son los bucles y la sintaxis para crear bucles for y forEach en Java. También vimos algunos ejemplos que nos ayudaron a comprender cuándo y cómo usarlos. ¡Feliz codificación!
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION