final、finally和return

5 篇文章 0 订阅

final、finally和return

众所周知,一提到final就会想到static、一想到try…catch用法就会想到还有个finally、一想到finally就又会引出return与其的关系。

那么就来好好理一理这三者:

1、final与static的区别

首先这两者都是有相同点的:

①都可以修饰类,成员变量,方法
②都不能用于修饰构造方法

其次static可以修饰代码块,final不可以;
static不可以修饰方法内的局部变量,final可以;

static:

  • static修饰表示静态或全局变量,被修饰的属性和方法属于类,可以用类名.静态属性/方法名访问
  • static修饰的代码块为静态代码块,当Java的JVM加载时,会执行且只执行一次该代码块
  • static修饰的变量可以被重新赋值
  • 在static修饰的方法中不能够同时拥有super和this关键字
  • static方法不能被重写
  • static方法必须被实现,不能是抽象的

final

  • final修饰表示常量,一旦创建不可改变
  • final标记的成变量必须在声明时赋值,且不能重新赋值
  • final方法不能被子类重写,不能被继承

2、finally与return之间执行顺序对返回值的影响

在这里主要讨论try语句块下和finally语句块不考虑catch语句块

2、1 对于返回值问题,当finally和return中同时有return语句的时候会出现这几种情况:
①finally语句块会执行

②finally中没有return,finally对return变量的重新赋值修改无效

③try和finally都包含return,return值会以finally语句块return值为准

2、2 代码演示:

public class FinallyTest {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(String.valueOf(FinalTest.class));
        System.out.println(FinalTest.test());
    }
    public static @NotNull String test() {
        String str = "你好";
        int i = 9;
         /**
         * 当finally中有return的时候,若finally中改变了变量的值,则return返回finally中的值
         */
        try {
            str = "爸爸";
            System.out.println("try....");
            return str;
        } finally {
            System.out.println("finally....");
            str = "儿子";
            return str;
        }
    }
}

输出结果:
在这里插入图片描述

public class FinallyTest {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(String.valueOf(FinalTest.class));
        System.out.println(FinalTest.test());
    }
    public static @NotNull String test() {
        String str = "你好";
        int i = 9;
         /**
         * 当finally中没有return的时候,若finally中改变了变量的值,则没有影响
         */
        try {
            str = "爸爸";
            System.out.println("try....");
            return str;
        } finally {
            System.out.println("finally....");
            str = "儿子";
           // return str;
        }
    }
}

输出结果:
在这里插入图片描述

3、在try…catch中finally语句块一定会被执行吗?

那么问题就又来了,在try语句中finally语句一定会被执行到吗?答案当然是不一定啊,肯定会有特殊情况啊!!!

①程序正常执行结束:

public class FinalTest {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(String.valueOf(FinalTest.class));
        System.out.println(FinalTest.test());
    }
    public static @NotNull String test() {
        String str = "你好";
        int i = 9;

        if (i == 9){
        /**程序执行到这一步直接返回str的值,不再继续向下执行**/
            return str;
        }
        try {
            System.out.println("try.....");
            return str;
        } finally {
            System.out.println("finally.....");
        }
}

输出结果:
在这里插入图片描述

②抛出异常,执行到try抛出异常直接结束

public class FinalTest {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(String.valueOf(FinalTest.class));
        System.out.println(FinalTest.test());
    }
    public static @NotNull String test() {
        String str = "你好";
        int i = 9;
        /**抛出异常,执行到return str的时候抛出异常直接结束**/
        i = i / 0;
        try {
           System.out.println("try....");
            return str;
        } finally {
            System.out.println("finally.....");
        }
    }
}

输出结果:
在这里插入图片描述
这里提示11、28行出错就是我们的 test方法下的i = i / 0;
这本就是个错误的表示,在程序执行中会报错,用try来执行会直接抛出异常
在这里插入图片描述
在这里插入图片描述
③系统直接退出不再向下执行

public class FinalTest {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(String.valueOf(FinalTest.class));
        System.out.println(FinalTest.test());
    }
    public static @NotNull String test() {
        String str = "你好";
        int i = 9;
        /**系统退出不在向下执行程序**/
        try {
            System.out.println("try....");
            System.exit(0);
            return str;
        } finally {
            System.out.println("finally....");
        }
     }
 }

输出结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值