final关键字的使用

final从字面上理解含义为“最后的,最终的”。在Java中也同样表示出此种含义。
final可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。

1、final修饰变量

当final修饰基本数据类型时,该变量就成为了常量,值无法改变;当final修饰引用数据类型时,该变量的值不能改变,即值中存储的对象内存地址值不变,该变量不能再去指向别的对象,但是对象内的成员可以改变。如下的程序示范了final修饰基本数据类型和引用数据类型的使用。

public class Person {
    static String name = "王五";
    int age = 20;
    String country = "中国";

    public void setAge(int age) {
        this.age = age;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}
public class FinalTest {

    final static int number = 100;

    public static void main(String[] args) {
        // 下面的注释去掉后编译出错,final修饰的变量number无法再次赋值
        // FinalTest.number=200;
        final Person p1 = new Person();
        Person p2 = new Person();

        // 下面的注释去掉后编译出错,final修饰的变量p1无法再次赋值
        // p1=p2;
        p1.setCountry("Chinese");
        p1.setAge(18);

        System.out.println("p1.age的值为:" + p1.age);
        System.out.println("p1.country的值为:" + p1.country);

    }

}

FinalTest类定义了final修饰的基本数据类型的变量number的值为100,因此后面的程序无法更改它的值;随后FinalTest类用final来修饰Person类的对象p1,该变量为引用数据类型,无法更改该变量的值,即不能再将它指向另一个对象,因此语句“p1=p2;”会报错,因为无法将final修饰的对象p1指向另一个对象p2,但是不能改变的仅仅是变量p1中的引用值,对象内部还可以改变,本例程就通过Person的方法重新设置了Person类中变量age和country的值。
当final修饰变量时,由于在第一次赋值之后就无法改变,因此它的初始化就很重要,一般而言,我们对final变量的初始化可以在声明变量时、在类中的构造方法、在静态代码块中赋值。

2、final修饰方法

一个类中的方法如果被final关键字修饰,则其子类无法重写该方法,只能被子类继承。如果父类中的某个方法不想被其子类所覆写,可将该方法定义为final类型。另外,父类中的私有方法(即被private关键字修饰的方法)也不允许被子类所覆写,所以父类中被private关键字修饰的方法默认为final类型。

 public class A {
      public final void f1(){
         System.out.println("Hello World");
     }   
}

public class B extends A{
    //下面这行会报错Cannot override the final method from A
    public void  f1() {
        System.out.println("你好");
    }
}

3、final修饰类

final修饰类即表示此类已经是“最后的、最终的”含义。因此,用final修饰的类不能被覆盖,即不能拥有自己的子类。

public final class A {
}
//下面这行会报错The type B cannot subclass the final class A
public class B extends A{
}
### Java `final` 关键字使用场景 #### 局部变量 当声明一个局部变量为 `final` 时,意味着该变量一旦被赋值则不能再更改其值。这有助于提高代码的安全性和可读性。 ```java public void exampleMethod() { final int number = 10; System.out.println(number); } ``` 在此例子中,尝试再次给 `number` 赋予新值将会导致编译错误[^4]。 #### 实例变量 如果将实例变量定义为 `final`,那么这个成员变量必须在构造器内初始化,并且之后不允许再改变它的值。这种方式常用来创建不可变对象,从而增强程序的安全性。 ```java public class Person { private final String name; public Person(String name) { this.name = name; } // Getter method omitted... } ``` 这里展示了如何利用构造函数来设置 `name` 的初始值并确保后续无法对其进行修改。 #### 静态变量 (类变量) 对于静态字段而言,加上 `final` 后同样代表只读属性;不过需要注意的是这类变量在整个应用程序生命周期里都保持不变,通常用于定义常量。 ```java public class Constants { public static final double PI = 3.141592653589793; } ``` 上述代码片段表明了怎样通过 `static final` 组合形式设定全局性的固定数值。 除了以上提到的情况外,还可以用 `final` 来限定方法和类的行为: - **Final 方法**: 当某个方法被标记成 `final` 后,则任何子类都不能覆盖此方法。 - **Final 类**: 如果某类本身也被指定为 `final` ,这意味着其他类不能从此类派生新的子类。 这些特性共同促进了面向对象编程原则下的封装机制,提高了系统的稳定性和可靠性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值