zoukankan      html  css  js  c++  java
  • 一、基础篇--1.1Java基础-final, finally, finalize 的区别

    final, finally, finalize

    首先,这三个关键字没什么关联,只是放在一起比较像,用法用处完全不同。

    final:

      final关键字可以用来修饰类、方法、变量(成员变量和局部变量),final用的多,下面详细介绍下

      1.1 final 修饰类

        final修饰类,表明这个类不能被继承,同时该类内的所有方法都被隐式定义为final。

      1.2 final 修饰方法

        final 修饰方法,该方法不可以被继承,不可以被重写。因此要注意,如果子类定义相同方法名和参数的函数,不是重写父类方法,是重新定义了一个新方法。

      1.3 final 修饰变量

        final修饰变量,表示只能被赋值一次,赋值后其值不再改变。

        当修饰基本数据类型时,基本数据类型的值初始化后就不会再发生变化。

        当修饰引用类型时,初始化后就不能再指向其他对象了,但是对象的值是可以变化的。引用的值本质是一个地址,因此只要地址不变,就不冲突。

        final修饰一个成员变量,必须要显式初始化。一种是声明变量时候初始化,一种是声明变量时不初始化,构造函数中对变量初始化。

    finally :

      finally用于异常处理,只能用在try/catch语句中。

      关于finally要注意两点:

        1、finally不一定会执行

          有两种不会执行:a、在执行try/catch之前异常跳出。b、系统强制退出,例如:System.exit(0);

        2、finally中包含return的易错点!!在Java语言的异常处理中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行。

        由于程序执行return就意味着结束对当前函数的调用并跳出这个函数体,因此任何语句要执行都只能在return前执行(除非碰到exit函数),因此finally块里的代码也是在return之前执行的

        例如:    

        public static void main(String[] args) {
            int result = test();
            System.out.println(result);
        }
        public static int test(){
            try {
                return 1;
            } catch (Exception e) {
                return 0;
            }finally{
                System.out.println("finally");
                return 2;
            }
        }

          运行结果:

        

        可以知道,finally块中有return语句时,会覆盖函数中的return。

        由于java中值传递和引用传递的不同,因此,对基本类型的数据,在finally块中改变return的值对返回值没有任何影响,而对引用类型的数据会有影响

        例子:   

    public static void main(String[] args) {
            System.out.println(test());
            System.out.println( testStr());
        }
        private static int test(){
            int i = -1;
            try {
                i= 1;
                return i;
            } catch (Exception e) {
                return i;
            }finally{
                i=2;
                System.out.println("finally");
            }
        }
        private static StringBuilder  testStr(){
            StringBuilder  str = new StringBuilder("hello");
            try {
                return str;
            } catch (Exception e) {
                return null;
            }finally{
                str.append("world");
                System.out.println("finally");
            }
        }

        运行结果:

        

    finalize:

      finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。不需要程序员自己手动调用的。只了解,不推荐使用。

     

          

  • 相关阅读:
    2019-9-2-Visual-Studio-自定义项目模板
    2018-8-10-WPF-判断调用方法堆栈
    2018-8-10-WPF-判断调用方法堆栈
    2018-8-10-VisualStudio-自定义外部命令
    2018-8-10-VisualStudio-自定义外部命令
    Java实现 LeetCode 999 车的可用捕获量(简单搜索)
    向代码致敬,寻找你的第83行(阿里巴巴的第83行代码是什么梗)
    向代码致敬,寻找你的第83行(阿里巴巴的第83行代码是什么梗)
    向代码致敬,寻找你的第83行(阿里巴巴的第83行代码是什么梗)
    Java实现 LeetCode 557 反转字符串中的单词 III(StringBuilder的翻转和分割)
  • 原文地址:https://www.cnblogs.com/foreverYoungCoder/p/9883208.html
Copyright © 2011-2022 走看看