final关键字
final 语义是不可改变的。
- 被 final 修饰的类,不能够被继承。
- 被 final 修饰的成员变量必须要初始化(即,必须确保在每一个构造器执行之后,这个域的值被设置),赋初值后不能再重新赋值(可以调用对象方法修改属性值)。
对基本类型来说是其值不可变;对引用变量来说其引用不可变,即不能再指向其他的对象(但引用的对象可以修改)。 - 被 final 修饰的方法代表不能重写。
将一个类声明为 final, 只有其中的方法自动地成为 final, 而不包括域/成员变量。
final finally finalize()区别
- final 表示最终的、不可改变的。用于修饰类、方法和变量。final 变量必须在声明时给定初值,只能读取,不可修改。final 方法也同样只能使用,不能重写,但能够重载。final 修饰的对象,对象的引用地址不能变,但对象的属性值可以改变
- finally 异常处理的一部分,它只能用在 try/catch 语句中,表示希望 finally 语句块中的代码最后一定被执行(存在一些情况导致 finally 语句块不会被执行,如 jvm 结束)
- finalize() 是在 java.lang.Object 里定义的,Object 的 finalize() 方法什么都不做,对象被回收时 finalize() 方法会被调用。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作,在垃圾收集器删除对象之前被调用的。一般情况下,此方法由JVM调用。特殊情况下,可重写 finalize() 方法,当对象被回收的时候释放一些资源,须调用 super.finalize() 。
finally语句块一定执行吗
答案是不一定。存在很多特殊情况导致 finally 语句块不执行。如:
- 直接返回未执行到 try-finally 语句块
- 抛出异常未执行到 try-finally 语句块
- 系统退出未执行到 finally 语句块
等…
static关键字
static 可以修饰成员变量、方法、代码块和内部类
static 成员变量
是这个类所有,由该类创建的所有对象共享同一个 static 属性
可以通过创建的对象名.属性名 和 类名.属性名两种方式访问
static 变量在内存中只有一份,(是在类加载时被创建并进行初始化,只会被创建一次)
static 修饰的变量只能是类的成员变量static 方法
可以通过对象名.方法名和类名.方法名两种方式来访问
static 方法中不能用 this 和 super 关键字(静态方法不能操作对象)
static 方法必须被实现,不能被重写static 代码块
在类被第一次加载时执行静态代码块,且只被执行一次,主要作用是实现 static 属性的初始化static 内部类
属于整个外部类,而不属于外部类的每个对象,只可以访问外部类的静态变量和方法
static 和 final 关键字的区别
都可以修饰类、方法、成员变量。
都不能用于修饰构造方法。
static 可以修饰类的代码块,final 不可以。
static 不可以修饰方法内的局部变量,final 可以。