精华内容
下载资源
问答
  • 判断分数是否为无限循环小数

    万次阅读 2018-06-12 22:42:12
    0.前言 之前做编程题,有一个部分需要... 将分数化为最简分数后,分母全部因数(除去1和其自身)没有为2或5以外数,则该分数就不是无限循环小数;否则为无限循环小数。 首先我们看 1/n实际含义:将 1 分...

    0.前言

    之前做编程题,有一个部分需要判断一个分数是否为无限循环小数,挺有意思,特此整理记录如下:

    问题描述(大概意思是)
    已知分子a和分母b ,判断 分数a/b是否为无限循环小数

    1.已知结论

    将分数化为最简分数后,分母的全部因数(除去1和其自身)没有为2或5以外的数,则该分数就不是无限循环小数;否则为无限循环小数。

    首先我们看 1/n的实际含义:将 1 分成n份,每一份的大小

    那么10/n的实际含义:将 10 分成n份,每一份的大小

    对于将 10 分成n份这个话题,如果假设每份必须为整数,那么n的取值(去掉1或者10),只能是2或5

    最简分数是否为无限循环小数,与分子没有关系。

    2.问题解决

    2.1求分子分母的最大公约数

    此处可用辗转相除法求最大公约数

    2.2 判断最简分数的分母的因子

    此处可直接将分母分别整除以多次2和5即可

    3.代码实现

    import java.util.Scanner;
    /**
     * @Title:InfiniteLoop.java
     * @author Stone6762
     * @CreationTime 2018年6月12日 下午10:18:39
     * @Description: 判断一个分数是否为无限循环小数
     */
    public class InfiniteLoop {
    
        /**
         * @Title greatestCommonDivisor
         * @Describe求最大公约数
         * @param a
         * @param b
         * @return
         */
        public static long greatestCommonDivisor(long a, long b) {
            long c = 0;
            while (true) {// 循环的辗转相除法
                c = a % b;
                a = b;
                b = c;
                if (b == 0) {
                    return a;
                }
            }
        }
    
        /**
         * @Title isLoop
         * @Describe a/b是否为无限循环小数
         * @param a分子
         * @param b分母
         * @return
         */
        public static boolean isLoop(long a, long b) {
            // 1.化简,分子分母同时除以最大公约数
            long commonDivisor = greatestCommonDivisor(a, b);
            b = b / commonDivisor;
            // 2.判断分母是否为2的次幂,5的次幂,或者2 5结合
            // 首先让其除以2的次幂
            while (b % 2 == 0) {
                b /= 2;
            }
            // 然后让其除以5的次幂
            while (b % 5 == 0) {
                b /= 5;
            }
            // 最后判断是否为1,如果为1 说明没有 2或者5或者2和5结合构成 以外的因子
            if (b == 1) {
                return false;
            } else {
                return true;
            }
        }
    
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            while (scan.hasNext()) {
                int a = scan.nextInt();
                int b = scan.nextInt();
                System.out.println( a+"/"+b+"的结果是否为无限循环小数:   " + isLoop(a, b));
            }
        }
    }

    展开全文
  • 这里的 e 是数学常数,自然对数的底数,无限不循环小数。这道题的意思是:找到 e 中最先出现的 10 位质数,可得出一个网址。进入网址后会看到 Google 为你出的第二道数学题。成功解锁这两步,你才可能成为和 Googl.....

    内容选自《程序员的数学基础课》

    2004 年,在硅谷的交通动脉 101 公路上出现了一块巨大的广告牌,上面是道数学题: { e 的连续数字中最先出现的 10 位质数 }.com。这里的 e 是数学常数,自然对数的底数,无限不循环小数。

    这道题的意思是:找到 e 中最先出现的 10 位质数,可得出一个网址。进入网址后会看到 Google 为你出的第二道数学题。成功解锁这两步,你才可能成为和 Google “志同道合”的人,并得到下一步提示:发个简历吧,我们一起来做点改变世界的事情。

    \"\"

    其实,不止是 Google,很多大公司在招人时都会优先考虑数学专业的毕业生,因为,数学基础好,编程就更容易上手。但还是陆续有人问我:数学学得不好,能当程序员吗?

    当程序员是没问题啊,但我觉得问题的关键在于:你想成为一个怎样的程序员。

    如果你只想做一个纯粹的代码搬运工,工作中的大部分时间除了 CRUD,就是处理各类字符串、链表、Hash 表,那么高中甚至初中数学就足够了。

    但只要你想「再往上走一步」,成为资深开发工程师、做一些有“技术含量”的事情,学好数学是必不可少的。

    这一点,做算法和人工智能的朋友应该深有体会。所以说,数学基础的好坏,会直接决定一个程序员的发展潜力。

    往大了说,数学是一种思维模式,考验的是归纳、总结和抽象的能力,在程序员的世界就是解决问题的能力;往小了说,无论是数据结构与算法,还是程序设计,其底层原理和思路都源自数学。在大数据和智能化的时代,学好数学更是门槛本身。

    我们都知道数学对于编程开发的重要性,但是,要把这门学了十几年的课程重新拾起,确实是要“耗点功夫”的。而一个好老师可以将复杂的问题简单化,把晦涩的知识点讲得通俗易懂,黄申就是这样一个人。

    关于黄申:
    →  LinkedIn 资深数据科学家和微软学者,IBM ExtremeBlue 天才计划成员。
    → 长期专注于大数据相关的搜索、推荐、自然语言处理、广告以及用户精准化领域;
    → 在微软亚洲研究院、IBM 美国研究院、eBay 中国、1 号店和大润发飞牛网都曾担任要职,带队完成了若干个公司级的战略项目;
    → 著有 20 多篇国际论文和 10 多项国际专利;

    这种资历的人开专栏讲课,说真的,挺难得。另外,《趣谈网络协议》的刘超老师讲的一段话也让我印象深刻。

    \"\"

    正如刘超所说,如果通过一门课程就能把自己在计算机领域的数学功底给打扎实,那么无疑这笔投资是值得的。

    这个专栏,我没记错的话,是去年 12 月上线的,到现在也就 3 个多月 的时间,已经有超过 1.7W 人订阅了,截了点评价给你们参考:

    \"\"

    说实话,数学厉害的人我见了不少,但读了几篇黄申在极客时间的专栏《程序员的数学基础课》,还很想推荐给大家。

    这个专栏非常适合想扎实打下数学基础的程序员和准程序员,专栏中的学习路径既能让你巩固基础知识,又可以深入理解这些内容对计算机编程和算法究竟意味着什么。跟着好好学吧,错不了。

    \"\"

    彩蛋:
    之前看到黄申还写过一篇「程序员的数学书单」
    可以作为本专栏的“辅食”,一起服用,风味更佳。

    展开全文
  • e是一个无限不循环小数,其值约等于2.718281828…,它是一个超越数,有时也称为欧拉数(Euler’s Number)。 以e为底对数称为自然对数(Natural Logarithm),数学中使用自然这个词还有自然数(Natural Number)...

    一、e为何物?

    • e是一个无限不循环小数,其值约等于2.718281828…,它是一个超越数,有时也称为欧拉数(Euler’s Number)。
    • 以e为底的对数称为自然对数(Natural Logarithm),数学中使用自然这个词的还有自然数(Natural Number)。
    • 这里的“自然”并不是现代人所习惯的“大自然”,而是有点儿“天然存在,非人为”的意思。

    二、利息与e的关系

    • limn+(1+1n)n=e\displaystyle \lim\limits_{n \rightarrow +\infty} (1+\frac{1}{n})^n=e

    1、利息问题

    假设你在银行存了1元钱,且银行存款利率达到了100%。问:如果银行每天都给你发利息,并且你把每天获得的利息做复利,经过一年后,你会多富有?

    2、计算利息

    • 先算一下一年发一次利息的情况
      (1+11)1=2\displaystyle(1+\frac{1}{1})^1=2元,即一年后你有2元钱。
    • 再来算一下一年发两次利息并采用复利的情况
      (1+12)2=2.25\displaystyle(1+\frac{1}{2})^2=2.25
    • 最后算银行每天都发利息并采用复利的情况
    • (1+1365)365=2.718281828\displaystyle(1+\frac{1}{365})^{365}=2.718281828

    如果银行每分每秒都在付利息,我们也每分每秒复利,1年之后,我们的财富实际上是接近于e的,即2.718281828。

    • (1+1n)ne\displaystyle(1+\frac{1}{n})^n\rightarrow e
      在这里插入图片描述
    • (ex)=ex(e^x)'=e^x,自然指数函数求导之后是它本身,在极坐标的图像是螺旋线
      在这里插入图片描述

    3、欣赏螺旋线

    (1)螺旋线概述

    • 螺旋线属于空间曲线,它有圆柱螺旋线,圆锥螺旋线等多种形式。在建筑与机械工程中最常用的是圆柱螺旋线。
    • 数学中有各式各样富含诗意的曲线,螺旋线就是其中比较特别的一类。螺旋线这个名词来源于希腊文,它的原意是“旋卷”或“缠卷”。例如,平面螺旋便是以一个固定点开始向外逐圈旋绕而形成的曲线。
    • 在2000多年以前,古希腊数学家阿基米德就对螺旋线进行了研究。著名数学家笛卡尔于1638年首先描述了对数螺旋线,并且列出了螺旋线的解析式。更有趣的是瑞士数学家雅谷·伯努利,在逝世前请人在他的墓碑上刻了一条蜗牛屋形——对数螺旋线,并幽默地写上“我将按着原来的样子变化后复活”的墓志铭。

    (2)绘制螺旋线

    • 绘制阿基米德螺线 - 极坐标方程:r=a+bθr=a+bθ
      在这里插入图片描述
    # -*- coding: utf-8 -*-
    """
    Created on Thu Oct 29 16:34:56 2020
    
    @author: howard
    
    绘制阿基米德螺线
    极坐标方程:r = a + bθ
    """
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    θ = np.linspace(0, 8 * np.pi, 1000)
    r = 3 + 4 * θ
    
    x = r * np.cos(θ)
    y = r * np.sin(θ)
    
    plt.plot(x, y)
    
    • 绘制费马螺线 - 极坐标方程:r=θr=\sqrt{θ}
      在这里插入图片描述
    # -*- coding: utf-8 -*-
    """
    Created on Thu Oct 29 16:41:12 2020
    
    @author: howard
    
    绘制费马螺线
    极坐标方程:r = θ ^ 0.5
    """
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    θ = np.linspace(0, 8 * np.pi, 1000)
    r = np.sqrt(θ)
    
    x = r * np.cos(θ)
    y = r * np.sin(θ)
    
    plt.plot(x, y, 'r')
    
    • 绘制等角螺线 - 极坐标方程:r=abθr=ab^θ
      在这里插入图片描述
    # -*- coding: utf-8 -*-
    """
    Created on Thu Oct 29 16:47:26 2020
    
    @author: howard
    
    绘制等角螺线
    """
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    θ = np.linspace(0, 8 * np.pi, 1000)
    r = 3 * np.power(2, θ)
    
    x = r * np.cos(θ)
    y = r * np.sin(θ)
    
    plt.plot(x, y, 'r')
    
    • 绘制双曲螺线 - 极坐标方程:r=cθr=\displaystyle\frac{c}{θ}
      在这里插入图片描述
    # -*- coding: utf-8 -*-
    """
    Created on Thu Oct 29 16:54:19 2020
    
    @author: howard
    
    绘制双曲螺线
    """
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    θ = np.linspace(np.pi, 8 * np.pi, 1000)
    r = 3 / θ
    
    x = r * np.cos(θ)
    y = r * np.sin(θ)
    
    plt.plot(x, y, 'r')
    
    • 绘制圆内螺线 - 参数方程:{x=cosθ+cosnθny=sinθsinnθn\begin{cases} \displaystyle x=\mathrm{cos}θ+\frac{\mathrm{cos}nθ}{n} \\ \displaystyle y=\mathrm{sin}θ-\frac{\mathrm{sin}nθ}{n} \\ \end{cases}
      在这里插入图片描述
    # -*- coding: utf-8 -*-
    """
    Created on Thu Oct 29 17:09:33 2020
    
    @author: howard
    
    绘制圆内螺线
    """
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    θ = np.linspace(0, 2 * np.pi, 1000)
    
    for n in [3, 6, 9]:
        x = np.cos(θ) + np.cos(n * θ) / n
        y = np.sin(θ) - np.sin(n * θ) / n
        plt.plot(x, y, label='n='+str(n))
    plt.legend()
    
    • 绘制连锁螺线 - 极坐标方程:r=kθr=\displaystyle\sqrt{\frac{k}{θ}}
      在这里插入图片描述
    # -*- coding: utf-8 -*-
    """
    Created on Thu Oct 29 17:20:37 2020
    
    @author: howard
    
    绘制连锁螺线
    """
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    θ = np.linspace(0.1, 8 * np.pi, 1000)
    
    for k in [3, 6, 9]:
        r = np.sqrt(k / θ)
        x = r * np.cos(θ)
        y = r * np.sin(θ)
        plt.plot(x, y, label='k='+str(k))
    plt.legend()
    

    三、e和π

    e和圆周率π都是超越数,π的含义可以通过下图的割圆术来很形象的理解。假设等边形的对角线长为1,只要等边形的边足够多,算出来的周长就可以越来越接近圆周率π。
    在这里插入图片描述
    多边形的边数和利滚利的次数是相似的。

    对角线为1的n边等边形,n趋于无穷,周长就无限接近于π,即π是周长的最大值。
    年利率为1(100%)的1元存款,利滚利的次数n趋于无穷,存款就无限接近e,即e是存款的最大值。

    换种表述方法:
    每个完美的圆,其周长都是π的倍数;
    每个理想的存款,其余额都是e的倍数。

    这里停一停,你好好体会一下。

    按照自然的观点,如果圆是最美的,那最赚钱也是最理想的。

    • 利用正方形绘制圆
      在这里插入图片描述
    # -*- coding: utf-8 -*-
    """
    Created on Thu Oct 29 17:32:52 2020
    
    @author: howard
    
    利用正方形绘制圆
    """
    
    import turtle
    
    window = turtle.Screen() 
    window.bgcolor('yellow')
    
    red_turtle= turtle.Turtle()
    red_turtle.shape('turtle')
    red_turtle.color('red')
    red_turtle.speed(5)
    
    for i in range(120):  
    	red_turtle.forward(100)
    	red_turtle.right(90)
    	red_turtle.forward(100)
    	red_turtle.right(90)
    	red_turtle.forward(100)
    	red_turtle.right(90)
    	red_turtle.forward(100)
    	red_turtle.right(93)
    
    window.exitonclick()
    

    四、e的应用

    • 对数中最常用的底数是10、2和e

    1、为什么要以10为底数?

    因为我们使用1010进制,数量级和科学计数法也是1010的倍数,例如阿伏伽德罗常数6.02×10236.02\times10^{23} 。所以10x10^x的逆运算,以1010为底的对数 lgx\mathrm{lg}x 最常用、最方便,所以又称常用对数。

    1010进制是数字表示法中最容易普及的,根源是我们有1010个手指,人们初学数字时都喜欢借助1010个手指学习123101、2、3……10。到了学加减运算时,更是喜欢借助手指计算。不仅老师认为这样教学直观,学生也认为这样练习方便。通过教育,这个强大的习惯,被最广泛的传播和固化下来。但如果是88个腕足的章鱼发展出了文明,可能更喜欢88进制。

    2、为什么要以2为底数?

    因为22倍或成倍式的增长,即2x2^x ,是我们日常中最简单的指数式增长。我们经常说数量成倍、翻倍、翻番、翻两番,都是22倍率的增长。

    你可能也发现了,前面的存款例子实际上都是2x2^x,因为这样的例子最容易理解。所以2x2^x的逆运算,底数为2的对数 log2x\mathrm{log_2}x 也会比较常见。

    虽然对数的底数221010是人们使用体验和认知体验最好的对数,但是在数学中,这两个数却是不自然的,因为都是在方便人的需要。

    3、为什么e被称为自然对数的底数?

    ee做底数的对数表达方式是lnx\mathrm{ln}x。按照古希腊哲学家的自然思想,自然是指万物的内在规律,就像自然数一样,是事物本身的属性,不以人的喜好而变化。

    前面在讲“利息中的ee”时,曾拿ππee做过对比。

    • 边数越多越接近圆,利滚利越多越接近最大收益
    • 一个对角线为11的多边形,其周长最大值是ππ
    • 一个本金为11利率为11的存款,其存款余额的最大值是ee

    按照古希腊的自然思想来看:对于一个完美的圆来说,ππ才是自然的,是圆本身的属性,尽管从数值上是一个“无理”的数。对于最快速的指数增长来说,ee才是自然的,这是指数增长本身的属性。

    而科学家们也发现,在做数学分析时,用ee做底数的对数 lnx\mathrm{ln}x 做计算,其形式是最简约的,用其他对数例如 lgx\mathrm{lg}x 做计算,都会画蛇添足的多一些麻烦。

    lnx\mathrm{ln}x 就像美学上的“增之一分则太长,减之一分则太短”。

    对数学家来说,最简就是最美。这是一种纯理性的美,通过感官是无法欣赏的,只有熟悉数学的人才能深刻的感受到。这种美令无数数学家为之痴迷,虽然不会像毕达哥拉斯那样狂热,但也终其一生孜孜以求。

    五、对数发明史

    16世纪和17世纪之交,天文学家第谷和开普勒通过大量的观测,绘制了当时最精确的星图,解决了天文学家天文数据精度不足的难题。有了高精度的星图,全欧洲的数学家开始了天体轨道的计算竞赛,很多科学家也因此获得了商业和学术上的丰厚回报。那时的天文学家、数学家可不是像现代这么冷门,更像当今那些IT、金融等热门行业里的精英一样,享受着人人羡慕的不菲高薪。

    即使这样,要想预测天体的运行,其计算也是极其繁琐和浩瀚的,在解决计算问题时,数学家们发明了大量崭新的数学理论和计算工具,包括对数、解析几何、微积分和牛顿力学等伟大的创新。可以说天文学是当时科学界最闪亮的宝石,是当时的高科技热门产业。

    其中,对数的发明人就是约翰·纳皮尔。纳皮尔是天文学家、数学家,在计算轨道数据时,也被浩瀚的计算量所折磨。

    “看起来在数学实践中,最麻烦的莫过于大数字的乘法、除法、开平方和开立方,计算起来特别费事又伤脑筋,于是我开始构思有什么巧妙好用的方法可以解决这些问题。”——约翰·纳皮尔,《奇妙的对数表的描述》(1614)
    在这里插入图片描述
    但纳皮尔不是一般人,不想像IT民工一样苦逼的重复劳动,于是用了20年的时间,进行了数百万次的计算,发明了对数和对数表,堪称学霸中的战斗机。

    为了理解对数计算的优势,我们通过案例来说明,下面的表格里有两个数列:

    等差数列 1 2 3 4 5 6 7 8 9 10
    等比数列 2 4 8 16 32 64 128 256 512 1024
    • 要计算第22行的等比数列中任意两个数的乘积,例如16×6416\times64
    • 先到第11行的等差数列,寻找对应的数,1616对应446464对应66
    • 然后做加法,4+6=104+6=10 ,再查找1010所对应等比数列的10241024

    借助这个表,仅靠心算就可以用的加法,完成麻烦的16×6416\times64乘法。

    同样也可以进行除法变减法的运算。

    以上仅仅是对数的优点之一,对数的易于计算,大大减少了数学家、天文学家的计算量。

    • 拉普拉斯认为“对数的发现,以其节省劳力而延长了天文学家的寿命”
    • 伽利略说过“给我空间、时间及对数,我就可以创造一个宇宙。”

    六、微积分中的e

    在微积分中,底数为ee的指数函数exe^x ,其导数还是这个函数exe^x,也就是不论求多少次导数,其导数就像一个常量一样永远是恒定的。是不是很神奇呢~
    在这里插入图片描述
    根据微积分里极限的相关定义,当uu趋近于00时,(1+1u)ue\displaystyle(1+\frac{1}{u})^u\rightarrow e

    七、e的几何解释

    1、exe^x 在直角坐标系中的样子

    在这里插入图片描述

    2、exe^x 在极坐标系中的样子

    • 把指数函数 exe^x 换成极坐标,就变成了eθe^θθθ是点与极轴的夹角。这时的指数函数就会变成下图的样子,这个螺线叫对数螺线(Logarithmic Spiral),又叫等角螺线。之所以叫等角螺线,是因为在极坐标中,螺线和射线的夹角始终是一个固定夹角。
      在这里插入图片描述
    • 现实生活中的示例
      在这里插入图片描述
    • 很多科学家发现对数螺线eθe^θ在自然界中广泛存在。从大如星系、台风,到小如花朵、海螺……宇宙中到处都是对数螺线eθe^θ的身影
      在这里插入图片描述

    八、为什么自然界中存在这么多对数螺线

    因为对数螺线具有等角性,受环境影响,很多直线运动会转变为等角螺线运动。

    我们以飞蛾扑火为例,亿万年来,夜晚活动的蛾子等昆虫都是靠月光和星光来导航,因为天体距离很远,这些光都是平行光,可以作为参照来做直线飞行。如下图所示,注意蛾子只要按照固定夹角飞行,就可以飞成直线,这样飞才最节省能量。
    在这里插入图片描述
    但自从人类学会了使用火,这些人造光源因为很近,光线成中心放射线状,可怜的蛾子就开始倒霉了。

    在这里插入图片描述

    九、e的趣闻

    20042004GoogleGoogle公司IPOIPO上市,创始人Larry Page和Sergey Brin决定上市融资总额为27182818282718281828美元,也就是ee的前1010位数字。因为他们都精通数学,很喜欢ee的自然之美,当然也希望公司能像 exe^x 一样实现指数型高速增长。

    GoogleGoogle其实是GoogolGoogol的错误拼写,GoogolGoogol代表1010010^{100}这样的天文数字,实现这样大的数看来也只能靠exe^{x} 进行指数增长了。

    十、追求自然美

    古希腊的学者还给“自然”赋予美的含义,他们认为规律性就是一种和谐感,数学的比例是种超越肉体感官、只能靠心智才能领悟到的美。毕达哥拉斯就是其中最极端的代表,他对数学美的狂热追求超过了偏执的程度,美像神一样不可冒犯,毕达哥拉斯主义走向了科学的反面,成了宗教。

    这种宗教的狂热驱动他和信徒们不断的去挖掘“自然”之美,并在数学之外的音乐、建筑、雕刻、绘画等领域发现了大量的比例关系,最有名的是毕达哥拉斯定理(中国叫勾股定理)。毕达哥拉斯认为所有图形中,圆是最对称的,所以圆是最完美的图形。

    古希腊时代是一个科学、哲学大爆炸的时代,原本黑暗的天空中突然爆发出无数的新星:赫拉克利特、毕达哥拉斯、德谟克利特、苏格拉底、柏拉图、亚里士多德、阿基米德、欧几里得、希波克拉底等等,都因为得益于这套思维方法,发现了大量的自然规律,成为各学科领域里开天辟地的先贤。

    自然数中的“自然”:古希腊认为像1、2、3这样的数,是事物本身就有的属性,可以用来描述日常事物的数量和顺序,无需过多解释,就是3岁小孩也能快速理解,所以这些数被称为自然数(Natural Number)。

    但这种朴素的自然观限制了数的范围,无法解释0,负数、分数、小数等数。古希腊人认为这些数并不自然,是人为了计算而发明出来的,不是自然的数。

    毕达哥拉斯就非常厌恶无理数,无理数的不规律破坏了和谐美。他的门生希帕索斯Hippasus就是因为发现了2的开方并公布出去,居然被毕达哥拉斯以渎神的罪名被淹死了,这被称为数学史上的第一次数学危机。后人认为毕达哥拉斯也发现了黄金分割率,但因为也是无理数,所以一直秘而不宣。

    现代我们知道,没有受过基础数学教育的人要想理解这些数,不仅需要了解更复杂的概念模型,还要熟悉加、减、乘、除等运算方法,只有这样才能完全明白。而更复杂的数,例如无理数、代数数和超越数,也需要了解更复杂的运算。

    我们的主角e,就是超越数,既然理解e的含义需要理解相关的运算,而这些运算最早都和利息有关。

    展开全文
  • Java基础之Final关键字

    2018-01-18 10:49:52
    举一个最简单的栗子:π是一个无限不循环小数,但当我们精确取值时它的值就确定不会改变了。  大多数初学者在阅读代码时经常会发现static和final的连用而混淆了两者:static 字面上的意思就是静态,所谓静态就是...

    简述

            Final是Java中的一个关键字,通常是用来形容此变量或者引用是无法改变的。举一个最简单的栗子:π是一个无限不循环的小数,但当我们精确取值时它的值就确定不会改变了。
            大多数初学者在阅读代码时经常会发现static和final的连用而混淆了两者:static 字面上的意思就是静态,所谓静态就是当这个java文件被加载的时候,被static修饰的内容都会被编译并存储在一个固定的地方。我们可以通过类名. 的形式直接调用该内容。 final 字面上的意思是最后、最终,所以final修饰的内容更多的是强调不变性。
            Final关键字可以修饰变量、方法、类,接下来我会一一列举,如有不足之处或者错误之处,请大家多多包涵也欢迎大家的斧正。

    Final修饰变量

            首先我们应该先搞清楚变量分为哪几种,在这儿我主要是根据变量所在的位置分类的。
    public class Example {
    	public final int globalVariationFirst = 0;
    	public final int globalVariationSecond;
    	public final Book globalReferenceVariation;
    
    	public Example(int globalVariationSecond, Book globalReferenceVariation) {
    		this.globalVariationSecond = globalVariationSecond;
    		this.globalReferenceVariation = globalReferenceVariation;
    	}
    
    	public static void main(String[] args) {
    		final int localVariationFirst = 0;
    		final int localVariationSecond;
    		localVariationSecond = 1;
    
    		System.out.println(localVariationFirst);
    		System.out.println(localVariationSecond);
    	}
    }

    1. 当final修饰基本数据类型时则表示该内容无法被更改。
    2. 当final修饰引用数据类型时则表示该引用无法更改指向,但其内容还是可以更改的。
    3. final也可以修饰数组,但其意义与2相同暨该变量只能指向该数组,而数组的内容仍可改变。

            Final还有一个比较重要的地方叫空白final,空白final是指在变量声明的时候可以不直接将其初始化。空白final大体有两种用法,第一种就是final的全局变量可以在构造方法中初始化。第二种就是final的局部变量可以在使用之前初始化。

    Final修饰方法

    Final修饰方法大体上有两个原因:1. 锁定方法,被修饰的方法无法被继承但可以被调用。2. 提高调用效率,被修饰的方法被调用的时候,编译器会采用内嵌式调用。

    Final和private:有很多人会疑问如果final和private功能相同是否可以相互取代。其实其差别就在于父类中final的方法可以被调用,但无法被重写。而private的方法则无法被调用,即在子类不继承此方法。

    Final修饰类

    Final修饰的类是不允许被继承的。通常来讲final的类中的方法都会隐式的被声明为final的。

    总结

    其实final说的通俗点,我的理解就是断子绝孙者,无论其形容什么都是最后的。不会被更改,不会被重写,不会被继承。不论那种形式都无法被传承的感觉。



    展开全文

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

无限不循环小数的意思