有人能说明像Java或Groovy这样的语言被视为静态类型、动态类型或动态语言的概念吗?

有人能说明像Java或Groovy这样的语言被视为静态类型、动态类型或动态语言的概念吗?,java,groovy,Java,Groovy,我只是想弄清楚什么时候一种编程语言是静态或动态类型的,或者同时被认为是静态和动态语言,或者是动态和动态语言 我感到困惑的是,如果一种语言已知是静态类型的,而在Java的情况下,变量的类型是已知的或在编译时定义的 //Java illustration of statically typed int x, y; //explicit type declaration x = 5, y = 10; //Now we use the variables //Groovy illustrati

我只是想弄清楚什么时候一种编程语言是静态或动态类型的,或者同时被认为是静态和动态语言,或者是动态和动态语言

我感到困惑的是,如果一种语言已知是静态类型的,而在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 type declaration 
x = 1, y = 10 //now we use the variables

基于阅读各种在线源代码,它认为被认为是静态类型的语言列表不包括Groovy,而是java和C++。 另外,如果Groovy是一种动态语言(DL-DL的定义是一种在编译时很少进行检查或不进行检查的语言,而是在运行时进行检查)。这是否意味着Groovy也是一种动态类型化语言,因为对于被认为是动态类型化的变量,“是在运行时而不是编译时知道变量类型的时候”

如果Groovy是这样的话,那么上面关于Groovy是静态类型的代码说明与Groovy在运行时所做检查的定义相矛盾

这是否意味着java groovy和groovy都不是动态类型语言,因为直接使用变量将在java和groovy中引发编译器错误


如果我错了,请纠正我。请提供示例和代码说明

注意,在Java中,您必须告诉它变量的完整类型。”在你的例子中是int。你可以说“float”或“Map”或“MyClassWithALongName”


在Groovy中,您只说了“def”来表示存在变量,但没有告诉它内容类型。

静态和动态类型主要描述变量(以及函数参数和返回值)的类型。在许多静态类型语言中,必须声明变量的类型,以便编译器知道哪些操作是有效的,以及应该使用哪个重载版本的函数/运算符。一些现代静态类型语言(包括大多数函数式语言)具有类型推断,因此大多数情况下不必声明变量的类型。但是,变量必须仍然具有固定的类型。如果将不同类型的值赋给同一个变量,编译器将拒绝编译,或者只允许您执行所有变量共有的操作。真正的强类型语言不能有与类型相关的运行时故障

在动态类型语言中,变量只是一个名称。您可以将任何类型的值分配给任何变量,并且可以通过分配不同类型的值来更改类型。只能在执行语句时检查函数调用或变量操作的有效性。(您可以认为这是将Java中的每个变量声明为对象,并在使用时将它们转换为所需的类型。当然,编译器不会尝试确定转换是否成功,而是会插入转换检查,这可能会在运行时导致失败。)


动态语言通常意味着放松编译器检查的大部分内容(语法可能是唯一预先检查的内容)。这通常意味着变量的存在,甚至函数调用的有效性在必要时才会得到验证。他们通常使用动态类型,因为静态类型不利于放松。

我把它作为一个注释,但它被隐藏了一点

def不提供类型,它使用“Object”类型。就好像Java中定义的每个变量都被定义为一个对象。。。(因此Groovy中的def x=7与Java中的对象x=7完全相同,没有多少类型)

这些对象总是以两种语言显示其类型信息。这两项也相当:

Groovy: def x=5 assert(x == 5) x="Hey, I changed type!" assert(x == "Hey, I changed type!") Java: Object x=5 assert(x == 5); x="Hey, I--well I kinda changed my type!" assert(x.equals("Hey, I--well I kinda changed my type!")) Groovy: def x=5 断言(x==5) x=“嘿,我换了类型!” 断言(x==“嘿,我改变了类型!”) 爪哇: 对象x=5 断言(x==5); x=“嘿,我——我有点改变了我的类型!” 断言(x.equals(“嘿,我——我有点改变了我的类型!”) 最大的区别在于Java强制(在编译时)您只调用它认为您拥有的类类型上的已知方法。。在上面的例子中,.toString()和.equals()是唯一有用的方法。要做数学,你必须做如下的事情:

Object x=5; Object y=7; Object z=(int)x + (int) y; assert(z == 12); // I believe Integer z will automatically turn // to an int here, but this might not compile :) Object s="Hey, Wassup???"; Object s2=magic(s, "toLowerCase") assert(s2.equals("hey, wassup???")); 对象x=5; 对象y=7; 对象z=(int)x+(int)y; 断言(z==12); //我相信整数z会自动旋转 //此处为int,但可能无法编译:) 在Groovy中,该语言只是尝试无论如何调用该方法,在运行时要么成功,要么失败

这可以通过使用反射来模拟Java,您可以将所有内容类型化为“Object”(就像groovy的“def”)并编写一个反射实用程序来执行以下操作:

Object x=5; Object y=7; Object z=(int)x + (int) y; assert(z == 12); // I believe Integer z will automatically turn // to an int here, but this might not compile :) Object s="Hey, Wassup???"; Object s2=magic(s, "toLowerCase") assert(s2.equals("hey, wassup???")); objects s=“嘿,Wassup?”; 对象s2=魔术(s,“toLowerCase”) 断言(s2.equals(“嘿,wassup?”); Groovy只是隐藏了“魔力”


所以我不认为你可以说一种语言天生就比另一种更具动态性,尽管你可能会说使用反射使两种语言都具有动态性,你也可以说Groovy使用反射比java更多…

如何声明
def x;x=1
静态键入?没有提供类型信息。@DaveNewton-def是一个定义关键字,这意味着该变量类型在运行时可以是任何类型(Object、String、int等),但在一天结束时默认为a类型。如果变量被指定为def type,运行时将根据变量值解释变量类型。@Learner,“动态类型”和您刚才所说的区别是…?@Learner aaaa这是动态类型。但是不,
def
不是一种类型。它是任何类型的。任何东西如果值的类型可以更改,则它是动态类型的。Groovy2+添加了可选的静态类型检查,因此两者都是,但是示例y