Generalización y Especialización en Java

clase general?

En términos generales, una clase que cuenta las características principales pero no los detalles específicos. Las clases situadas en la parte superior de la jerarquía de herencia se pueden llamar Generales.

¿Clase específica?

Una clase que es muy particular y establece los detalles específicos. Las clases situadas en la parte inferior de la jerarquía de herencia se pueden llamar Específicas.

Ejemplo 1:



Relatively General Class: Money
Relatively Specific Class: Dollar, Euro, Rupees

Ejemplo 2:



Lemon, Orange are more Specific than Citrus
Banana, Apple are more Specific than Non-Citrus
Citrus, Non-Citrus are more Specific than Fruit
Fruit is most general class

¿Conversión de un tipo de clase a otro tipo de clase?

Podemos convertir referencias a un tipo de clase a otro tipo de clase en Java. Pero para que se produzca la conversión, las clases deben estar relacionadas entre sí a modo de herencia.

Por lo tanto,

  • Las referencias para vehículos y autobuses se pueden convertir entre sí.
  • Las referencias de Vehicle y Car se pueden convertir entre sí.
  • Las referencias de Vehículo y Camión se pueden convertir entre sí.
  • Las referencias de Bus, Car y Truck no se pueden convertir entre sí.

Generalización

Convertir un tipo de subclase en un tipo de superclase se llama ‘ Generalización ‘ porque estamos haciendo que la subclase se vuelva más general y su alcance se está ampliando. Esto también se llama ensanchamiento o ensanchamiento . La ampliación es segura porque las clases se volverán más generales.

Por ejemplo, si decimos que Car is a Vehicle, no habrá objeción. Por lo tanto, el compilador de Java no solicitará el operador de conversión en la generalización.

Ejemplo:

Java

class Father {
    public void work()
    {
        System.out.println("Earning Father");
    }
}
  
class Son extends Father {
    public void play()
    {
        System.out.println("Enjoying son");
    }
}
  
class Main {
    public static void main(String[] args)
    {
        // father is a superclass reference
        Father father;
  
        // new operator returns a subclass reference
        father = (Father) new Son();
  
        // which is widened using casting
        // and stored in father variable
        // Though casting is done but it is not needed
        father.work();
  
        // Uncomment next line to see the error
        // father.play();
    }
}
Producción:

Earning Father

Entonces, en Ampliación o Generalización, podemos acceder a todos los métodos de la superclase, pero no a los métodos de la subclase .

Ejemplo: ahora supongamos que anulamos los métodos de la superclase en la subclase

Java

class Father {
    public void work()
    {
        System.out.println("Earning Father");
    }
}
  
class Son extends Father {
    @Override
    public void work()
    {
        System.out.println("Earning Son");
    }
}
  
class Main {
    public static void main(String[] args)
    {
  
        // father is the super class reference
        Father father;
  
        // new operator returns a subclass reference
        father = (Father) new Son();
  
        // which is widened using casting
        // and stored in father variable
        // Though casting is done but it is not needed
  
        // subclass method is invoked
        father.work();
    }
}
Producción:

Earning Son

Especialización

La conversión de un tipo de superclase en un tipo de subclase se denomina ‘ especialización ‘. Aquí, estamos bajando de una forma más general a una forma específica y, por lo tanto, el alcance se reduce. Por lo tanto, esto se llama estrechamiento o reducción .

Restringir no es seguro porque las clases se volverán cada vez más específicas dando lugar a más y más dudas. Por ejemplo, si decimos que el vehículo es un automóvil, necesitamos una prueba. Por lo tanto, en este caso, el compilador de Java solicita específicamente la conversión. Esto se llama casting explícito .

Ejemplo: para mostrar cuándo no se permite la reducción

Java

class Father {
    public void work()
    {
        System.out.println("Earning Father");
    }
}
  
class Son extends Father {
    public void play()
    {
        System.out.println("Enjoying son");
    }
}
  
class Main {
    public static void main(String[] args)
    {
  
        try {
            // son is a sub class reference
            Son son;
  
            // new operator returns a superclass reference
            // which is narrowed using casting
            // and stored in son variable
  
            // This will throw exception
            son = (Son) new Father();
  
            // Through a narrowed reference of the superclass
            // we can neither access superclass method
            // and nor the subclass methods
  
            // Below lines will show
            // an error when uncommented
            // son.work();
            // son.play();
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}
Producción:

java.lang.ClassCastException: Father cannot be cast to Son

Ejemplo:

Java

class Father {
    public void work()
    {
        System.out.println("Earning Father");
    }
}
  
class Son extends Father {
    public void play()
    {
        System.out.println("Enjoying son");
    }
}
  
class Main {
    public static void main(String[] args)
    {
        // son is a subclass reference
        Father father;
  
        // new operator returns a subclass reference
        // which is stored in the father variable
        // father stores a Father class reference
        // because of implicit casting
        father = new Son();
  
        // father is narrowed
        Son son = (Son)father;
  
        son.work(); // works well
        son.play(); // works well
    }
}
Producción:

Earning Father
Enjoying son

Conclusión:

  1. Cuando una referencia de superclase (que se refiere a un objeto de superclase) se reduce, al usar esa referencia no podemos acceder ni a los métodos de la subclase ni a los métodos de la superclase.
  2. Cuando una referencia de subclase (que se refiere a un objeto de subclase) se amplía y luego se estrecha nuevamente, usando esa referencia podemos acceder a todos los métodos de la subclase, así como a la superclase. Esto es lo mismo que la referencia de clase base simple que se refiere al objeto de clase base donde los métodos de superclase se han heredado.

Publicación traducida automáticamente

Artículo escrito por RishavPandey1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *