Extensión de la clase del capítulo 5 de "Lógica de programación de Java"

Capítulo 5 Extensión de la clase

El Capítulo 5 presenta principalmente interfaces, clases abstractas, clases internas y enumeraciones.

La naturaleza de la interfaz

En muchos casos, lo que nos importa no es el tipo de objeto, sino la capacidad del objeto. Requerimos que un objeto proporcione una cierta capacidad, independientemente de su tipo. La interfaz se utiliza para describir las capacidades que puede proporcionar un objeto.

La interfaz declara un conjunto de capacidades, pero no implementa esta capacidad por sí misma, es solo una convención. La interfaz implica la interacción de los objetos de dos partes. Una parte necesita implementar esta interfaz y la otra parte usa esta interfaz, pero las dos partes no dependen directamente entre sí, solo interactúan indirectamente a través de la interfaz.

La definición de la interfaz utiliza interfacepalabras clave. Como sigue

public interface MyComparable {
    
    
    int compareTo(Object other);
}

Antes de Java 8, los métodos no se pueden implementar en interfaces y los métodos de interfaz no necesitan agregar modificadores, y el valor predeterminado es el resumen público.

Una clase puede implementar una interfaz para indicar que el objeto de la clase tiene las capacidades representadas por la interfaz. Utilice implementspalabras clave para implementar la interfaz .

public class Point implements MyComparable{
    
    
    ...
   @Override
    public int compareTo(Object other) {
    
    
        ...
    }
}

Necesita anular el método definido por la interfaz en la clase para implementar la interfaz. Cuando use genéricos, debe usarlo instanceofpara verificar el tipo de objeto para evitar errores innecesarios.

Una clase puede implementar múltiples interfaces para indicar que los objetos de la clase tienen múltiples capacidades.

public class Test implements interface1, interface2{
    
    
    
}

Las interfaces no se pueden newusar para crear objetos de interfaz. La única forma de usar una interfaz es implementar la interfaz a través de una clase, luego crear un objeto de esta clase y llamar al método de interfaz del objeto. El objeto que implementa la interfaz se puede asignar a la variable del tipo de interfaz, similar a la relación entre la clase principal y la clase secundaria.

Aquí es donde reside el poder de la interfaz: podemos considerar las capacidades del objeto de manera uniforme sin el tipo de objeto, es decir, la idea de la programación orientada a la interfaz.

Más importante aún, la interfaz reduce el acoplamiento y mejora la flexibilidad. El código que utiliza la interfaz depende de la interfaz en sí, no del tipo específico de interfaz. El programa puede reemplazar la implementación de la interfaz de acuerdo con la situación sin afectar a los usuarios desacoplados.

Las variables se pueden definir en la interfaz, pero el tipo de variable espublic static final

public interface Interface1{
    
    
    public static final int a = 0;
}

Las interfaces se pueden heredar. A diferencia de la herencia de clases, la herencia de interfaces admite la herencia múltiple.

public interface IBase1{
    
    
    void method1();
}

public interface IBase2{
    
    
    void method2();
}

public interface IChild extends IBase1, IBase2{
    
    
    
}

La herencia de clases y la interfaz de implementación pueden coexistir.

public class Child extends Base implements IChild{
    
    
    
}

Las interfaces también pueden utilizar instanceofpalabras clave para determinar si un objeto implementa una determinada interfaz.

Point p = new Point();
if( p instanceof MyComparable) {
    
    
    
}

Puede usar interfaces y composición para reemplazar de manera efectiva la herencia.

Clase abstracta

Una clase abstracta es una clase abstracta. La abstracción es relativa a lo concreto. Generalmente hablando, las clases concretas tienen objetos directos correspondientes, pero las clases abstractas no. Expresa conceptos abstractos, como la clase gráfica Forma. Los métodos de conceptos abstractos se definen generalmente como métodos abstractos, por ejemplo, los drawmétodos de clases abstractas son métodos abstractos. Debido a que las clases abstractas no saben cómo implementar métodos, solo las subclases (clases concretas como Circle) saben cómo implementarlos. Tanto las clases abstractas como los métodos abstractos se abstractdeclaran mediante palabras clave.

