接口(引用数据类型):
概念:当一个类中的所有方法都时抽象方法的时候,我们就可以将其定义为接口
- 接口存在的两个重要意义
- 规则的定义
- 程序的扩展性
接口的定义和特点:
- 接口用关键字interface来定义:——public interface 接口名{}
- 接口不能实例化
- 接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名{}
- 接口的子类(实现类)
- 要么重要接口中的所有抽象方法
- 要么是抽象类
特点:java中实现类支持单个接口,也可以实现多个接口(抽象方法没有方法体,不会产生冲突):public class 类名 implements 接口名1,接口名2{}
接口中成员的特点
- 成员变量
——只能是常量
默认修饰符:public static final
- 构造方法:没有
- 成员方法:
只能是抽象方法(jdk7或jdk7之前)
默认修饰符;public abstract
jdk8版本后:
1.允许在接口中定义非抽象方法,但是需要使用关键字default修饰,这些方法就是默认方法(作用:解决接口升级的问题)
接口中默认方法的定义格式:
-
- 格式:public default 返回值类型 方法名(参数列表){}
- 范例:public default id show(){}
接口中默认方法的注意事项:
-
- 默认方法不是抽象方法,所以不强制被重写,但是可以被重写,重写的时候去掉default关键字
- public 可以省略,default不能省略
- 如果实现了多个接口,多个接口中存在相同方法声明,子类就必须对该方法进行重写
2.接口允许调用static静态方法
接口中静态方法的定义格式:
-
- 格式:public static 返回值 方法名(参数列表)
- 范例:public static void show(){}
接口中静态方法的注意事项:
-
- 静态方法只能通过接口名调用,不能通过实现名或者类名调用
- public 可以省略,static 不能省略
类和接口的关系:
类和类的关系:
继承关系,只能单继承,但可以多层继承
类和接口的关系:
实现关系,可以单实现,也可以多实现,还可以在继承一个类同时实现多个接口
接口和接口的关系:
继承关系,可以单继承,也可以多继承;(若子接口继承的两个接口之间存在冲突的默认方法,则子接口要重写默认的方法;
内部类
内部类:就是在一个类中定义一个类。
创建内部类对象的格式:
外部类名.内部类名 对象名=new 外部类对象().new 内部类对象();
内部类的访问特点:
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
成员内部类:
概述:在类的成员位置定义定义的类
修饰符:成员内部类,也属于(成员),既然是成员就可以被一些修饰符所修饰
- private:私有成员内部类访问:在自己所在的外部类中创建对象访问。
- static:
静态成员内部类访问格式:外部类名.内部类名 对象名=new 外部类名。内部类名()
静态成员内部类中的静态方法:外部类名.内部类名.方法名();
局部内部类:
局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用,该类可以直接访问外部类的成员,也可以访问方法内的局部变量;
匿名内部类:
概述:匿名内部类本质上是一个特殊的局部内部类(定义在方法内部)
前提:·
格式:new 类名/接口名(){
重写方法;
}
Lambda表达式
lambda表达式的标准格式:
- 格式:(形式参数)->{代码块}
- 形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空;
- 代码块:方法体;
Lambda表达式的使用前提:
- 有一个接口
- 接口中有且仅有一个抽象方法
Lambda表达式的省略模式:
省略规则:
- 参数类型可以省略,但是有多个参数的情况下,不能只省略一个
- 如果参数有且仅有一个,那么小括号可以省略
- 如果代码块的语句只有一条,可以省略大括号和分号,甚至是retrun
Lambda表达式和匿名内部类的区别
所需类型不同:
- 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
- lambda表达式:只能是接口
是由限制不同
- 如果接口中有且仅有一个抽象方法,可以使用lambda表达式,也可以是匿名内部类
- 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用lambda表达式
实现原理不同: