静态类型化和动态类型化在堆栈溢出(例如 )上被反复询问。
协商一致意见似乎是(引用上述链接的最高答复):
如果在编译时知道变量的类型,则会静态地输入语言。
一种动态的语言:
如果类型与运行时值相关联,而不是命名变量/字段/等,则该语言是动态键入的。
Perl似乎是静态类型的(或其他静态/动态类型的常见定义)。它有3种类型:标量、数组、散列(为了简单起见忽略引用之类的东西)。类型与变量一起声明:
my $x = 10; # declares a scalar variable named x
my @y = (1, 2, 3);
我只是想弄清楚什么时候是静态或动态类型的编程语言,或者同时是静态类型和动态类型的语言,还是动态类型和动态类型的语言。
我感到困惑的是,如果已知一种语言是静态类型的,而变量的类型是已知的或在编译时定义的,在Java的情况下,即
//Java illustration of statically typed
int x, y; //explicit type declaration
x = 5, y = 10; //Now we use the variables
//Groovy illustration of statically typed
def x, y //explicit
我了解到,由于Java是静态类型语言,所以每个变量都有静态类型和动态类型。
然而,关于变量是静态变量还是动态变量的讨论几乎总是在引用变量的上下文中进行,而不是在原始变量的上下文中,因此我对是否可以在涉及原始变量时使用“静态类型”和“动态类型”这两个术语犹豫不决(也许是因为它在试图谈论静态和动态类型的原语时没有太多内容,因为它们将是相同的,但是当一个人谈到引用变量时,这些术语的使用就会因为多态性而卓有成效)。
例如,如果我们有类A继承了类B并编写了B b = new A();,那么b的静态/编译时类型是B,但是它的动态/运行时类型是A。
我想知道,如果我们以int num = 5;为例,那么可