public abstract class Shape{
    
    
    public abstract void draw();
}

Una clase que define un método abstracto debe declararse como una clase abstracta, pero una clase abstracta no puede tener un método abstracto. Las clases abstractas no se pueden usar newpara crear objetos y se deben usar subclases para crear objetos. Después de que una clase hereda una clase abstracta, debe implementar todos los métodos abstractos definidos en la clase abstracta, a menos que también se declare como una clase abstracta.

public class Circle extends Shape{
    
    
    @Override
    public void draw(){
    
    
        
    }
}

Aunque las clases abstractas no pueden crear objetos, pueden declarar variables de clases abstractas y referirse a objetos de subclases concretas de clases abstractas.

Shape shape = new Shape();
shape.draw();

La introducción de clases abstractas para orientar a los usuarios a utilizarlas correctamente y reducir su inutilidad. Usando un método abstracto en lugar de un cuerpo de método vacío, la subclase debe implementar el método y es imposible ignorarlo, si se ignora, se producirá un error de compilación.

Las clases e interfaces abstractas son fundamentalmente diferentes. Las variables de instancia no se pueden definir en interfaces, pero las clases abstractas sí. Una clase puede implementar múltiples interfaces pero solo puede heredar una clase.

Las clases e interfaces abstractas están en cooperación más que en sustitución. A menudo se usan juntas, las capacidades de declaración de interfaz, las clases abstractas proporcionan implementaciones predeterminadas e implementan todos o parte de los métodos. Una interfaz a menudo tiene una clase abstracta correspondiente. Por ejemplo Collection, la AbstractCollectionclase abstracta correspondiente a la interfaz .

Para una clase específica que necesita cierta habilidad, hay dos opciones: una es implementar la interfaz e implementar todos los métodos usted mismo, y la otra es heredar la clase abstracta y reescribir los métodos según sea necesario. La ventaja de la herencia es reutilizar el código, solo es necesario volver a escribir la parte requerida, el código que se debe escribir es relativamente pequeño y fácil de implementar. Sin embargo, si este concreto ya tiene una clase principal, solo puede optar por implementar la interfaz.

La esencia de las clases internas

En términos generales, cada clase corresponde a un archivo fuente Java independiente. Pero una clase también se puede colocar dentro de otra clase, llamada clase interna , relativamente hablando, la clase que la contiene se llama clase externa .

La clase interna es solo el concepto del compilador de Java. Para la máquina virtual Java, no conoce las clases internas. Cada clase interna eventualmente se compilará en una clase independiente para generar un archivo de código de bytes independiente.

La clase interna puede acceder fácilmente a las variables privadas de la clase externa.

En Java, hay cuatro tipos principales de clases internas según la ubicación y el método de definición.

  • Clase interna estática
  • Clase interna de miembro
  • Método clase interna
  • Clase interna anónima

Las clases internas del método se definen y usan dentro de un método, las clases internas anónimas tienen un alcance más pequeño y ninguno de estos dos tipos se puede usar externamente. Las clases internas de miembros y las clases internas estáticas se pueden usar externamente, pero todas se pueden declarar comoprivate

Las clases internas estáticas se definen de la misma manera que las variables estáticas y los métodos estáticos, todos con staticpalabras clave.

public class Outer{
    
    
    public static class StaticInner{
    
    
        public void innerMethod() {
    
    
            ...
        }
    }
}

La clase interna estática puede acceder directamente a las variables y métodos estáticos de la clase externa, pero no puede acceder a las variables de instancia.

publicLa clase interna estática se puede usar externamente, pero debe 外部类.静态内部类usarse de alguna manera.

Outer.StaticInner si = new Outer.StaticInner();
si.innerMethod();

Las definiciones de clases internas de miembros y clases internas estáticas son similares, pero no hay staticmodificadores.

public class Outer{
    
    
    private int a = 100;
    
    public class Inner{
    
    
        public void innerMethod() {
    
    
            System.out.prinln("outer a = " + a);
            Outer.this.action();
        }
    }
    
