final
- 修饰属性、方法、类
- 修改属性:值不能更改(常量)
- 修饰方法:方法不能重写(继承中子类不能重写父类中被final修饰的成员方法)
- 修饰类:类不能被继承
- 被final修饰的属性:要不显示赋值,要不构造方法赋值
//错误:final修饰的属性/变量不能被修改 class Test { final int PI = 3.1415926; public Test(int pi){ this.PI = pi; } }
- 面试题:
- 构造方法能不能被final修饰?(不允许)
- final abstract能不能同时修饰一个类?(不能)
static
- 修饰:属性、一般方法、游离块、内部类
- 面试题:能不能修饰外部类和局部变量?(不能)
- 修饰属性:静态属性/类变量
- 修饰方法:静态方法
- static修饰的成员变量不属于对象的数据结构
- static成员变量和类的信息放在一起,仅保留一份,用于共享,而不是在堆中保留在每个对象里的多个副本
- 被static修饰的属性和方法可以用类名字直接调用,可以不创建对象。不过,对象也可以直接调用
- 静态方法里不能使用非静态属性。(eg:main函数不能直接使用本类中的非静态的成员变量)
- static游离块在类加载的就被执行,且只执行一次
- 同时被final,static修饰的是常量,必须声明的同时初始化,不可被改变(在编译时就被指定具体值)
- static参与的程序执行次序
- 面试题
class Test { // Test example = new Test(); static Test example = new Test(); public Test() { System.out.println("lalala"); } public static void main(String[] args) { Test test = new Test(); } } // 不加static修饰,程序就存在递归