final关键字的使用

发布时间:2022-06-26 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了final关键字的使用脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

final关键字

目录
  • final关键字
    • 0、前言
    • 1、作用在类上
    • 2、作用在方法上
    • 3、作用在变量和成员属性上
      • 3.1、作用在变量上
      • 3.2、作用在成员变量上
        • 3.2.1、直接赋值
        • 3.2.2、静态初始化
        • 3.2.3、有参构造

0、前言

2021年1月3日15:03:29

1、final的使用,加在类上也是可以的;因为我们有时候自己写的不需要接下来的来进行自定义操作了!工具包中也可以这样子来进行实现;

2、变量命名的规范,但是如果在基础包中,我觉得不需要这么来进行命名对应的操作而已;

3、多看看别人的代码,学习使用别人的规范操作!我们只知道这样子来进行使用,而不知道为什么要来这样子来进行设计;

1、作用在类上

没有子类。具体实例:String类型

/**
 * @Description CollectionUtils源自于:org.springframework.util.CollectionUtils
 * @Author liguang
 * @Date 2022/01/03/23:37
 */
public final class CollectionUtil extends CollectionUtils {
}

这里可以自定义类,并用final关键字来进行属性!表示的是禁止有类来进行继承

2、作用在方法上

子类不可以重写,但是可以继承使用。

下面在学习模板模式的时候,需要使用到的一个功能:

抽象父类:

/**
 * @Description 游戏抽象父类
 * @Author liguang
 * @Date 2021/12/26/18:17
 */
public abstract class Game {

    private void login(){
        System.out.println("开始登录游戏...........");
    }

    /**
     * 钩子函数决定是否来切换模式
     */
    public abstract Boolean hook();

    /**
     * 有很多场景模式来进行切换
     */
    public abstract void switchModel();

    private void play(){
        System.out.println("开始来玩游戏...........");
    }

    private  void end(){
        System.out.println("游戏结束.............");
    }

    /**
     * 模板模式。加上final关键字,禁止子类重写方法
     * 这里已经定义好了流水线过程!只需要子类来按照具体的模式来进行书写即可
     */
    public final void startGame(){
        login();
        if (hook()){
            switchModel();
        }
        play();
        end();
    }
}

虽然说子类不可以来进行重写startGame方法,但是子类可以来访问startGame方法。

看几个子类:

/**
 * @Description 地下城游戏
 * @Author liguang
 * @Date 2021/12/26/18:23
 */
public class DXC extends Game{
    /**
     * 钩子函数,表示是否切换游戏模式
     * @return
     */
    @Override
    public Boolean hook() {
        return Boolean.FALSE;
    }

    @Override
    public void switchModel() {

    }
}
/**
 * @Description LOL游戏
 * @Author liguang
 * @Date 2021/12/26/18:22
 */
public class LOL extends Game{
    /**
     * 钩子函数,表示是否切换游戏模式
     * @return
     */
    @Override
    public Boolean hook() {
        return Boolean.FALSE;
    }

    @Override
    public void switchModel() {
        System.out.println("正常玩游戏............");
    }
}
/**
 * @Description 王者荣耀游戏
 * @Author liguang
 * @Date 2021/12/26/18:21
 */
public class WZRX extends Game{
    /**
     * 钩子函数,表示是否切换游戏模式
     * @return
     */
    @Override
    public Boolean hook() {
        return Boolean.TRUE;
    }

    @Override
    public void switchModel() {
        System.out.println("切换到娱乐模式......................");
    }
}

那么看看测试类:

    @Test
    public void testGetBeanForType() {
        final Map<String, Game> beanNameForValueMap = GlobalSpringApplicationContext.getBeanForType(Game.class);
        beanNameForValueMap.forEach((k,v)->{
            v.startGame();
            System.out.println("+++++++++++++++++++");
        });
    }

那么可以看到每个子类的输出:

开始登录游戏...........
开始来玩游戏...........
游戏结束.............
+++++++++++++++++++
开始登录游戏...........
开始来玩游戏...........
游戏结束.............
+++++++++++++++++++
开始登录游戏...........
切换到娱乐模式......................
开始来玩游戏...........
游戏结束.............
+++++++++++++++++++

定义了一套流水线工程,子类重写过程中只需要根据自己的需求来进行实现即可。

3、作用在变量和成员属性上

3.1、作用在变量上

    public void forEach(final Person person){
        // xxxxxxx
    }

禁止在方法体中操作的时候,改变了person的地址值。因为可能会存在着重新new一个Person类型对象的可能来进行覆盖person原有的值。这个源码中经常有。

3.2、作用在成员变量上

这个倒是在spring中经常可以看到

@Controller
@AllArgsConstructor
public class UserController {
    
    private final UserService userService;
}    

可以看到使用final修饰的成员变量,可以这么来写。具体的有三种使用方式

3.2.1、直接赋值

在后面直接进行赋值:

public class Animal {
    private  final String str = "hello";
}

一旦被修饰之后,对象的地址值无法进行修改,但是对象的属性值是可以改变的。

3.2.2、静态初始化

使用静态初始化

public class Animal {
    private static final String str;
    static {
        str = "";
    }
}

但是这种使用方式要求:成员变量要使用static+final关键字来进行修饰。

3.2.3、有参构造

使用有参构造方法进行注入:

public class Animal {
    private final String str;

    public Animal(String str) {
        this.str = str;
    }
}

可以看到这种使用方式,构造中必须要含有final修饰的成员变量的方法。可以看到final定义的变量必须要经过初始化之后才可以来进行使用。

所以这里印出来一个问题:

public class Animal {
    private  final String str = "hello";
    public Animal(String str) {
        this.str = str;
    }
}

看一下测试,最终的str到底是什么?但是发现,这样子来写,idea直接报编译时异常。

Cannot assign a value to final variable 'str'

说明了final修饰的成员变量直接进行赋值后,就不会参与构造了;但是没有进行赋值,那么就必须参数构造方法中来。

脚本宝典总结

以上是脚本宝典为你收集整理的final关键字的使用全部内容,希望文章能够帮你解决final关键字的使用所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: