final finally finalize区别以及final的不可变性

  1. final:可以修饰类、变量、方法

final类:不能被继承,成员方法不能覆盖。

final方法:不能被子类的方法覆盖,但可以被继承。

final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

final修饰的成员变量表示常量,值一旦给定就无法改变。

1.修饰局部变量时,一旦赋值就不能二次改变修饰基本数据类型时,表示该基本类型的值一旦在初始化后便不能发生变化。

public static void main(String[] args){

 //final修饰基本数据类型的局部变量

    int num1 = 10;

    System.out.println("num1 = " + num1);

     num1 = 100;

    System.out.println("num1 = " + num1);//输出100

    final int num2 = 20;

    //num2 = 200; //不能二次赋值

    final int num3;

    num3 = 30;//第一次可以

    //num3 = 300;}

2.Final 修饰引用类型:

public static void main(String[] args){

//我们用final修饰了一个集合list,并对集合进行add()操作,执行成功。

     final List<Student> list = new ArrayList();

     List.add("a");list.add("b");

     System.out.println(list.toString);

    //我们对集合进行变更,执行失败;

     final List<Student> list1 = new ArrayList();

    List1 = new ArrayList();

}

Final修饰的集合‘list’是一个引用,而这个引用指向了‘list’,在往集合里添加数据的时候,并没有影响到‘list’引用地址。而当我们 list = new ArrayList<>(); 为什么就不可以了呢?修饰引用类型时,则在其初始化后就不能再指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。简单一点,引用的值是一个地址,即地址值不能发生变化。 

3.修饰成员变量时, 一旦赋值,不能更改(一定要赋值)

直接赋值

构造方法赋值

构造代码开赋值

public class Student {
    final String name = "李明";
    final int age ;
    final int weight ;

//2.构造代码块/实例代码块:会在每次构造方法执行之前,执行一次
    //代码块赋值
    {
        weight = 120;
        System.out.println("这是代码块赋值");
    }
    public Student(){
        age = 18;
        System.out.println("这是无参构造方法赋值");
    }
    public Student(int age) {
        this.age = age;
        System.out.println("这是无参构造方法赋值");
    }

    public static void main(String[] args) {
        Student s = new Student();
        System.out.println(s.name+s.age+s.weight);
        // s.name="小花"; s.weight=130; s.age=21;  不能修改;
        Student s1 = new Student(22);
        System.out.println(s1.name+s1.age+s1.weight);
        //s1.name="李华"; s1.age=25; s1.weight=180;不能修改;
    }
}

4.final修饰静态变量,就变成一个静态常量

直接赋值

静态代码块赋值

class Animal {

    public final static int weight = 200;//1.直接赋值

    public final static int height;

    static {

        //2.静态代码块:会在类加载到内存后执行一次

        height = 50;

    }

}

 (2)finally:一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,当代码抛出一个异常时,就会终止方法中剩余代码的处理,并退出这个方法的执行。假如我们打开了一个文件,但在处理文件过程中发生异常,这时文件还没有被关闭,此时就会产生资源回收问题。对此,java提供了一种好的解决方案,那就是finally子句,finally子句中的语句是一定会被执行的,所以我们只要把前面说的文件关闭的语句放在finally子句中无论在读写文件中是否遇到异常退出,文件关闭语句都会执行,保证了资源的合理回收。

(3)finalize:是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值