V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
x97bgt
V2EX  ›  问与答

Java 是动态类型的语言吗?

  •  
  •   x97bgt · 2020-04-11 23:01:43 +08:00 · 1911 次点击
    这是一个创建于 435 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看《深入理解 Java 虚拟机》,看到这么一句

    Screen Shot 2020-04-11 at 22.40.36.jpg

    Java 不是在编译时就会检查类型吗?这个静态语言和动态语言的定义分别是啥?

    19 条回复    2020-04-13 01:23:35 +08:00
    kop1989
        1
    kop1989   2020-04-11 23:14:52 +08:00
    “动态”的“类型安全语言”。
    majiaxin110
        2
    majiaxin110   2020-04-11 23:16:03 +08:00
    我怀疑这个动态指的并不是动态类型,我只知道 JVM 对动态类型语言有一些支持,坐等 JVM 大佬来解答
    keepeye
        3
    keepeye   2020-04-11 23:18:33 +08:00
    只知道强类型弱类型,不懂啥叫动态类型
    x97bgt
        4
    x97bgt   2020-04-11 23:31:28 +08:00 via iPhone
    @kop1989 「“动态”的类型安全」这句话应该咋解释?我理解成“运行时再检查类型”,这样不是跟“动态语言”的定义一样。
    x97bgt
        5
    x97bgt   2020-04-11 23:33:11 +08:00 via iPhone
    @keepeye 静态语言是编译时检查类型,动态语言是运行时检查类型。
    mxalbert1996
        6
    mxalbert1996   2020-04-11 23:40:16 +08:00 via Android
    所以这段话从第一句后半开始不是都在解释为什么说它是动态的吗
    liangdu
        7
    liangdu   2020-04-12 00:31:43 +08:00 via Android
    静态语言,编译器时就可以确定类型。

    我们从 jvm 的字节码可以通过 fieldInfo 表中的 classInfo 索引确定 java 类成员的具体类型,所以很肯定的说 java 是一门静态语言。

    “动态”的类型安全语言,是对虚拟机的实现的要求。类型安全是指,语义安全(这个我不懂)和安全访问非堆内存(不越界之类的)。动态的类型安全语言区别于静态的类型安全,在于要求 jvm 的运行时不停的做这个“类型安全监测”。

    明白这一点,我们就知道 jvm 实现要求真高(如果减少安全检测 jvm 应该可以提速),这是“动态的类型安全语言”的性质之一。

    其实是“动态的类型安全语言”,对内存访问是有做安全检测的,所以,可以看得出 java 是一门严谨的语言。
    araaaa
        8
    araaaa   2020-04-12 01:27:48 +08:00 via iPhone
    更像是对解释型语言描述,javac 编译出的 class 本质是中间代码
    rogwan
        9
    rogwan   2020-04-12 05:36:20 +08:00 via iPhone
    Java 是动态的类型安全语言

    难道不是作者搞错了?按作者这样理解,那还有什么语言算静态,不全是动态吗?
    Cbdy
        10
    Cbdy   2020-04-12 08:07:55 +08:00 via Android
    2020 年了,那个语言没点静态检查能力?没点动态内省能力?
    x97bgt
        11
    x97bgt   2020-04-12 09:32:14 +08:00 via iPhone
    @liangdu “动态类型“和“动态的类型安全”实际上是两个概念?静态类型在编译后并不能完全确保变量的调用过程是安全的,在运行时还要再做检查?这个意思吗?
    mxalbert1996
        12
    mxalbert1996   2020-04-12 11:10:00 +08:00 via Android
    @rogwan 比如 C/C++ 就是静态的,你在 C/C++ 里越界访问数组或者访问空指针的时候直接就 segfault 了,也就是系统会直接杀掉你的程序,你对此没有任何办法。但在 Java 里 JVM 会先检查你访问的地址合不合法,如果不合法的话会抛出异常,你可以 catch 这个异常然后继续运行程序。
    liangdu
        13
    liangdu   2020-04-12 11:13:04 +08:00 via Android   ❤️ 1
    @x97bgt
    - 是两种概念。

    - 其实和“是否为静态类型”没有关系,只是告诉你 JVM 实现有这么一个特点。

    - “在编译后并不能完全确保变量的调用过程是安全的,在运行时还要再做检查”。 对的。
    rogwan
        14
    rogwan   2020-04-12 11:31:45 +08:00 via iPhone
    @mxalbert1996 这样的动态抛出异常,其他的真动态语言也会呀。作者这样是拗概念,混淆常识。
    mxalbert1996
        15
    mxalbert1996   2020-04-12 19:39:46 +08:00 via Android
    @rogwan 作者想表达的就是 Java 会在运行时动态地做检查,这跟真动态语言有什么关系?不要因为你知识少或者阅读能力差就诽谤别人。
    rogwan
        16
    rogwan   2020-04-12 21:16:22 +08:00
    @mxalbert1996 我回复是你 @我的内容,你连这点理解力都没有吗?你的学识有多高?智商几何?不秀一下也好意思人身攻击?你这素质脑内充屎呀
    mxalbert1996
        17
    mxalbert1996   2020-04-12 21:37:08 +08:00 via Android
    @rogwan 我的学识嘛,其他不敢说,至少比一个认为所有语言都是动态的人要高吧。
    rogwan
        18
    rogwan   2020-04-12 22:57:53 +08:00
    @mxalbert1996 哈哈,你这个理解力还好意思人身攻击?贬低别人知识少?敢问你哪个学校毕业的呀? ACM 拿过几块牌呀?你这跑出来是秀智商还是秀脑残呀?
    penguinWWY
        19
    penguinWWY   2020-04-13 01:23:35 +08:00
    动态是用来描述类型安全的,
    意思是执行时提供类型信息,进行类型检查,同样的概念映射到 C++就是 RTTI,Run-Time Type Identification
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1560 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:19 · PVG 08:19 · LAX 17:19 · JFK 20:19
    ♥ Do have faith in what you're doing.