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,原因有以下几点:

  1. 为了实现字符串常量池;
  2. 为了线程安全;
  3. 保证HashCode的一致可靠性。

String类不可变性主要体现在如下几点:

  • String类被final关键字修饰,因此不会有子类,也就是说没有子类可以继承改变String类里的方法;
  • String类的数据存储在字节数组byte[]中,而这个字节数组也是被final关键字修饰了,因此这保证了值得不变性;

这样设计的原因主要有以下几点:

  • 可以保证String对象的安全性,避免被篡改;
  • 保证哈希值不会频繁变更;
  • 可以实现字符串常量池等。
posted @   LilyFlower  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示