final,finally,finalize 的区别

目录

final

finally

finalize


final 用于声明 属性(属性不可交变)、方法(方法不可覆盖)、(类不可继承)。

finally 异常处理语句结构 的一部分,不管是否有异常,他的语句总是执行。

finalize 是Object类的一个方法,主要是在收集器执行的时候会调用被回收对象的此方法,进行资源回收,例如关闭文件等。

final

它主要应用于:

  1. 定义变量,包括静态的和非静态的。
  2. 定义方法的参数。
  3. 定义方法。
  4. 定义类。

定义变量
1. 如果final修饰的是一个基本类型,此时final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。类似于C++中的 const。
2. 如果final修饰的是一个 对象 ,就表示这个变量被赋予的引用是不可变的。
(不可改变的只是这个变量所保存的引用,并不是这个引用所指向的对象)
实际上对于前两种情况,一种更贴切的表述final的含义的描述,那就是,如果一个变量或方法参数被final修饰,就表示它只能被赋值一次,但是JAVA虚拟机为变量设定的默认值不记作一次赋值。被final修饰的变量必须被初始化。初始化的方式以下几种:    

  • 1.在定义的时候初始化。    
  • 2.final变量可以在初始化块中初始化,不可以在静态初始化块中初始化。
  • 3.静态final变量可以在定义时初始化,也可以在静态初始化块中初始化,不可以在初始化块中初始化。    
  • 4.final变量还可以在类的构造器中初始化,但是静态final变量不可以。
public class MyFinal {
    // 1 被final变量如果未被初始化,编译时会报错
    public final int a;
    // 1 静态final变量未被初始化,编译时就会报错
    public static final int a;
    // ======================================================
    //2. 在定义时初始化
    public final int a = 1; 
    
    public final int b;
    {   //2. 在初始化块中初始化,也是可以的
        b = 2;
    }
    // ======================================================
    // 3 非静态final变量不能在静态初始化块中初始化
    public final int c;
    static{
            c=3;
    }

    //3 静态常量,在定义时初始化
    public static final int d = 3;
    //3 静态常量,在静态初始化块中初始化
    public static final int e;

    static {
        e = 4;
    }
    
    //3 静态变量不能在初始化块中初始化    
    public static final int  f;
    {
          f=60;
    }
    //========================================================
    
    public final int g;
    //静态final变量不可以在构造器中初始化    
    public static final int h;
    //在构造器中初始化         
    public void finalTest() {
        g = 70;
        // 静态final变量不可以在构造器中初始化
        h=80;
        // 给final的变量第二次赋值时,编译会报错
        a=99;
        d=99;
    }
}

定义方法
当final用来定义一个方法时,它表示这个方法不可以被子类重写,但是并不影响它被子类继承。

class Student {
    public String name;
    public int age;

    public final void fun() {
        System.out.println("111");
    }

}
class person extends Student {

    
    public void fun() {
        System.out.println("111");
    }
}

'fun()' cannot override 'fun()' in 'Student'; overridden method is final

定义类
对于final用于类的情况,首先,最常见的即我们最常用的String类就是final的。由于final类不允许被继承,编译器在处理时把它的所有方法都当作final的,因此final类比普通类拥更高的效率。

但是注意:

----->由关键字 abstract 定义的抽象类含必须由继承自它的子类重载实现的抽象方法,因此无法同时用final和abstract来修饰同一个类。

----->final也不能用来修饰接口。 final的类的所方法都不能被重写,但这并不表示final的类的属性(变量值也是不可改变的,要想做到final类的属性值不可改变,必须给它增加final修饰。

finally

finally只能用在try/catch语句中并且附带着一个语句块,表示这段语句最终总是被执行。

public final class TestDemo {

    public static void main(String[] args){

        try{

            throw new NullPointerException();

        }catch(NullPointerException e){
            
            System.out.println("这里有一个异常");

        }finally{

            System.out.println("依然执行!");

        }
    }
}

finalize

        finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。 
       但是在某些特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。 使用finalize还需要注意一个事,调用super.finalize();

       一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法,它跟析构函数不一样。

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值