Java 是动态类型的语言吗?

2020-04-11 23:01:43 +08:00
 x97bgt

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

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

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

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

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

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

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

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

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

- “在编译后并不能完全确保变量的调用过程是安全的,在运行时还要再做检查”。 对的。
rogwan
2020-04-12 11:31:45 +08:00
@mxalbert1996 这样的动态抛出异常,其他的真动态语言也会呀。作者这样是拗概念,混淆常识。
mxalbert1996
2020-04-12 19:39:46 +08:00
@rogwan 作者想表达的就是 Java 会在运行时动态地做检查,这跟真动态语言有什么关系?不要因为你知识少或者阅读能力差就诽谤别人。
rogwan
2020-04-12 21:16:22 +08:00
@mxalbert1996 我回复是你 @我的内容,你连这点理解力都没有吗?你的学识有多高?智商几何?不秀一下也好意思人身攻击?你这素质脑内充屎呀
mxalbert1996
2020-04-12 21:37:08 +08:00
@rogwan 我的学识嘛,其他不敢说,至少比一个认为所有语言都是动态的人要高吧。
rogwan
2020-04-12 22:57:53 +08:00
@mxalbert1996 哈哈,你这个理解力还好意思人身攻击?贬低别人知识少?敢问你哪个学校毕业的呀? ACM 拿过几块牌呀?你这跑出来是秀智商还是秀脑残呀?
penguinWWY
2020-04-13 01:23:35 +08:00
动态是用来描述类型安全的,
意思是执行时提供类型信息,进行类型检查,同样的概念映射到 C++就是 RTTI,Run-Time Type Identification

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/661566

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX