不会导致类初始化的情况:1.访问类中无需创建对象的静态常量
2.类对象.class
3.创建该类的数组
4.类加载器ClassLoader的loadClass方法
5.Class.forName的参数为false
抽象方法不能被static、final、native、private修饰
接口和抽象类的区别:
1、定义的关键字不同,抽象类是abstract class,接口是interface
2、下层发生的关系不同:实现类和接口是implements实现关系,子类和父类是extends关系
3、抽象类是一个特殊的类,特殊在可以有抽象方法和普通方法;接口是一个特殊的抽象类,特殊在接口里 都是抽象方法
4、抽象类有构造方法,用来给子类new时调用;接口没有构造方法,实现类new时调用Object类的无参构造
5、抽象类里有变量有常量.接口里只有常量.
6、抽象类里的方法可以是普通的也可以是抽象的,接口里都是抽象的
7、接口里的资源可以简写: 接口里的常量,可以简写,会自动拼接public static final,接口里的方法,可以简写,会自动拼接public abstract
8、接口和实现类是实现关系,而且可以多实现;抽象类和子类是继承关系,而且是单继承
业务代码思路:
抽象方法:用来分配工作,让声名过程与实现过程分离,负责功能不会阻塞整体项目进度
接口:有助于自动化实现代码功能的生成与增强
组件工具代码思路:
抽象类:整合基础特征,然后基于抽象类开发工具各种特征的具体实现类
接口:单一特征性的提取
JDK8接口新特性:
static 静态方法,只能通过接口名调用
default 默认方法,只能通过接口的实现类的对象来调用
静态方法、默认方法都不为抽象方法
@FunctionalInterface 函数式接口检测注解:有且仅有一个抽象方法的接口
函数式接口的抽象方法实现方式:
JDK1.8-:1.创建接口实现类,创建实现类对象,长期保存,复用
2.使用匿名内部类,实现化接口,临时书写
JDK1.8+:1.使用函数式接口,方法提取创建实例,长期保存,复用
2.使用函数式接口,Lambda表达式创建实例,临时书写
方法引用(::):静态方法引用 classname::methodname
对象的实例方法引用 instancename::methodname
对象的超类方法引用 super::methodname
Lambda表达式:表示当场写一个方法进去
(参数)->{……};
可选类型声名:不需要声名参数类型
可选的参数圆括号:一个参数无需定义()
可选的大括号:如果方法体只有一条语句不需要使用{}
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值无需{return}
特点:主要用来定义行内执行的方法类型接口
免去了使用匿名内部类的麻烦
只能引用标记了final的外层局部变量,不能在Lambda内部修改定义在域外的局部变量
Lambda表达式可以调用外部的局部变量和静态常量,但不能修改而方法引用都可以调用,与正常方法相同
内部类:将一个类定义在另一个类里面或者方法里面,这样的类就被称为内部类
一般在项目组中不推荐使用,不方便统一管理且容易出现使用错误
内部类可分为:实例内部类、静态内部类、局部内部类、匿名内部类
实例内部类中可以调用到外部类的静态变量与静态方法
局部内部类可以调用到外部方法的局部变量(不允许修改) 根据所在方法的类型,调用到外部类的实例变量与静态变量(可以修改)不允许创建静态资源