La esencia de la interfaz: una interfaz es una clase abstracta especial que solo contiene la definición de constantes y métodos, pero no la implementación de variables y métodos.
Las interfaces pueden tener algunas cosas que tienen las clases abstractas. Si todos los métodos en una clase abstracta son abstractos, esta clase abstracta no necesita implementar ningún método, y todas las variables en esta clase abstracta son variables estáticas, son todas variables que no pueden. ser cambiado (final). En este caso, dicha clase abstracta se puede definir como una interfaz. El formato para definir una clase como interfaz es reemplazar la palabra clave clase que declara la clase con la palabra clave interfaz que declara la interfaz.
Una interfaz es una clase abstracta especial. En esta clase abstracta, todos los métodos son métodos abstractos y los atributos (es decir, variables miembro) de esta clase abstracta se declaran como "nombres de atributos de tipo final estáticos públicos". De esta manera, la declaración predeterminada es. "final público estático", es decir, las variables miembro internas son públicas, estáticas y no se pueden cambiar. Por lo tanto, al declarar una constante en una interfaz, se puede escribir en forma de "constante de tipo final estática pública nombre = valor (valor)", o se puede escribir directamente en forma de "tipo constante nombre = valor (valor) )", como: "public static final int id = 10" se puede escribir directamente en forma de "int id = 10", porque las declaraciones de propiedades predeterminadas en la interfaz son todas "public static final", por lo que "public static final " se puede omitir. No es necesario marcar el método abstracto declarado en la interfaz con la palabra clave abstracta, porque todos los métodos en la interfaz son abstractos, por lo que la palabra clave "abstracta" se omite de forma predeterminada, por ejemplo, si declara esas tres palabras en una interfaz. , Métodos: "public void start()", "public void run()", "public void "stop()" no está identificado por la palabra clave abstracta delante de estos tres métodos, pero son métodos abstractos, debido a que los métodos declarados en la interfaz son todos métodos abstractos, por lo que la palabra clave abstracta se omitirá en los métodos abstractos en el Interfaz descartada, porque los métodos declarados por defecto son abstractos. , por lo que no es necesario escribir la palabra "abstracto". Esto es diferente de cuando se declaran métodos abstractos en clases abstractas. Cuando se declaran métodos abstractos en clases abstractas, se debe utilizar la palabra clave "abstracto", y en las interfaces se puede omitir ". abstract" al declarar métodos abstractos. Nota: El método abstracto declarado en la interfaz es "público" de forma predeterminada y solo puede ser "público". La razón por la que se declara de esta manera es para corregir problemas que ocurren fácilmente cuando ocurre herencia múltiple en C++. En C ++ es probable que haya problemas. El problema es que si varias clases principales de herencia múltiple tienen las mismas variables miembro, será bastante problemático hacer referencia a ellas y se producirán varios problemas durante la operación. Para corregir este problema, JAVA cambió todas las variables miembro en la interfaz a estática final. Si la variable miembro es de tipo estático, entonces la variable miembro pertenece a toda la clase, en lugar de ser exclusiva de un determinado objeto. Para la herencia múltiple, un objeto de subclase en realidad contiene múltiples objetos de clase principal, mientras que para la herencia única, solo hay un objeto de clase principal en el objeto de subclase. Los objetos de subclase de herencia múltiple tienen múltiples objetos de clase principal y puede haber variables miembro duplicadas entre estos objetos de clase principal, lo que es muy propenso a causar problemas. Por lo tanto, este problema se puede evitar en JAVA mediante el uso de interfaces para implementar la herencia múltiple. Como interfaz, una clase puede heredar de la interfaz (o implementar la interfaz). Esto también es herencia múltiple. Las variables miembro en la interfaz no son exclusivas de un determinado objeto. Todas son variables miembro estáticas y pertenecen a toda la clase. Por lo tanto, no importa si una clase implementa múltiples interfaces y no habrá conflictos entre objetos. La implementación de múltiples interfaces también logra la herencia múltiple y evita los problemas propensos a la herencia múltiple. Este es el beneficio de usar interfaces para implementar la herencia múltiple.
1. Definir la interfaz
Utilice la interfaz para definir una interfaz. Las definiciones de interfaz son similares a definiciones similares y también se dividen en declaraciones de interfaz y cuerpos de interfaz. El cuerpo de la interfaz consta de dos partes: definición constante y definición de método. El formato básico para definir una interfaz es el siguiente:
[Modificador] nombre de la interfaz de la interfaz [extiende la lista de nombres de la interfaz principal]{
[público] [estático] [final] constante;
método [público] [abstracto];
}
Modificador: opcional, utilizado para especificar el permiso de acceso de la interfaz, el valor opcional es público. Si se omite, se utilizan los permisos de acceso predeterminados.
Nombre de la interfaz: un parámetro obligatorio que se utiliza para especificar el nombre de la interfaz. El nombre de la interfaz debe ser un identificador Java legal. Generalmente se requieren letras mayúsculas.
extiende: Lista de nombres de interfaz principal: parámetro opcional, utilizado para especificar de qué interfaz principal hereda la interfaz que se va a definir. Cuando se utiliza la palabra clave extends, el nombre de la interfaz principal es un parámetro obligatorio.
Métodos: los métodos en la interfaz solo se definen pero no se implementan.
Por ejemplo, defina una interfaz para el cálculo, en la que se definen un PI constante y dos métodos. El código específico es el siguiente:
interfaz pública CalInterface { final float PI=3.14159f;// Definir el PI constante utilizado para representar pi float getArea(float r);// Definir un método para calcular el área getArea() float getCircumference(float r);// Definir un método para calcular el perímetro getCircumference() }
Aviso:
Al igual que los archivos de clase de Java, el nombre del archivo de interfaz debe ser el mismo que el nombre de la interfaz.
2. Implementar la interfaz
Una vez definida una interfaz, se puede implementar en una clase. Para implementar una interfaz en una clase, puede usar la palabra clave implements y su formato básico es el siguiente:
[Modificador] clase <nombre de clase> [extiende el nombre de la clase principal] [implementa la lista de interfaces]{
............
}
Modificador: parámetro opcional, utilizado para especificar el permiso de acceso de la clase. Los valores opcionales son públicos, abstractos y finales.
Nombre de clase: un parámetro obligatorio que se utiliza para especificar el nombre de la clase. El nombre de la clase debe ser un identificador Java legal. Generalmente se requieren letras mayúsculas.
extiende el nombre de la clase principal: parámetro opcional, utilizado para especificar de qué clase principal hereda la clase que se va a definir. Cuando se utiliza la palabra clave extends, el nombre de la clase principal es un parámetro obligatorio.
lista de interfaces de implementos: parámetro opcional utilizado para especificar qué interfaces implementa esta clase. Cuando se utiliza la palabra clave implements, la lista de interfaces es un parámetro obligatorio. Cuando haya varios nombres de interfaz en la lista de interfaces, sepárelos con comas.
Al implementar una interfaz en una clase, el nombre del método, el tipo de valor de retorno, el número y el tipo de parámetros deben ser exactamente los mismos que los de la interfaz, y se deben implementar todos los métodos en la interfaz. Por ejemplo, escriba una clase llamada Cire que implemente la interfaz Calcular definida en la Sección 5.7.1. El código específico es el siguiente:
public class Cire implements CalInterface { public float getArea(float r) { float area=PI*r*r;// Calcula el área del círculo y asígnala al área de retorno del área variable; // Devuelve el área del círculo calculada} public float getCircumference (float r) { float circumference=2*PI*r; //Calcula la circunferencia del círculo y asígnala a la circunferencia variable return circunferencia; //Devuelve la circunferencia calculada} public static void main(String[] args) { Cire c = nuevo Cire(); float f = c.getArea(2.0f); System.out.println(Float.toString(f));
En la herencia de clases, solo se puede realizar una herencia única, pero al implementar interfaces, se pueden implementar múltiples interfaces a la vez y cada interfaz está separada por una coma ",".
En este momento, pueden ocurrir conflictos de nombres de métodos o constantes (en múltiples interfaces). Al resolver este problema, si las constantes entran en conflicto, debe especificar explícitamente la interfaz de la constante. Esto se puede lograr a través de "nombre de interfaz.constante". Si ocurre un conflicto de métodos, solo necesita implementar un método.