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
    评论
### 回答1: final 是一个修饰符,用来修饰类、变量或者方法,有多种不同的用法,它可以防止派生类修改父类中的方法。finally 是异常处理语句结构中的一部分,它总是执行,即使catch块没有捕获异常,或者在try块中发生return语句或抛出异常。finalize 是一种特殊的方法,它在垃圾收集器准备好回收对象时执行,它允许用户在垃圾收集器清理对象之前做一些清理工作。 ### 回答2: 在Java中,finalfinallyfinalize是三个不同的关键字,具有不同的用途和含义。 1. finalfinal是一个修饰符,可以应用于变量、方法和类。当应用于变量时,代表该变量为常量,即不可被修改。当应用于方法时,代表该方法不可被子类重写。当应用于类时,代表该类不可被继承。final关键字用于表示一个最终的、不可变的实体。 2. finallyfinally是一个关键字,用于定义在try-catch语句中的一个代码块。无论是否发生异常,finally语句块中的代码总是会被执行。finally块通常用于关闭资源或释放资源,以确保资源的正常回收。 3. finalize:finalize是一个方法,属于Object类的一个方法。它在垃圾回收器清除对象之前调用。finalize方法可以被子类重写,用于在对象被销毁之前进行善后操作,例如释放占用的系统资源。但在现代Java编程中,应尽量避免使用finalize方法,而是使用其他方式手动释放资源,因为finalize方法的执行时间是不确定的,可能会造成性能上的问题。 总结起来,final是用来修饰最终的实体,finally是用来确保代码块一定会被执行,而finalize是一种供垃圾回收器回收对象前进行善后操作的机制。 ### 回答3: 在Java中,finalfinallyfinalize是三个被经常混淆的概念,它们的作用和用法完全不同。 1. finalfinalJava中的关键字,用于修饰变量、方法和类。当修饰一个变量时,表示该变量的值不能被修改。当修饰一个方法时,表示该方法不能被子类重写。当修饰一个类时,表示该类不能被继承。final关键字的作用是为了保证数据的安全性和程序的稳定性。 2. finallyfinally也是Java中的关键字,用于定义一个块,无论是否发生异常都会执行该块中的代码。finally块通常用于释放资源,例如关闭文件、数据库连接等。无论try或catch块中是否有return语句,finally块都会被执行。 3. finalize:finalize是Object类中的一个方法,在Java中用于垃圾回收机制。当一个对象不再被引用时,垃圾回收器会在适当的时机调用该对象的finalize()方法,允许对象在被销毁前进行必要的清理操作,例如关闭资源等。但是,由于finalize()方法的调用时间不确定且不可靠,不建议在程序中过度依赖该方法。 综上所述,final关键字用于修饰变量、方法和类,表示不可改变、不可重写和不可继承;finally关键字用于定义一个块,无论是否发生异常都会执行其中的代码;finalize()方法用于在对象被销毁前进行必要的清理操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值