博客
关于我
浅谈java中final关键字的作用
阅读量:359 次
发布时间:2019-03-04

本文共 2174 字,大约阅读时间需要 7 分钟。

Java中的final修饰:深入理解其作用与限制

作为一名开发者,理解Java中的final修饰符是非常重要的。它不仅影响变量、方法和类的行为,还会影响代码的设计和优化。本文将从多个角度深入探讨final修饰的作用及其在代码中的应用。

1. final修饰类中的属性或变量

final修饰的属性或变量具有以下特点:

无论属性是基本类型还是引用类型,final所起的作用都是确保变量中的“值”不能改变。对于基本类型变量,它直接存储的是实实在在的值(如1"abc"等);而对于引用类型变量,它存储的是一个地址,final修饰后只能确保地址不能改变,但地址指向的对象或数组的内容是可以变化的。

例如:

// 类中有一个属性是final Person p = new Person("name");// 这意味着p不能被重新赋值,但可以修改p中的属性值,如p.setName('newName')。

此外,final属性可以在声明时、初始化块中或构造方法中赋值,但一旦赋值后就不能再修改。

2. final修饰类中的方法

final修饰的方法在类中具有以下特点:

final修饰的方法可以被继承,但继承后不能被重写。这意味着调用这些方法的方式可能会受到限制,但它们仍然可以在子类中正常运行。

3. final修饰类

final修饰类的目的是防止其他类从它继承。这意味着使用final修饰类可以确保类的完整性和安全性。

4. 被final修饰的变量不可变

final修饰的变量在运行时不可变,这主要体现在变量的引用而非引用指向内容的变化。例如:

public class FinalString {    private String str;    public FinalString(String str) {        this.str = str;    }    public String getStr() {        return str;    }    public void setStr(String str) {        this.str = str;    }}
public class Test {    public static void main(String[] args) {        final FinalString fs = new FinalString("1");        fs.setStr("2");        System.out.println(fs.getStr());    }}

运行上述代码没有问题。但修改为:

public static void main(String[] args) {    final FinalString fs = new FinalString("1");    final FinalString fss = new FinalString("333");    fs = fss;}

则会报错:“The final local variable fs cannot be assigned”。

这表明被final修饰的变量的引用不可变,但引用指向的内容是可以变化的。

final修饰数组的特殊情况

对于数组变量,final修饰同样意味着引用不可变,但数组内容是可以变化的。例如:

public static void main(String[] args) {    final String[] strs0 = {"123", "234"};    final String[] strs1 = {"345", "456"};    strs1 = strs0;    strs1[1] = "333";}

在上述代码中,第5行会报错:“The final local variable strs1 cannot be assigned”,而第6行没有问题。这是因为数组引用不可变,但数组内容是可以修改的。

另外,使用final修饰数组通常被认为是没有意义的,因为数组是不可变的。如果代码中使用final修饰数组,FindBugs插件会将其视为潜在错误。

final修饰方法参数的应用

final修饰方法参数也有一定的意义。例如:

public class Test {    public static void main(String[] args) {        FinalString fs = new FinalString("");        A(fs);    }    private static void A(final FinalString fs) {        fs.setStr("123");        FinalString fss = new FinalString("22");        fs = fss;    }}

在上述代码中,final修饰方法参数会导致fs变量的引用不可变,从而限制方法的行为。

总结

final修饰在Java中具有广泛的应用场景,它不仅影响变量的引用,还影响方法和类的行为。通过合理使用final修饰,可以提升代码的安全性和效率。

转载地址:http://ugnr.baihongyu.com/

你可能感兴趣的文章
OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
查看>>
OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
查看>>
OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
查看>>
OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
查看>>
OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
查看>>
OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
查看>>
OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
查看>>
OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
查看>>
oauth2.0协议介绍,核心概念和角色,工作流程,概念和用途
查看>>
OAuth2授权码模式详细流程(一)——站在OAuth2设计者的角度来理解code
查看>>
OAuth2:项目演示-模拟微信授权登录京东
查看>>
OA系统多少钱?OA办公系统中的价格选型
查看>>
OA系统选型:选择好的工作流引擎
查看>>
OA项目之我的会议(会议排座&送审)
查看>>
OA项目之我的会议(查询)
查看>>
Object c将一个double值转换为时间格式
查看>>
object detection训练自己数据
查看>>
object detection错误Message type "object_detection.protos.SsdFeatureExtractor" has no field named "bat
查看>>
object detection错误之Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
查看>>
object detection错误之no module named nets
查看>>