强类型语言
强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了,也就是说语言内部不允许隐式的类型转换。所以也无法处理两种不同类型相加的情况,比如说让Python运行下面代码会报错一样:
a=10
b='abcd'
print(a+b)
其实在定义变量时,python虽然没有像c语言或者java一样提前定义好数据类型,但是python会默认10是int类型,1.11是float类型,'abcd’是str类型,实际上是python在背后做了变量的类型规定,在执行期间不会做隐式类型转换,所以Python是一门强类型的语言。
弱类型语言
数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。比如使用vbscript执行以下代码:
var result=5+5; //two numbers
alert(result); //outputs "10"
var result=5+'5'; // a number and a string
alert(result); //outputs "55"
上述代码在vbscript里面并不会出错,反而会把5+'5'
计算成55。所以在使用弱类型语言的时候要格外小心数据类型出错。所以可以看到vbscript是弱类型语言。
静态语言
与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++、C#。比如说C语言里面的结构体,不可能在运行阶段加入新的属性。而Python的对象就可以,具体看下面C语言例子:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct Student{
char name[10];
char id[20];
int age;
};
int main()
{
struct Student carson;
cin>>carson.name>>carson.id>>carson.age;
cout<<carson.name<<"\n";
cout<<carson.id<<"\n";
cout<<carson.age<<"\n";
//编译下面这句的时候会报错
//char carson.class_=4
//cout<<carson.class_<<"\n";
return 0;
}
在char carson.class_=4
这句编译会报错,而且CodeBlocks报错的信息也很有意思:
编译器发现不能通过静态语言测试,说明C语言只允许静态语言的语法。
动态语言
动态语言是一类在运行时可以改变其结构的语言,例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。比如以下Python程序:
class Dynamic():
def __init__(self,name,sex):
self.name=name
self.sex=sex
if __name__=="__main__":
a=Dynamic("carson","male")
a.age=19
print(a.name)
print(a.sex)
print(a.age)
输出:
carson
male
19
可以看到Python可以在对象中动态添加新的属性,而C语言的结构体不能这样做,所以Python是动态语言,C语言是静态语言。
静态类型语言
静态类型语言的数据类型是在编译期进行检查的,也就是说变量在使用前要声明变量的数据类型,这样的好处是把类型检查放在编译期,提前检查可能出现的类型错误,典型代表C/C++和Java。
动态类型语言
动态类型语言在运行期进行类型检查的语言,也就是在编写代码的时候可以不指定变量的数据类型,比如Python和Ruby。
结论
所以经过分析我们大致上可以这样判断:
Python属于强类型语言、动态语言、动态类型语言。
Java属于强类型语言、静态语言、静态类型语言。