final关键字的作用

1 简介

final:不可被改变。

序号修饰场景描述
1变量不可修改,一次性赋值
2方法不能被重写,一次性逻辑
3(1)不能被继承;
(2)引用地址不可变,内容可变

2 应用

2.1 final修饰变量

修饰成员变量时,一次性赋值,无法修改赋值。
这也要求,final修饰的成员变量需要赋初值。
二次赋值编译期报错,如下图:
在这里插入图片描述

测试代码:

package com.monkey.java_study.datastructure;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * final关键字测试.
 *
 * @author xindaqi
 * @date 2022-05-05 12:03
 */
public class FinalTypeTest {

    private static final Logger logger = LoggerFactory.getLogger(FinalTypeTest.class);

    // final 引用类型或者基础类型:不可变更
    private final String name = "xiaohua";

    // final 引用类型或者基础类型:不可变更
    private final int age = 10;

    public static void main(String[] args) {
        FinalTypeTest finalTypeTest = new FinalTypeTest();
        logger.info(">>>>>>>>>>Name:{}, age:{}", finalTypeTest.name, finalTypeTest.age);

        // final 引用类型或者基础类型:赋值后,不可变更(只能一次赋值)
        finalTypeTest.name = "xiaolan";
        finalTypeTest.age = 10;
    }
}

2.2 final修改方法

final修饰的方法无法被重写,
表明方法也是一次性逻辑,无法再同一套JVM中二次修改,
重写final修饰的方法编译期报错,如下图:
在这里插入图片描述
测试代码:

package com.monkey.java_study.datastructure;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * final关键字测试.
 *
 * @author xindaqi
 * @date 2022-05-05 12:03
 */
public class FinalTypeTest {

    private static final Logger logger = LoggerFactory.getLogger(FinalTypeTest.class);

    static class User {
        private String name;

        public User(String name) {
            this.name = name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public final void finalMethod() {

        }

        public void normalMethod() {

        }
        
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }

    static class Customer extends User {

        private String name;

        public Customer(String name) {
            super(name);
        }

        // final修饰的方法:无法被重写
        @Override
        public void finalMethod() {

        }

        @Override
        public void normalMethod() {

        }

    }

    public static void main(String[] args) {
    }
}

2.3 final修饰类

final修饰类有两种用法:
(1)实例化类;
(2)定义类;

2.3.1 实例化类

实例化类时,使用final关键字,无法改变该类的指向,即引用地址无法变更,
变更引用地址编译期报错,如下图:
在这里插入图片描述

package com.monkey.java_study.datastructure;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * final关键字测试.
 *
 * @author xindaqi
 * @date 2022-05-05 12:03
 */
public class FinalTypeTest {

    static class User {
        private String name;

        public User(String name) {
            this.name = name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }

   
    public static void main(String[] args) {

        // final类:引用的地址不可变,对象内容可变
        final User user = new User("xiaohua");
        logger.info(">>>>>>>>>初始化:{}", user.getName());
        user.setName("xiaolan");
        logger.info(">>>>>>>>>初始化:{}", user.getName());

        // final类:引用的地址不可变,对象内容可变
        user = new User("xiaolan");
    }
}

2.3.2 定义类

定义类时,使用final关键字,该类无法被继承,
继承编译期报错,如下图:
在这里插入图片描述

package com.monkey.java_study.datastructure;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * final关键字测试.
 *
 * @author xindaqi
 * @date 2022-05-05 12:03
 */
public class FinalTypeTest {

    private static final Logger logger = LoggerFactory.getLogger(FinalTypeTest.class);

    static final class UserFinal {
        private String age;
        // setter/getter is omitted.
    }

    // final修饰的类:无法被继承
    static class Person extends UserFinal {

    }

    public static void main(String[] args) {
      
        // final类:引用的地址不可变,对象内容可变
        user = new User("xiaolan");
    }
}

3 小结

final关键字:一次性成型,无法编辑。
(1)提高性能;
(2)多线程共享,无需额外同步开销;
(3)JVM对final有优化;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值