代码改变世界

final,finally,finalize 这三个有什么区别

  钟铧若岩  阅读(11)  评论(0编辑  收藏  举报

finalfinally 和 finalize 是 Java 中三个不同的关键字,它们的用途和功能差异很大,以下为你详细介绍:

final 关键字

 

final 关键字可以用于修饰类、方法和变量,其作用是限制它们的可修改性和继承性。

 

    • 修饰类:当一个类被 final 修饰时,意味着这个类不能被继承,即不能有子类。常用于一些安全性和稳定性要求较高的类,防止其被恶意扩展或修改。
final class FinalClass {
    // 类的内容
}

// 以下代码会报错,因为 FinalClass 不能被继承
// class SubClass extends FinalClass {} 
  • 修饰方法:当一个方法被 final 修饰时,该方法不能被其子类重写(覆盖)。常用于确保方法的实现逻辑不被改变。

复制代码
class ParentClass {
    public final void finalMethod() {
        System.out.println("This is a final method.");
    }
}

class ChildClass extends ParentClass {
    // 以下代码会报错,因为 finalMethod 不能被重写
    // public void finalMethod() {} 
}
复制代码
  • 修饰变量:当一个变量被 final 修饰时,该变量一旦被赋值,就不能再被重新赋值,成为常量。对于基本数据类型,其值不能改变;对于引用数据类型,其引用不能改变,但对象的内容可以改变。

复制代码
class FinalVariableExample {
    public static void main(String[] args) {
        final int constant = 10;
        // 以下代码会报错,因为常量不能被重新赋值
        // constant = 20; 

        final StringBuilder sb = new StringBuilder("Hello");
        sb.append(" World"); // 可以修改对象内容
        // 以下代码会报错,因为引用不能被重新赋值
        // sb = new StringBuilder("New"); 
    }
}
复制代码

finally 语句块

 

finally 语句块通常与 try-catch 语句一起使用,无论 try 块中的代码是否抛出异常,finally 块中的代码都会被执行。常用于释放资源,如关闭文件、数据库连接等。
 
复制代码
import java.io.FileInputStream;
import java.io.IOException;

public class FinallyExample {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("test.txt");
            // 读取文件的代码
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close(); // 确保文件流被关闭
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
复制代码

 

finalize 方法


finalize 是 Object 类中的一个方法,每个类都继承了该方法。当垃圾回收器确定一个对象没有更多引用时,会在回收该对象之前调用其 finalize 方法。通常用于在对象被销毁前进行一些资源清理操作,但不建议依赖 finalize 方法进行资源释放,因为它的调用时机不确定,可能会导致资源不能及时释放。
 
复制代码
class MyClass {
    @Override
    protected void finalize() throws Throwable {
        try {
            // 执行一些资源清理操作
            System.out.println("Finalize method is called.");
        } finally {
            super.finalize();
        }
    }
}

public class FinalizeExample {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        obj = null; // 使对象成为垃圾对象
        System.gc(); // 建议垃圾回收器进行回收
    }
}
复制代码

总结

 

    • final:是一个修饰符,用于限制类、方法和变量的可修改性和继承性。
    • finally:是 try-catch 异常处理机制的一部分,确保其中的代码无论是否发生异常都会执行,常用于资源释放。
    • finalize:是 Object 类的一个方法,在对象被垃圾回收前可能会被调用,用于对象销毁前的资源清理,但调用时机不确定。



相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示