Java final关键字
Java final关键字
final 关键字定义的变量
被final关键字修饰的变量是无法被允许更改的,也就是说,final变量一旦被初始化就无法再修改。例如:
final int num=22;
num=23; //error: Cannot assign a value to final variable 'num'
同样的,如果创建了一个使用final关键字修饰的实例,也是不允许被修改的。例如:
class People{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Demo {
public static void main(String[] args) {
final People people=new People();
people=new People(); //error:Cannot assign a value to final variable 'people'
}
}
除此之外,将final关键字和static关键字组合在一起修饰的变量叫常量,常量名字必须全部大写,例如:
private static final int SCORE_NUM = -1;
有时候,final关键字也用来修饰参数,这意味着参数在方法体内不允许被修改,例如:
public static void eating(final String oldFoodName,String newFoodName){
oldFoodName = newFoodName; //error:Cannot assign a value to final variable 'oldFoodName'
}
final关键字定义的方法
被final修饰的方法不允许被重写,因此我们在设计某一个类不允许被它的子类重写,我们可以使用final关键字来限定,例如:
public class Demo {
public static final String eating(String oldFoodName){
return oldFoodName;
}
}
class SubDemo extends Demo{
@Override
public static final String eating(String oldFoodName){ //error:'eating(String)' cannot override 'eating(String)' in 'com.mitu.pojo.Demo'; overridden method is final
return oldFoodName;
}
}
final关键字定义的类
如果一个类使用了final关键字来修饰,则这个类无法被继承,例如:
public final class Demo {}
class SubDemo extends Demo{} //error:Cannot inherit from final 'com.mitu.pojo.Demo'
在java中,有很多我们熟知的类就是使用final关键字来修饰的,例如String类(部分代码)如下:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
@Stable
private final byte[] value;
private final byte coder;
private int hash;
}
String类之所以被修饰成final,原因有以下几点:
- 为了实现字符串常量池;
- 为了线程安全;
- 保证HashCode的一致可靠性。
String类不可变性主要体现在如下几点:
- String类被final关键字修饰,因此不会有子类,也就是说没有子类可以继承改变String类里的方法;
- String类的数据存储在字节数组byte[]中,而这个字节数组也是被final关键字修饰了,因此这保证了值得不变性;
这样设计的原因主要有以下几点:
- 可以保证String对象的安全性,避免被篡改;
- 保证哈希值不会频繁变更;
- 可以实现字符串常量池等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构