interfaz java (interfaz java)

Directorio de artículos

Características de la interfaz

Tenga en cuenta que es solo para JDK8 antes

  1. Los métodos en las interfaces pueden tener listas de parámetros y tipos de devolución, y todos los métodos no tienen cuerpo de método.

  2. Las interfaces no tienen constructores. Porque los constructores se usan para crear objetos.

  3. Todas las variables miembro en la interfaz se modifican por final estático público de forma predeterminada.

  4. Los campos en una interfaz solo se almacenan en el área de almacenamiento estático de la interfaz, que no pertenece a la interfaz.

  5. El método en la interfaz se puede declarar como público o no, pero el resultado se procesará de acuerdo con el tipo público.

  6. Todos los métodos en la interfaz se modifican por resumen público de forma predeterminada. También puede usar protected, pero no private.

  7. Al implementar una interfaz, el método definido debe declararse como tipo público; de lo contrario, es el tipo de acceso predeterminado, que no está permitido por el compilador de Java.

  8. Si no se implementan todos los métodos en la interfaz, aún se crea una interfaz.

  9. Extender una interfaz para generar una nueva interfaz debe usar la palabra clave extends e implementar una interfaz usando implements.

  10. Una interfaz hereda múltiples interfaces al mismo tiempo (la interfaz C extiende A, B {} es posible).

  11. El método en la interfaz es un método abstracto (abstracto), no un método estático (estático).Todos los métodos de la interfaz son abstractos, y el método abstracto no es estático, y el método con estática no se puede anular, por lo que la interfaz se define de esta manera la significación.

  12. Una clase que implementa una interfaz debe proporcionar implementaciones concretas de todos los métodos de la interfaz.

Interfaz Java (JDK) 8

En la versión JDK8, se permiten los siguientes tres métodos en la interfaz:

  • método abstracto abstracto modificado: nombre de método de tipo de retorno abstracto público (parámetro);
  • El método predeterminado modificado por defecto: nombre de método de tipo de devolución predeterminado público (parámetro) {cuerpo del método};
  • método estático modificado estático: nombre de método de tipo de retorno estático público (parámetro) {cuerpo del método};

Nuevas características de la interfaz Java (JDK) 8

  1. Métodos no abstractos que se pueden modificar con la palabra clave predeterminada en una interfaz . Es decir: el método predeterminado (o método de extensión), la clase de implementación puede anularse o no,
  2. La palabra clave estática se puede usar en la interfaz para modificar el método estático de la interfaz. La clase de implementación y la subinterfaz no pueden anular el método estático de la interfaz. El método estático definido en la interfaz solo se puede llamar a través de la interfaz.

Reglas de interfaz de Java (JDK) 8

public interface CompareA {
    
    
    //静态方法
    public static void method1(){
    
    
        System.out.println("CompareA:北京");
    }

    //默认方法
    public default void method2(){
    
    
        System.out.println("CompareA:上海");
    }
    
    public default void method3(){
    
    
        System.out.println("CompareA");
    }
}
  1. El método estático definido en la interfaz solo se puede llamar a través de la interfaz
    public class SubClassTest {
          
          
        public static void main(String[] args) {
          
          
            SubClass s = new SubClass();
            //s.method1();  错误写法
            CompareA.method1();
        }
    }
    
    class SubClass implements CompareA{
          
          
    	
    }
    
  2. Al implementar el objeto de la clase, se pueden llamar los métodos predeterminados en la interfaz.
  3. Si la clase de implementación anula el método predeterminado en la interfaz, el método anulado aún se llama al llamar.

Anulación del método de la subinterfaz y la interfaz principal

Los métodos estáticos de interfaz no se pueden implementar mediante la implementación de clases y subinterfaces

Los métodos estáticos de la interfaz no se pueden anular mediante la implementación de clases y subinterfaces.

El método predeterminado (predeterminado) se puede implementar implementando clases y subinterfaces

La subinterfaz hereda la interfaz principal y anula el método predeterminado de la interfaz principal.

El ejemplo de código es el siguiente:

interface interfaceA{
    
    
     default void defaultMethod(){
    
    
        System.out.println("interfaceA defaultMethod 方法");
    }
}

interface interfaceB extends interfaceA{
    
    
    default void defaultMethod(){
    
    
        //通过接口名.super.方法名来调用父类
        interfaceA.super.defaultMethod();
        System.out.println("interfaceB defaultMethod 方法");
    }
}
interface interfaceC extends interfaceB{
    
    
    default void defaultMethod(){
    
    
        interfaceA.super.defaultMethod();
        interfaceB.super.defaultMethod();
        System.out.println("interfaceB defaultMethod 方法");
    }
}

Si cada método anulado llamara a su supermétodo, tendría una cadena de llamadas. En general, una implementación siempre puede anular el método predeterminado sin llamarlo super.

Variables y métodos con el mismo nombre en la interfaz

Tenga en cuenta que el directorio actual es para JDK8 antes.

1. Aparece una variable con el mismo nombre entre la clase padre y la interfaz o interface

Tenga en cuenta que las variables con el mismo nombre en la interfaz son constantes (modificadas por public static final) y solo se pueden 接口名.常量名llamar.

Problema 1: al implementar la interfaz y heredar la misma variable de la clase principal , la subclase no puede elegir.
Solución:

En el método de la subclase, se muestra para indicar si la variable a generar es una variable de la clase padre o una interfaz. ( super/接口名.变量名).

El ejemplo de código es el siguiente:
interface interfaceA{
    
    
    int value = 0;
}
class ClassA{
    
    
    int value=10;
}
interface interface2{
    
    
    int value = 100;
}
class Test extends ClassA implements interfaceA,interface2{
    
    
    public int getValue(){
    
    
        //return super.value;	//父类中的i
        //return A.value;		//接口A中的i
        return A2.value;		//接口A2中的i
    }
}
public class TestMain {
    
    
    public static void main(String[] args) {
    
    
        Test t = new Test();
        System.out.println(t.printI());
    }
}

2. Hay un método con el mismo nombre en la clase principal y la interfaz

El ejemplo de código es el siguiente:
interface interfaceA{
    
    
    public void methodA();
}
class ClassA{
    
    
     public void methodA(){
    
    
         System.out.println("ClassA中的methodA()方法");
     };
}

class Test extends ClassA implements interfaceA{
    
    
   	//注意:这里子类不重写接口的方法,也不会报错
    //子类直接继承父类和实现接口不实现接口方法不报错,说明这种情况下默认父类实现该方法
}
public class TestMain {
    
    
    public static void main(String[] args) {
    
    
        Test t = new Test();
       	t.methodA();
    }
}
//打印日志
//我是Test类中的methodA()方法
  • Si la subclase no anula el método, el método de la clase principal se llamará primero de forma predeterminada y no se informará ningún error.

    Nota: Aquí, la clase principal ya tiene el método en la interfaz, y el método de la interfaz no se reescribirá y no se informará ningún error si la
    subclase hereda directamente la clase principal e implementa la interfaz.

  • Si la subclase anula este método, es equivalente a anular los métodos de la clase principal y la interfaz al mismo tiempo. Nota: Se llama al método anulado por la subclase.

class Test extends ClassA implements interfaceA{
    
    
   	 @Override
    public void methodA() {
    
    
        System.out.println("Test中的methodA()方法");
    }
    
}
public static void main(String[] args) {
    
    
        Test t = new Test();
       	t.methodA();
    }
//打印日志
//Test中的methodA()方法
  • Si la subclase quiere usar el método de la clase padre, puede pasarsuper.方法名
class Test extends ClassA implements interfaceA{
    
    
   	 @Override
    public void methodA() {
    
    
        super.methodA()
        System.out.println("Test中的methodA()方法");
    }
    
}
public static void main(String[] args) {
    
    
        Test t = new Test();
       	t.methodA();
    }
//打印日志
//ClassA中的methodA()方法
//Test中的methodA()方法

3. Hay un método con el mismo nombre entre la interfaz y la interfaz

1. La lista de parámetros + el valor devuelto son los mismos: la clase de implementación solo necesita implementar este método una vez
interface interfaceA{
    
    
    public void methodA();
}
interface interface2{
    
    
    public void methodA();

}
class Test implements interfaceA,interface2{
    
    
   	 @Override
     public void methodA(){
    
    
         System.out.println("Test中的methodA()方法");
     };
}
public class TestMain {
    
    
    public static void main(String[] args) {
    
    
        Test t = new Test();
        t.methodA();
    }
}
//打印日志
//Test中的methodA()方法
2. La lista de parámetros es la misma + el valor de retorno es diferente: la clase de implementación no puede implementar directamente los dos métodos (IDE informa un error).
interface interfaceA{
    
    
    public void methodA();
}
interface interface2{
    
    
    public int methodA();

}
class Test implements interfaceA,interface2{
    
    
    //编译期就会直接报错
   	//英文:'methodA()' in 'Test' clashes with 'methodA()' in 'InterfaceB';
    //attempting to use incompatible return type
   	//中文:'Test' 中的 'methodA()' 与 'InterfaceB' 中的 'methodA()' 冲突;
    //尝试使用不兼容的返回类型
    //无论重写哪一个接口中的方法都会报错,返回参数不同,定位不到哪个方法。
     @Override
     public void methodA(){
    
    
     };
}
3. La lista de parámetros es diferente: la clase de implementación puede implementar dos métodos respectivamente
interface interfaceA{
    
    
    public void methodA();
}
interface interfaceB{
    
    
    public int methodA(String name);

}
class Test implements interfaceA,interfaceB{
    
    
 	//参数列表不相同,分别重写,构成Test类重载。
     @Override
     public void methodA(){
    
    
         System.out.println("Test中的methodA()方法");
     }
     @Override
     public void methodA(String name){
    
    
         System.out.println("Test中的methodA(value="+name+")方法");
     };
}
public class TestMain {
    
    
    public static void main(String[] args) {
    
    
        Test t = new Test();
		t.methodA();
       	t.methodA("fry");

    }
}
//打印日志
//Test中的methodA()方法
//Test中的methodA(value=fry)方法

Supongo que te gusta

Origin blog.csdn.net/fry3309/article/details/124440331
Recomendado
Clasificación