Final

final关键字
一.Final 修饰成员变量的注意事项

final修饰成员变量,该成员变量必须在创建对象之前进行赋值,否则编译失败
final修饰成员变量,固定的不是成员变量拥有的默认值,如果固定的是默认值,那么将导致被final修饰的成员变量的值永远无法修改,只能是默认值,这也不符合语法规则
成员变量的赋值有三种实现方式:
定义成员变量的时候手动赋值
利用构造器对成员变量进行赋值
利用set函数进行赋值(也即利用一般的方法进行赋值)
4.被final修饰的成员变量,只能拥有3中所描述的赋值方法的1,2。

3为什么不行?

解释:如1所描述,被final修饰的成员变量必须在对象创建之前进行赋值,如果方法3可以,那么我们知道对象创建后,才能调用方法3,也就是说成员变量利用方法3进行赋值,会导致成员变量的赋值发生在对象创建之后

5.为什么被Final修饰的成员变量必须在对象创建之前进行赋值?

理解:

被final关键字修饰的东西有一个特点,那就是一旦被修饰,那么它的值也就终生不变,可见final关键字起到了固定的作用,既然起到固定那么,你就要提前告诉final固定的是谁,如果允许被final修饰的成员变量赋值发生在对象创建之后,那么对象创建完成后final固定的值还是未可知的

6.final修饰成员变量和final修饰局部变量的区别与联系:

1.被final修饰的成员变量与局部变量均具有:一旦赋值,该值就终身不变

2.被final修饰的成员变量必须要在创建对象之前进行赋值,否则会编译失败,

但是局部变量可以不赋值,但是没有被赋值的局部变量不能够被使用,一旦被使用就会编译失败

3.综上:一旦决定使用final关键字来修饰成员变量或者局部变量,一定要做到提前赋值

二.Final修饰成员方法:

1.final修饰成员方法,该成员方法就不能被子类重写,但是仍然可以被子类继承并可以通过子类对象调用该方法

三.Final修饰类

1.final修饰类,该类便不能被其他类继承,但是该类仍然能够创建对象,并且,可以利用该对象调用该类的成员变量或者成员方法

四.Final使用范围:

Final关键字可以修饰类,类的成员变量,类的成员方法,成员方法的局部变量,等等,

但是final关键字不能用来修饰构造方法:(原因)

理解:final修饰普通方法,将导致子类无法重写该方法,而构造方法本身就不能够被子类重写,故如果用final修饰,如同多此一举
————————————————
版权声明:本文为优快云博主「西城风雨楼」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/xichengfengyulou/article/details/81155290

### Java `final` 关键字的使用场景及意义 #### 1. **`final` 类** 当一个类被声明为 `final`,意味着该类不能再被其他类继承。这可以防止子类对父类的行为进行修改,从而提高代码的安全性[^2]。 ```java final class FinalClass { void display() { System.out.println("This is a final class."); } } // 下面的代码会报错:Cannot inherit from 'FinalClass' as it is declared 'final' // class SubClass extends FinalClass {} ``` #### 2. **`final` 方法** 如果一个方法被标记为 `final`,则它不能在任何子类中被重写(override)。这样可以确保某些核心功能不会因为派生类中的实现而发生意外更改。 ```java class BaseClass { final void show() { System.out.println("This method cannot be overridden."); } } class DerivedClass extends BaseClass { // 编译错误:cannot override the final method from BaseClass // void show() { ... } } ``` #### 3. **`final` 变量** 对于变量而言,`final` 的作用取决于它是基本数据类型还是引用数据类型: - 如果是基本数据类型,则一旦赋值后其值就不能再改变[^4]。 - 如果是引用数据类型,则对象的引用地址不能改变,但对象内部的状态仍然可能发生变化。 以下是具体示例: ```java public class FinalVariableExample { public static void main(String[] args) { final int number = 10; // 基本数据类型的 final 变量 // number = 20; // 错误:无法重新分配 final 变量 final StringBuilder sb = new StringBuilder("Initial"); // 引用类型的 final 变量 // sb = new StringBuilder("New"); // 错误:无法重新分配 final 引用 sb.append(" Value"); // 正确:可以通过引用修改对象状态 System.out.println(sb); // 输出: Initial Value } } ``` #### 4. **提升安全性和性能** 通过合理使用 `final`,开发者能够显著增强程序的安全性和可维护性。例如,在多线程环境中,`final` 能够帮助避免因共享资源引发的竞争条件问题[^1]。此外,编译器也可能利用 `final` 提供的信息来优化代码执行效率[^3]。 --- ### 总结 `final` 是一种重要的保护机制,适用于多种编程需求。无论是阻止继承、锁定方法定义还是固定变量值,它的存在都旨在增加代码的健壮性并减少潜在风险[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值