Java 是一种动态编程语言吗?

Is Java a dynamic programming language?

动态编程语言的定义是"These languages are those which perform multiple general behaviours at run-time in contrary to static programming languages which do the same at compile time. It can be by addition of new code, by extending objects and definitions"。

据我所知,许多编程语言都以 Java 等包或 C++ 等头文件的形式进行封装。因此,作为程序员,我将编写的代码肯定会在编译时扩展,并最终转换为汇编代码,最后转换为机器代码。那么是不是每种高级语言都变得动态了?

一般来说,可以通过类型系统来区分静态和动态编程语言。在动态类型系统中你可以有以下

var x = 2
x = "c"

意思是,给定变量的类型可能会在其生命周期内发生变化。静态类型系统不允许这样做。 C# dynamic 数据类型是此功能的一个示例。

注意不要将动态与推断或弱类型系统混淆。推断类型系统不需要变量的正式声明,但会根据分配的值推断类型。它不允许用不同的类型重新声明变量。

var x = 2  // the type of x is int
x = "C"  // compile error: incompatible types!

弱类型系统允许与声明的变量类型不兼容的操作。 C 允许将指针转换为任何类型:

foo(void *ptr) {
  char *str;
  strcpy(str, (char *)ptr);
  int i = &(int *)ptr + 1;
}

类型系统的所有组合都存在,有时使用相同的编程语言:static/dynamic、隐式(推断)/显式、weak/strong。