Java中的Final关键字用法汇总及简单示例

本文详细解析了final关键字在Java中的三种应用场景:数据、方法和类。通过具体的代码示例,介绍了final如何使数值或对象引用保持不变,如何防止方法被子类覆盖,以及如何声明不可被继承的类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可能使用到final的情况有3种:数据、方法和类。

一、final数据

对于基本类型,final使数值恒定不变;而对于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法把它改为指向另一个对象。然而,对象本身却是可以被修改的。

class Value{
    int i;
    public Value(int i){this.i=i;}
}

public class FinalData{
    private final int valueOne=1;
    private int valueTwo=2;
    private final Value v1=new Value(11);
    private Value v2=new Value(22);
    public static void main(String[] args){
        //! valueOne=3; 错误,静态不能更改
        valueTwo=3;   //可以更改

        //! v1=new Value(33); 不可更改引用
        v1.i+=1;      //可以更改内容

        v2=new Value(33);   //非final,可以更改引用
    }
}

注:带有恒定初始值(即,编译器常量)的final static 基本类型全用大写字母命名,并且字与字之间用下划线隔开。

public static final int VALUE_ONE=3;

必须在域的定义处或者每个构造器中用表达式对final进行赋值,这正是final域在使用前总是被初始化的原因所在。

二、final方法

使用final方法的原因是:把方法锁住,以防任何继承类修改它的含义,这是出于设计的考虑:想要确保在继承中使方法行为保持一致,并且不会被覆盖。
类中所有的private方法都隐式地指定为是final的。由于无法取用final方法,所以也就无法覆盖它。

class WithFinals{
    private final void f(){print("Hello World");}
    private void g(){ print("WithFinals.g()");}
}
class OverridingPrivate extends WithFinals{
    private final void f(){ print("OverridingPrivate.f()");}
    private void g(){ print("OverridingPrivate.g()")}
}
class OverridingPrivate2 extends OverridingPrivate{
    public final void f(){ print("OverrindingPrivate2.f()")}
    public void g(){ print("OverridingPrivate2.g()")}
}

public class FinalOverriding{
    public static void main(String[] args){
        OverridingPrivate2 op2=new OverridingPrivate2();
        op2.f();
        op2.g();
        //向上转型
        OverridingPrivate op1=op2;
        //但是你不能调用下面的方法
        //! op1.f();
        //! op1.g();
        //向上转型
        WithFinals wf=op2;
        //同样不能调用下面的方法
        //!wf.f();
        //!wf.g();
    }
}

/*
OverridingPrivate2.f()
OverridingPrivate2.g()
*/

“覆盖”只有在某方法是基类的接口的一部分时才会出现。即,必须能将一个对象向上转型为它的基本类型并调用相同的方法。如果某方法为private,它就不是基类的接口的一部分。它仅是一些隐藏于类中的程序代码,只不过是具有相同的名字。如果在导出类中以相同的名称生成一个public、protected或包访问权限方法,那么该方法并没有覆盖基类的方法,仅是生成了一个新的方法。

三、final类

当某个类的整体定义为final时,就表明了你不打算继承该类,而且也不允许别人这样做。

final class Demo{
    int i=1;
    final int j=2;
    void f(){}
}

final类不能被继承。final类的域可以根据个人意愿选择是或者不是final,然而,由于final类禁止继承,所以final类中的所有方法都隐式指定为final的,因为无法覆盖它们。在final类中可以给个方法添加final修饰词,但这不会增添任何意义。


PS:总结自《Thinking in Java Fourth Edition》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值