Java-final关键字

本文详细介绍了final关键字在Java中的应用,包括防止类继承、方法重写、属性修改以及常量设置,同时探讨了final修饰的限制和常见场景。

基本介绍

需要用到final的需求如下:

1)当不希望类被继承时,可以用final修饰类;

final class A {}

//class B extends A {} 错误,因为A类使用final修饰,B类无法继承A类

2)当不希望父类的某个方法被子类覆盖/重写时,可以用final修饰方法;

class A {

    public final void hi(){}
}



class B extends A {

    //public void hi(){}  错误,父类使用final修饰hi()方法,子类无法重写
}

3)当不希望类的某个属性的值被修改时,可以用final修饰属性;

public class Test {

    public static void main(String[] args){
        
        A a = new A();
        //a.TAX_RATE = 2;  错误,属性使用final修饰,无法再次对属性进行赋值

    }

}


class A {

    public final int TAX_RATE = 1;

}

4)当不希望某个局部变量被修改,可以使用final修饰局部变量;

class A {

    public void hi(){
        final double NUM = 0.01;
        //NUM = 0.09;  错误,局部变量被final修饰,无法进行再次赋值
    }

}

注意事项和使用细节

1)final修饰的属性又叫常量,一般采用XX_XX_XX来命名;

2)final修饰的属性在定义时,必须赋初始值,并且以后不能再修改,赋值可以在以下位置之一:

        ①定义时:如 public final double TAX_RATE = 0.01;

        ②在构造器中。

        ③在代码块中。

class A {
    /*
     *必须赋值,赋值的三种情况:
     * ①在定义时
     * ②在代码块中
     * ③在构造器中
     */
    
    public final double TAX_RATE = 0.01;
    
    public final double TAX_RATE2;//虽然初始化没有赋值,但是构造器中赋值了,可以通过

    public final double TAX_RATE3;//虽然初始化没有赋值,但是代码块中赋值了,可以通过

    public A(){
        TAX_RATE2 = 0.02;
    }

    {
        TAX_RATE3 = 0.03;
    }

}

      3)如果final修饰的属性是静态的,则初始化的位置只能是①定义时 ②在静态代码块中,不能在构造器中赋值;

class A {
    /*
     *必须赋值,赋值的两种情况:
     * ①在定义时
     * ②在代码块中
     */
    
    public static final double TAX_RATE = 11.11;
    
    public static final double TAX_RATE2;//初始化没有赋值,在静态代码块中赋值,可以通过

    //public static final double TAX_RATE3; 构造器中无法对被final修饰的静态常量进行赋值

    static {
        TAX_RATE2 = 22.22;
    }
    
    //public A(){  错误,构造器中无法对被final修饰的静态常量进行赋值
    //    TAX_RATE2 = 33.33;
    //}

}

4)final修饰的类不能被继承,但是可以实现实例化对象;

public class Test {

    public static void main(String[] args){
        
        A a = new A();

    }

}


final class A { }

5)如果类不是final修饰的,但是含有final修饰的方法,则该方法不能被重写,但是类可以被继承。

public class Test {

    public static void main(String[] args){
        
       new B().hi();

    }

}


class A {

    public final void hi(){
        System.out.println("A类的hi()方法被调用");
    }
}


class B extends A { }

6)一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法(已经不能被继承,就不可能被重写)

7)final不能修饰构造方法(即构造器);

8)final和static往往搭配使用,效率更高,不会导致类的加载,底层编译器做了优化处理;

package com.pero.final_;

public class FinalDetail {
    public static void main(String[] args) {
        System.out.println(Demo.i);//使用final修饰时,输出Demo.i不会执行static代码块;
        // 如果不使用final修饰,输出Demo.i时会执行static代码块
    }
}
class Demo{
    public final static int i = 16;
    static {
        System.out.println("Java课程学习");
    }
}

9)包装类(Integer、Double、Float、Boolean等都是final修饰的类),String也是final修饰的类。

### 关于 `final` 关键字的正确使用及常见错误代码分析 在 Java 中,`final` 是一个重要的关键字,用于定义不可更改的变量、方法或。以下是一个关于 `final` 的完整代码示例以及常见错误代码的分析和修正。 #### 错误代码分析修正 以下是用户提供的错误代码: ```java package Work03; public class Test { public static void main(String[] args) { } } class A { public static final int a; // 问题:静态常量未初始化 public A() { a = 10; // 问题:尝试在构造函数中为静态常量赋值 } } ``` 这段代码存在两个主要问题: 1. 静态常量 `a` 被声明为 `static final`,但没有在声明时直接初始化[^2]。 2. 在构造函数中尝试为 `static final` 变量赋值,这是非法操作,因为 `static` 变量属于而不是实例,而 `final` 变量只能被赋值一次[^3]。 #### 修改后的正确代码 以下是修正后的代码: ```java package Work03; public class Test { public static void main(String[] args) { System.out.println("Value of A.a: " + A.a); // 输出 A.a 的值 } } class A { public static final int a = 10; // 正确:在声明时直接初始化 public A() { // 构造函数中不再尝试为 static final 变量赋值 } } ``` #### `final` 关键字的使用示例 以下是 `final` 关键字在不同场景下的正确使用示例: 1. **修饰基本数据型变量** ```java final int num = 10; // 正确:num 被声明为常量 // num = 20; // 错误:不能重新赋值 ``` 2. **修饰引用型变量** ```java final StringBuilder sb = new StringBuilder("Hello"); // 正确:sb 引用不可更改 // sb = new StringBuilder("World"); // 错误:不能重新赋值 sb.append(" World"); // 正确:对象内容可以修改 ``` 3. **修饰方法** ```java class Parent { final void show() { System.out.println("Parent method"); } } class Child extends Parent { // @Override // void show() { // 错误:无法重写 final 方法 // System.out.println("Child method"); // } } ``` 4. **修饰** ```java final class FinalClass { // 的内容 } // class SubClass extends FinalClass { // 错误:final 不能被继承 // } ``` #### 注意事项 - 当 `final` 修饰基本数据型变量时,变量的值一旦被初始化后就不可更改[^2]。 - 当 `final` 修饰引用型变量时,变量的引用地址不可更改,但对象的内容仍然可以修改[^3]。 - `final` 修饰的方法不能被子重写[^2]。 - `final` 修饰的不能被继承[^4]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值