java-final关键字的使用

本文详细解析了final关键字在Java中的使用,包括修饰类、方法及变量的不同应用场景与限制条件。

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

一、final关键字修饰类

final关键字可以修饰一般类,但是不能修饰抽象类和接口;其中被final修饰的类不可被继承。

//错误案例,下面这个在类验证阶段就会出错
public final class Father {

}
class Son extends Father{

}
//final不能修饰抽象类、编译时报错
public final abstract class FinalAbstractClassTest {
}

//final不能修饰接口、编译时报错
public final interface FinalAbstractClassTest {
}

二、final修饰方法

被final修饰的方法不能被子类覆写,否则会编译出错

//Man覆写了父类的被final修饰的方法,编译时报错
public class Human {
    public final void sayHello(){

    }
}
class Man extends Human{
    @Override
    public  final void sayHello(){

    }
}

final不能修饰抽象类的抽象方法和接口中的方法

//错误案例final不能修饰接口中的方法
public  interface FinalAbstractClassTest {
    public final void sayHello();
}
//错误案例:final不能修饰抽象方法
public  abstract  class FinalAbstractClassTest {
    public final abstract void sayHello(){}
}

一、final修饰变量

final 关键字修饰成员变量

被final修饰的成员变量要么我们显示的为该变量初始化值,或者用构造器方法进行初始化,否则会出错;而且一旦赋值,变不能再修改值或者是引用(不能有setters方法)。

//正确方式一
public class FinalClass {
    public final int a;

    public FinalClass(int a) {
        this.a = a;
    }
}
//正确方式二
public class FinalClass {
    public final int a = 1;

    public FinalClass() {        
    }
}
//错误的是final修饰的成员变量不能有setter方法
public class FinalClass {
    public final int a;

    public FinalClass(int a) {
        this.a = a;
    }
    //错误原因是不能被改变
    public void setA(int a){
        this.a = a;
    }
}
final修饰一般变量

如果final修饰的是基本类型的变量,那么一旦复制,就不能再更改值,如果final修饰的是引用变量,那么一旦指明变量的引用地址,就不能再更改。

//错误案例:不能修改被final修饰的基本变量变量    
public class FinalClass {
    public static void main(String[] args) {
        final int i = 1;
        i++;//    

    }
}
//错误案例:不能将final修饰的引用变量重新指向新的对象
public class FinalClass {
    public static void main(String[] args) {

        final Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        map = new HashMap<Integer, Integer>();//错误

    }
}

/*正确案例:被final修饰的变量只是不能被修改引用指向其他新的地址,
 **       但是可以改变引用对象中属性的值(前提是这个属性不是final修饰的)
 */
public class FinalClass {
    public static void main(String[] args) {
        final Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for(int i = 0;i<3;i++){
            map.put(i,i);
        }

    }
}

总结:

  • final修饰类:final关键字可以修饰一般类,但是不能修饰抽象类和接口;而且被final修饰的类不可被继承
  • final修饰方法:被final修饰的方法不能被子类覆写,否则会编译出错;final不能修饰抽象类的抽象方法和接口中的方法
  • final修饰成员变量:被final修饰的成员变量要么我们显示的为该变量初始化值,或者用构造器方法进行初始化,否则会出错;而且一旦赋值,变不能再修改值或者是引用(不能有setters方法)
  • final修饰一般变量:如果final修饰的是基本类型的变量,那么一旦复制,就不能再更改值,如果final修饰的是引用变量,那么一旦指明变量的引用地址,就不能再更改;但是我们可以更改引用对象的成员变量非final的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值