> 文档中心 > 面试必考之Final关键字在 Java 中的作用~小宝能否找到七龙珠

面试必考之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运行机制的深入分析。

敬请期待,持续关注!