    private void action() {
    
    
     	System.out.println("action");   
     }
    public void test() {
    
    
        Inner inner = new Inner();
        inner.innnerMethod();
    }
}

La clase interna miembro también puede acceder directamente a las variables de instancia y métodos de la clase externa, y también puede usar 外部类.this.xxxel método para referirse a las variables de instancia y métodos de la clase externa. Pero este último se usa generalmente cuando los métodos y variables de la clase interna del miembro tienen el mismo nombre que la clase externa

La esencia de la enumeración

La enumeración enumes un tipo de datos especial, su valor es limitado y se puede enumerar, por lo que se llama tipo de enumeración.

El ejemplo de definición de la clase de enumeración es el siguiente.

public enum Size {
    
    
    SMALL, MEDIUM, LARGE
}

Las enumeraciones enumse definen mediante palabras clave y cada valor del tipo de enumeración está separado por una coma ,. Los tipos de enumeración se pueden definir como un archivo separado o se pueden definir dentro de otras clases.

La definición de variables de tipo enumeradas es la siguiente.

Size size = Size.MEDIUM;

El método de toString()suma name()de la variable de enumeración size.toString()devuelve el valor literal de la variable de enumeración y el retorno es MEDIO.

Las variables de enumeración se pueden utilizar ==y equals()comparar. Debido a que los valores de enumeración están en orden, puede comparar los tamaños. El orden de los valores de enumeración se determina cuando se define el tipo de enumeración, comenzando desde 0. Los valores de enumeración se ordinal()devuelven mediante métodos .

Todos los tipos de enumeración implementan la Comparableinterfaz API de Java , que se compareTopuede comparar con otros valores de enumeración a través de métodos , que en realidad es ordinalel tamaño de la comparación .

El tipo de enumeración se puede utilizar en switchla condición de juicio, pero casela etiqueta en no se puede prefijar con el tipo de enumeración.

switch(size) {
    
    
    case SMALL:
        ...
       break;
        
    case MEDIUM:
       ...
       break;
        
    case LARGE:
       ...
       break;
}

Los tipos de enumeración tienen un valueOf(String)método estático que puede devolver el valor de enumeración correspondiente a la cadena.

System.out.println(Size.valueOf("SMALL"));

Los tipos de enumeración también tienen un valuesmétodo estático que devuelve una matriz que incluye todas las variables de tipo de enumeración, en el mismo orden que en la declaración.

for(Size size : Size.values()) {
    
    
	System.out.println(size);
}

De hecho, definir variables enteras estáticas en la clase también puede lograr la función de enumeración, pero el tipo de enumeración tiene las siguientes ventajas.

  • La sintaxis para definir enumeraciones es más concisa.
  • Los tipos enumerados son más seguros. Una variable de tipo de enumeración, su valor es nulo o uno de los valores de enumeración, no pueden ser otros valores. Si usa una variable entera, su valor no se puede restringir.
  • Los tipos de enumeración tienen muchos métodos integrados fáciles de usar.

El compilador de Java compilará el tipo de enumeración en una finalclase correspondiente , que hereda la clase java.lang.Enum de la API de Java.

Generalmente, las variables de tipo de enumeración se convertirán en las variables de clase correspondientes. En la instrucción switch, el valor de enumeración se convertirá en su valor ordinal correspondiente. Los tipos de enumeración son en realidad clases, pero debido a que el compilador automáticamente hace mucho trabajo, el uso de tipos de enumeración es más conciso, seguro y conveniente.

Los tipos de enumeración también pueden tener métodos y variables de instancia. La definición del valor de enumeración debe colocarse al principio y al ;final de la definición de clase .

public enum Size {
    
    
    SMALL("S", "小号"), 
    MEDIUM("M","中号"), 
    LARGE("L","大号");
    
    private String attribute;
    private String title;

    private Size(String attribute, String title) {
    
    
        this.attribute = attribute;
        this.title = title;
    }

    public String getAttribute() {
    
    
        return this.attribute;
    }

    public String getTitle() {
    
    
        return this.title;
    }
}

Supongo que te gusta

Origin blog.csdn.net/NelsonCheung/article/details/110358505
Recomendado
Clasificación