脚本宝典收集整理的这篇文章主要介绍了final关键字的使用,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
2021年1月3日15:03:29
1、final的使用,加在类上也是可以的;因为我们有时候自己写的不需要接下来的来进行自定义操作了!工具包中也可以这样子来进行实现;
2、变量命名的规范,但是如果在基础包中,我觉得不需要这么来进行命名对应的操作而已;
3、多看看别人的代码,学习使用别人的规范操作!我们只知道这样子来进行使用,而不知道为什么要来这样子来进行设计;
没有子类。具体实例:String类型
/**
* @Description CollectionUtils源自于:org.springframework.util.CollectionUtils
* @Author liguang
* @Date 2022/01/03/23:37
*/
public final class CollectionUtil extends CollectionUtils {
}
这里可以自定义类,并用final关键字来进行属性!表示的是禁止有类来进行继承
子类不可以重写,但是可以继承使用。
下面在学习模板模式的时候,需要使用到的一个功能:
抽象父类:
/**
* @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("+++++++++++++++++++");
});
}
那么可以看到每个子类的输出:
开始登录游戏...........
开始来玩游戏...........
游戏结束.............
+++++++++++++++++++
开始登录游戏...........
开始来玩游戏...........
游戏结束.............
+++++++++++++++++++
开始登录游戏...........
切换到娱乐模式......................
开始来玩游戏...........
游戏结束.............
+++++++++++++++++++
定义了一套流水线工程,子类重写过程中只需要根据自己的需求来进行实现即可。
public void forEach(final Person person){
// xxxxxxx
}
禁止在方法体中操作的时候,改变了person的地址值。因为可能会存在着重新new一个Person类型对象的可能来进行覆盖person原有的值。这个源码中经常有。
这个倒是在spring中经常可以看到
@Controller
@AllArgsConstructor
public class UserController {
private final UserService userService;
}
可以看到使用final修饰的成员变量,可以这么来写。具体的有三种使用方式
在后面直接进行赋值:
public class Animal {
private final String str = "hello";
}
一旦被修饰之后,对象的地址值无法进行修改,但是对象的属性值是可以改变的。
使用静态初始化
public class Animal {
private static final String str;
static {
str = "";
}
}
但是这种使用方式要求:成员变量要使用static+final关键字来进行修饰。
使用有参构造方法进行注入:
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,请注明来意。