接口、Lambda表达式与内部类(接口)

一、接口

1、基本概念

接口不是类,而是对类的一组需求进行描述,这些类要遵从接口描述的统一格式进行定义,接口通常以Interface来声明,它是抽象方法的集合。

如:

interface A{//定义一个接口

 

    public static final String MSG = "Simon";//全局常量

    public abstract void print();//抽象方法

}

接口中只能存在静态常量和抽象方法。

2、接口的使用

由于接口里面存在抽象方法,所以接口对象不能直接使用关键字New直接进行实例化。

2.1使用原则

 

①接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口。

②接口的子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法。

③接口对象可以利用子类对象向上转型进行实例化。

范例:

interface A{//定义一个接口A

 

    public static final String MSG = "hello";//全局常量

 

    public abstract void print();//抽象方法

}

 

interface B{//定义一个接口B

 

    public abstract void get();

}

 

class X implements A,B{//X类实现了A和B两个接口

 

    @Override

    public void print() {

        System.out.println("接口A的抽象方法print()");

    }

 

    @Override

    public void get() {

        System.out.println("接口B的抽象方法get()");

    }

 

}

 

public class TestDemo {

 

    public static void main(String[] args){

 

        X x = new X();//实例化子类对象

        A a = x;//向上转型

        B b = x;//向上转型

 

        a.print();

        b.get();

    }

 

}

除了可以实现接口外,还可以继承抽象类

class 子类 [extends 父类] [implemetns 接口1,接口2,...] {}

NOTE:

对于接口,里面的组成只有抽象方法和全局常量,为了书写简单,可以不用写 public abstract 和public static final,接口中的访问权限只有一种:public,即:定义接口方法和全局常量的时候就算没写上piblic,那么最最终的访问权限也是public

 

2.2

从接口的概念上来讲,接口只能由抽象方法和全局常量组成,但是内部结构是不受概念限制的,正如抽象类中可以定义抽象内部类一样,在接口中也可以定义普通内部类、抽象内部类和内部接口(但从实际的开发来讲,用户自己去定义内部抽象类或内部接口的时候是比较少见的)

interface A{

    public void funA();

 

    abstract class B{//定义一个抽象内部类

        public abstract void funB();

    }

}

 

在接口中如果使用了static去定义一个内接口,它表示一个外部接口:

interface A{

    public void funA();

 

    static interface B{//使用了static,是一个外部接口

        public void funB();

    }

}

class X implements A.B{

 

    @Override

    public void funB() {

 

    }

 

}

三、接口的形象表示

四、接口与抽象类的比较

1、抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

2、抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

3、接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

4、一个类只能继承一个抽象类,而一个类却可以实现多个接口。

 

五、默认方法

 

使用default修饰符为接口提供一个默认的方法实现。

public interface Comparable<T>

{

default int compareTo(T other) {

return 0;

}

}

作用:默认方法的一个重要作用就是接口演化,当一个接口增加其它方法时,为了防止已经实现该接口的类编译报错,需要添加默认方法(实现接口时需要实现里面的全部方法,否则会报错)

 

六、解决默认方法冲突

1、超类优先

若一个类扩展了一个超类,同时实现了一个接口,并从超类和接口继承了相同的方法,在这种情况下,只会考虑超类的方法,接口中的所有默认方法都会被忽略。

2、接口冲突

当实现的两个接口都提供同名的默认方法时,需要在实现接口的类上重写该方法,确定要实现哪个接口的方法。

class Student implments Person,Named

{

oublic String getName{

return Person.super.getName();

}

}

发布了71 篇原创文章 · 获赞 42 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/dreame_life/article/details/102639369