p396-406
final关键字
1.final修饰的为“常量”,需要给初始值。1可以直接定义时赋值,2在构造器中,3在代码块中。
注意静态代码块只能访问静态变量。
2.如果final修饰的关键字是静态的,那就不能在构造器中赋值,只能1定义时,2.在静态代码块中。
因为构造器不能static,但是静态的在类加载的时候就要生成了,而构造器是在创建对象的时候才调用!
3.final类不能继承,但是可以实例化对象~
4.如果类不是final类,但是含有final方法,则该方法不能重写,但是可以继承。即仍然遵守继承机制。
5.一般来说,如果已经是一个final类了(不能被继承了),里面的方法就不用final了
6.final不能修饰构造器
7.final往往和static搭配,效率更高:不会导致类的加载,底层编译器做了优化
8.包装类都是final的,不能被继承(如String,Integer,Double)
9.传入参数也可以用final修饰
抽象类
父类的一些方法声明了,但是没有实现,即没有方法体,这个方法就是抽象方法。
当一个类中存在抽象方法时,需要将该类声明为抽象类
设计模式用的比较多
抽象类细节
1.抽象类不能被实例化
2.抽象类不一定要包含abstract方法
3.一旦包含了abstract方法,则必须把类声明为abstract类
4.abstract只能修饰类和方法,不能修饰别的
5.抽象类可以有任意成员(抽象类还是个类)
6.抽象方法不能有方法体
7.如果一个类继承了抽象类,则它必须实现抽象类的所有方法,除非它自己也声明为abstract类
8抽象方法不能使用private、final、和static来修饰,因为这些关键字都是和重写违背的
抽象类最佳实践:模板设计模式
程序执行期间会动态绑定!根据运行类型来找方法。
接口
接口就是给出一些没有实现的方法,封装到一起,到某个类型要使用的时候,在根据具体的需求来把方法写出来。
interface 接口名{
属性
方法
}
class 类名 implements 接口名{
自己属性
自己方法
必须实现的接口的抽象方法
}
小结:jdk7之前,接口中所有方法都没有方法体,即都是抽象方法,jdk8之后,接口可以有默认实现方法,要求用default修饰,如default public void kkk(){}。jdk8之后还可以有静态方法
如果一个类implements一个接口,那么必须将该接口的所有方法都实现。
接口的使用细节
应用场景:我要制造飞机,只需要把功能、规格定下来即可,然后让别人实现。(统一一个入口)
细节:
1.接口不能被实例化
2.接口中所有的方法都是public方法(就算你不写它也是public的),接口中的抽象方法可以不用abstract修饰。
3.一个普通类实现接口,就必须将连接接口的所有方法都实现:快捷键alt+enter
4.抽象类实现接口,可以不用实现接口的方法。(即抽象类本身是允许存放抽象方法的!)
5.一个类同时可以实现多个接口.
6.接口中的属性只能是final的,而且是public static final int a = 1;