final、finally和finalize虽然长得像孪生三兄弟一样,但是它们的含义和用法却是大相径庭。这一次我们就一起来回顾一下这方面的知识。
我们首先来说说final。它可以用于以下三个地方:
final修饰变量:表示该变量只能是常量,只能赋初始值。
定义方法:表示方法不能被重写。
定义类:表示该类不能被继承。
必须在非静态初始化块、声明该实例变量或构造器中指定初始值
必须在静态初始化块中指定初始值或声明该类变量时指定初始值,只能赋值一次的就叫作初始化,
用来修饰局部变量:
final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。不能赋值第二次,因为final是固定定义一个数据,就是常量。
例子:
//final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。
final String CeshiA="123";
final String CEShiB;
{
CEShiB="123456";
}
修饰方法,表示该方法无法被重写;
final 修饰的方法不能被重写Override,继承了一个类,然后里面有final的方法的话就不能被重写
例子:publicclass Demo {
publicvoid print(){
System.out.println("DEMO1‐‐‐print方法");
}
publicfinalvoid TestFinal() {
System.out.println("DEMO1‐‐TestFinal方法");
}
}
class FinalMethodTowextends Demo{
publicvoid print(){
System.out.println("重写DEMO1‐‐‐print方法");
}
//下面的代码有错误,无法重写final修饰的方法
public void TestFinal() {
System.out.println("DEMO1‐‐TestFinal方法");
}
}
图片送上看效果
修饰类,表示该类无法被继承:
final 修饰的类不能被继承 子类想继承父类的话,父类如果有final修饰的话就不能被继承
通过下面的代码可以验证以上的观点:
publicfinalclass Demo {
intceshi=1;
}
//继承它的时候就会报错,因为final修饰的类无法继承
class FinalMethodTowextends Demo{
}
这里需要特殊说明的是,具有private访问权限的方法也可以增加final修饰,但是由于子类无法继承private方法,因此也无法重写它。
finally的用法:
接下来我们一起回顾一下finally的用法。这个就比较简单了,它只能用在try/catch语句中,并且附带着一个语句块,表示这段语句最终总是被执行。请看下面的代码:
Finally是java的一种异常处理机制。
finally是对Java 异常处理模型的最佳补充。finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。特别是在关闭数据库连接这方面,如果程序员把数据库连接的close()方法放到finally中,就会大大降低程序出错的几率。
Java代码
public final classDemo{
public static void main(String[] args) {
try {
throw newNullPointerException();
} catch(NullPointerException e) {
System.out.println("程序抛出了异常");
} finally {
System.out.println("执行了finally语句块");
}
}
}
运行结果说明了finally的作用:
1、程序抛出了异常
2、执行了finally语句块
请大家注意,捕获程序抛出的异常之后,既不加处理,也不继续向上抛出异常,并不是良好的编程习惯,它掩盖了程序执行中发生的错误,这里只是方便演示,请不要学习。
finally是异常处理语句结构的一部分,表示总是执行。
finally块:出现异常也会执行,除非Java虚拟机被强制停止了,否则都会执行
finalize:Java中的一个方法名。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
我们首先来说说final。它可以用于以下三个地方:
final修饰变量:表示该变量只能是常量,只能赋初始值。
定义方法:表示方法不能被重写。
定义类:表示该类不能被继承。
必须在非静态初始化块、声明该实例变量或构造器中指定初始值
必须在静态初始化块中指定初始值或声明该类变量时指定初始值,只能赋值一次的就叫作初始化,
用来修饰局部变量:
final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。不能赋值第二次,因为final是固定定义一个数据,就是常量。
例子:
//final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。
final String CeshiA="123";
final String CEShiB;
{
CEShiB="123456";
}
修饰方法,表示该方法无法被重写;
final 修饰的方法不能被重写Override,继承了一个类,然后里面有final的方法的话就不能被重写
例子:publicclass Demo {
publicvoid print(){
System.out.println("DEMO1‐‐‐print方法");
}
publicfinalvoid TestFinal() {
System.out.println("DEMO1‐‐TestFinal方法");
}
}
class FinalMethodTowextends Demo{
publicvoid print(){
System.out.println("重写DEMO1‐‐‐print方法");
}
//下面的代码有错误,无法重写final修饰的方法
public void TestFinal() {
System.out.println("DEMO1‐‐TestFinal方法");
}
}
图片送上看效果
修饰类,表示该类无法被继承:
final 修饰的类不能被继承 子类想继承父类的话,父类如果有final修饰的话就不能被继承
通过下面的代码可以验证以上的观点:
publicfinalclass Demo {
intceshi=1;
}
//继承它的时候就会报错,因为final修饰的类无法继承
class FinalMethodTowextends Demo{
}
这里需要特殊说明的是,具有private访问权限的方法也可以增加final修饰,但是由于子类无法继承private方法,因此也无法重写它。
finally的用法:
接下来我们一起回顾一下finally的用法。这个就比较简单了,它只能用在try/catch语句中,并且附带着一个语句块,表示这段语句最终总是被执行。请看下面的代码:
Finally是java的一种异常处理机制。
finally是对Java 异常处理模型的最佳补充。finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。特别是在关闭数据库连接这方面,如果程序员把数据库连接的close()方法放到finally中,就会大大降低程序出错的几率。
Java代码
public final classDemo{
public static void main(String[] args) {
try {
throw newNullPointerException();
} catch(NullPointerException e) {
System.out.println("程序抛出了异常");
} finally {
System.out.println("执行了finally语句块");
}
}
}
运行结果说明了finally的作用:
1、程序抛出了异常
2、执行了finally语句块
请大家注意,捕获程序抛出的异常之后,既不加处理,也不继续向上抛出异常,并不是良好的编程习惯,它掩盖了程序执行中发生的错误,这里只是方便演示,请不要学习。
finally是异常处理语句结构的一部分,表示总是执行。
finally块:出现异常也会执行,除非Java虚拟机被强制停止了,否则都会执行
finalize:Java中的一个方法名。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。