面试必考之Final关键字在 Java 中的作用~小宝能否找到七龙珠
相信在无数经典动漫中,有一部动漫在很多80、90后心中的地位举重若轻,它承载了我们很多美好的童年回忆 ——《龙珠》。它的主人公孙悟空,为了将散落在世界各地的七颗珠子全部集齐,从此展开了的一场冒险之旅,这场冒险注定坎坷曲折、荡气回肠.....
📢 然而,在人生的道路上,有一些力量并非是你与生俱来的,除了自身的不断努力外,还需要借助那么一丢丢外力——世外高人和幸运之神,方能助你抵达成功彼岸!!!
让我们来看看小宝同学能否找到他的七龙珠呢? (一定要看到最后噢~~)
目录
1、小宝儿时崇拜的英雄
2、场景技术实现
2.1 最终效果图
2.2 奉上源码
2.2.1 幸运光环
2.2.2 路遇高人
2.2.3 龙珠等级
2.2.4 小宝能否拿到龙珠
3、回头看技术
3.1 Final的基础要点(你应该知道的)
3.2 Final的底层原理(面试加分项)
1、小宝儿时崇拜的英雄
小宝是一个90后,在儿时最喜欢看的动漫就是《龙珠》。其中的主人公孙悟空就是他一直崇拜的大英雄~~,想象着有一天自己也能像孙悟空一样降妖除魔快意江湖。
当小宝渐渐长大后,也想去外面的世界寻找属于自己的“龙珠”。
理想总是美好的,然而现实却是残酷的,需要碰到高人指点和幸运之神的光顾方可成功。那小宝能否取到龙珠呢?让我们拭目以待~~
2、场景技术实现
2.1 最终效果图
2.2 奉上源码
2.2.1 幸运光环
import java.util.Random;/ * 幸运之光 */public final class LuckHope { // 幸运比例-每个人的幸运星不一样 private final Float luckRate = new Random().nextFloat(); public final String getLuckName(String name) { return String.format("恭喜[%s]获得幸运之神[%s]眷顾,",name, ((int)(luckRate*100))+"%"); }}
2.2.2 路遇高人
import java.util.ArrayList;import java.util.List;import java.util.Random;/ * 路遇高人 */public class MeetMaster { // 遇到的高人的等级 private final Integer level = new Random().nextInt(7)+1; // 继承等级 public String getIntegrationLevel(List list) { StringBuilder builder = new StringBuilder(); String desc = ""; if (level >= 7) { desc = "完美"; return String.format("你的表现[%s], 龙珠已获取。",desc); } else if (level >= 6) { desc = "优秀"; } else if (level >= 5) { desc = "良好"; } else if (level >= 4) { desc = "及格"; } else if (level < 4) { desc = "今天不努力,明天卖红薯"; } List randomThreeInfoList = getRandomThreeInfoList(list, 7 - level); return String.format("你的表现[%s], 待修炼%s。",desc, randomThreeInfoList.toString()); } private static List getRandomThreeInfoList(List list, int level) { List olist = new ArrayList(); if (list.size() <= level) { return list; } else { Random random = new Random(); for (int i = 0; i < level; i++) { int intRandom = random.nextInt(list.size() - 1); olist.add(list.get(intRandom)); list.remove(list.get(intRandom)); } return olist; } }}
2.2.3 龙珠等级
import java.util.ArrayList;import java.util.List;/ * 龙珠等级 */public class DragonBallLevel extends MeetMaster{ public DragonBallLevel(String name) { this.name = name; } // 寻找找龙珠的人 private String name; // 每个人都是同等的7颗珠子 private final List dragonBall = new ArrayList(); private List getDragonBall() { dragonBall.add("一星龙");//宇宙终极邪恶力量 dragonBall.add("二星龙");//阴霾污染之龙 dragonBall.add("三星龙");//新星神龙的兄弟 dragonBall.add("四星龙"); //火之龙 dragonBall.add("五星龙");//狂暴龙 dragonBall.add("六星龙");//水和风之龙 dragonBall.add("七星龙");//拥有土的力量 return dragonBall; } public String getName() { return name; } public void setName(String name) { this.name = name; } / * 最后是否取到龙珠 */ public void msg(){ LuckHope luckHope = new LuckHope(); System.out.println(luckHope.getLuckName(getName())+getIntegrationLevel(getDragonBall())); }}
2.2.4 小宝能否拿到龙珠
/ * 寻找龙珠 */public class FindDragonBall { public static void main(String[] args) { for(int i = 0; i<100; i++) { new DragonBallLevel("小宝").msg(); } }}
3、回头看技术
Java中,Final的作用就是对所定义的类、方法或者属性的一种保护机制,避免被外界随意修改。
3.1 Final的基础要点(你应该知道的)
1) 可以用来修饰一个类,表明该类不允许被继承。
2)可以用来修饰一个方法,表明该方法不允许被重写,与abstract相互矛盾。
3)可以用来修饰一个局部变量或成员变量,可以在同一条语句中赋值,或在构造方法中赋值。
3.2 Final的底层原理(面试加分项)
1)final修饰变量时,变量会指向一块固定的内存, 而且内存中的值不能改变。
2)final修饰引用类型变量时, 指向一个也是固定对象地址, 这个地址不能被修改; 但是对象的数据值是可以被修改。
3)保证线程可见性:final原理对比volite关键字就会非常好理解,有一个写屏障。(面试加分项)
4)提升读取效率:final方法比非final方法要快,因为在编译的时候已经静态绑定了,jvm会提前缓 存好改变量,不需要在运行时再动态绑定。
5)Final变量可以安全的在多线程环境下进行共享,不需要额外的同步开销。
6)使用final关键字,JVM会对方法、变量及类进行优化。
在后面的章节,老王会进一步展开对Jvm运行机制的深入分析。
敬请期待,持续关注!