Java中的final修饰符用法大全

本文详细解析了final关键字在Java中的各种用途,包括修饰类、成员变量、静态变量等,并探讨了其对继承和方法覆盖的影响。

一,final修饰类
fianl修饰符如果修饰类的话就代表该类不可以被继承,即不允许被继承;

public final class NoExtends{}

如此,NoExtends类就不可以被继承了,即下面的代码就会报错

public calss ExtendsTest extends NoExtends{} //这是不可以的

由于NoExtends类有了final的修饰而无法被调用。类似的比如Java中的String类也是final修饰的,也即String类不允许被继承不允许扩展其方法或属性。

二,final修饰成员变量
final修饰成员变量之后就意味着该成员变量不能够被修改,由于外界无法修改该成员变量的值,故而其创建时就需要被赋值或者在其构造方法处赋值。如果final变量没有被赋值则会报错,且只能赋值一次。

private final int FinalPara = 5;

三,final修饰静态变量

private final static double Final_Para_Static = 6.6;
// TODO 或者也可以在static代码块儿内赋值
//static{
// Final_Para_Static = 6.6;
//}

对于控制可见性的修饰符诸如private,protected,public都是在类,属性,方法最前的位置,而在用final时是在这些修饰符之后的第二个位置。

四,final不能用来修饰构造方法
构造方法的名字与类的名字是一样的,构造方法与别的方法不一样,其不存在覆盖的可能,且子类也没有去覆盖构造方法的诉求。

五,final用来修饰方法
修饰方法之后该方法无法被子类覆盖

public final void describe(){
System.out.println("这是一个final修饰的方法哦~不能被覆盖");
}

那么上述在父类中的行为方法就无法在子类中覆盖了,尽管它是public,尽管子类继承了父类。
比如下面的子类中的代码就会报错

public void describe(){
System.out.println("子类覆盖了父类的方法吗?");
super.describe();
}

六,final修饰形式参数
如果用final修饰了形式参数,那么形式参数在被实际参数赋值之后,就不能再被赋值了

private double buy(final int count){}

七,final修饰局部变量
final也可以修饰局部变量,当然也是必须赋值且只能赋值一次

八,final修饰引用
这是个重头戏:引用被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。
即虽然我们的这个应用不能再指向其它的对象了,但是该引用指向的这个对象的内容仍然是可以被修改的。比如下面的代码,

public void describe(){
System.out.println(setname);
}
FinalObj.describe();
FinalObj.setName("变化该对象的名字");
FinalObj.describe();

这样的话describe方法中对于setname的描述还是会变化的。

九,final修饰数组
其实final对于数组的修饰跟final对于引用的修饰是有点儿类似的,对于被final修饰的数组而言,不能让这个数组指向别的数组,但是是可以修改这个数组中的元素的值的。

### Javafinal修饰符用法和作用 在Java中,`final`是一个重要的修饰符,可以用于修饰变量、方法和类。以下是对其具体用法和作用的详细说明。 #### 1. final修饰变量 当`final`修饰一个变量时,表示该变量一旦被初始化后,其值不能被修改。根据变量类型的差异,`final`的行为有所不同: - **基本类型变量**:`final`修饰的基本类型变量在初始化后,其值不可更改。例如: ```java final int number = 10; // number = 20; // ❌ 编译错误:无法为final变量重新赋值 [^1] ``` - **引用类型变量**:`final`修饰的引用类型变量表示该引用本身不可改变,但对象的内容仍然可以改变。例如: ```java final StringBuilder sb = new StringBuilder("Hello"); sb.append(" World"); // ✅ 允许修改对象内容 [^2] // sb = new StringBuilder("Java"); // ❌ 编译错误:无法重新分配final变量 [^2] ``` #### 2. final修饰方法 当`final`修饰一个方法时,表示该方法不能被子类重写。这通常用于确保某些关键行为不会被意外或有意地改变。例如: ```java class Parent { public final void sayHello() { System.out.println("Hello from Parent"); } } class Child extends Parent { // ❌ 编译错误:不能重写final方法 // public void sayHello() { } } ``` #### 3. final修饰类 当`final`修饰一个类时,表示该类不能被继承。这种设计通常用于保护类的完整性和安全性,防止其被恶意扩展。例如: ```java final class FinalClass { public void display() { System.out.println("This is a final class"); } } // ❌ 编译错误:不能继承final类 [^1] // class SubClass extends FinalClass { } ``` #### 4. 编译时常量与运行时常量的区别 - **编译时常量**:如果一个`final`变量是基本数据类型或`String`类型,并且在声明时就被初始化,则它被视为编译时常量。编译器会在编译时将该常量的值直接嵌入到使用它的代码中。例如: ```java final int CONSTANT = 108; System.out.println((new StringBuilder("Constant = ")).append(CONSTANT).toString()); // 等价于:System.out.println((new StringBuilder("Constant = ")).append(108).toString()); [^3] ``` - **运行时常量**:如果`final`变量是在运行时才被初始化,则它被视为运行时常量,编译器不会对其进行替换。例如: ```java final int runtimeConstant; runtimeConstant = 42; // 在构造函数或其他初始化块中赋值 System.out.println(runtimeConstant); // 运行时计算值 ``` ### 示例代码 以下是一个综合示例,展示了`final`修饰符在不同场景下的用法: ```java // final修饰类 final class FinalClass { public void show() { System.out.println("Final Class Method"); } } // final修饰方法 class Base { public final void greet() { System.out.println("Hello from Base"); } } // final修饰变量 public class FinalExample { public static void main(String[] args) { // final修饰基本类型变量 final int age = 25; System.out.println("Age: " + age); // final修饰引用类型变量 final StringBuilder name = new StringBuilder("Alice"); name.append(" Johnson"); // ✅ 允许修改对象内容 System.out.println("Name: " + name.toString()); // ❌ 不允许重新分配final变量 // name = new StringBuilder("Bob"); // 使用final修饰的方法 Base base = new Base(); base.greet(); // 输出:Hello from Base // ❌ 不能继承final类 // class Derived extends FinalClass {} } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值