笼统的类型处理
通常来说,根据数据类型可以将编程语言分为两类:
强类型语言
- 强类型语言(Strongly typed language)不仅强制要求事先声明变量,还要求声明每个变量的数据类型,这样编译器就能准确地知道这个变量中的值的类型。强类型语言在数据类型上要求很严格:必须事先说明变量中存放的数据的类型,而在程序的代码中不将其他类型的数据存放到变量中。若将某个变量声明为数字,那么编辑器就认为存放的是一个数字;若违反了这个规定 ,比如将日期存放在这个变量中,比那机器就会报错。
弱类型语言
- 在弱类型语言(loosely typed language)中,无需事先声明变量的数据类型。但存放在变量的数据类型依然是个需要注意的问题(不能要求计算机2 + banana),但弱数据类型不会在这个问题上斤斤计较。通常,在弱类型语言中都无法声明数据类型,而强类型语言则强制要求声明每个变量的数据类型
编译型语言
- 编译型语言通常都是强类型的,但也确实存在介于两者之间的语言。用编译型语言编写的代码预先由编译器处理,生成一个经过优化的二进制可执行文件————例如EXE文件。脚本语言事先不会被编译,而是在运行时编译。
编译型语言流程
编译型更
接近
机器底层,此基础的上层语言Java,C#
,更强大更灵活
- 在普通文本中编写代码
- 将代码编译成可执行文件
- 执行编译好的可执行文件
- 程序运行
脚本型语言
- 脚本语言通常都是弱类型的, 其中运行时引擎(runtime engine)会在运行时解释代码,而不是事先编译
脚本型语言流程
脚本型更
脱离
机器底层,注重宿主业务php
,python
也更上层更高级
- 在普通文本中编写代码
- 执行脚本文件(hashbang)
- 脚本运行时引擎在程序运行时编译代码
- 程序运行
由于代码实在程序运行时才编译,所以编译器会检查变量存放的数据和操作合理的猜测其数据类型(2 + "2"),进行隐式转换
因此准寻变量用途唯一原则,避免隐式转换
隐藏转换仅会发生在表达式,不会改变原引用的类型
Dim strFirst,lngSecond
strFirst=CStr(50)
lngSecond=CLng(100)
result=strFirst+lngSecond
Msgbox result
' 两个变量都是字符串子类型,会将进行字符串连接
' 其中有一个式数字子类型,隐式转换Str->double
' MsgBox将内容转为字符串输出或解析变量result
' 其中的字符串子类型不含有数字,相加会产生"Type Mismatch"错误.
#! /bin/bash
strFirst="50"
IntSecond=100
result=$[$strFirst + $IntSecond]
echo $result
echo "$result"
# result接受到隐式转换的str->int
# echo 前者输出 变量 $result 的值 后者输出 字符串格式化成变量的值
strFirst="50"
IntSecond="100"
result=strFirst.to_i+IntSecond.to_i
puts result
puts "#{result}"
# 其中有一个式数字子类型,无法进行隐式转换否则会触发TypeError
# puts 前者输出变量 result 的值 后者输出 字符串格式化成变量的值
<?php
$strFirst="50";
$intSecond=100;
$result=$strFirst+$intSecond;
echo "{$result} <br>";
echo $result;
?>
# result接受到隐式转换的str->int
# echo 前者输出 字符串格式化成变量的值 后者输出 变量 $result 的值
$num=5;
$str="5";
$result=$num+$str;
print "$result"
# result接受到隐式转换的str->int
# print 前者输出变量 result 的值 后者输出 字符串格式化成变量的值
num=5;
str=5;
result=num+str;
document.write(result);
// result接受到隐式转换的int->str
// javascript的加号作为拼接运算符
// result=num-str; 则str->int(同此)
强类型安全
这些特殊的类型,即可使用该类型变量,灵活性强
某些特殊的类型,编译器检查你使用的类型是否为该类型,安全性高
使用常量时,编译器无法阻止将非法值赋给表示星期几的变量。例如,将8赋值给表示星期几的变量,编译器不会报错,但在运行时可能导致逻辑错误(非受检异常)
对于Weekday枚举类型,变量只能被赋值为Weekday.MONDAY、Weekday.TUESDAY等枚举常量,否则编译器会报错(受检异常)(非检的避免手段)这意味着你不能将该类型和其他类型混淆,也不能使用不存在该类型值, 提高了程序可读性和安全性
*p = &temp;
C指针变量int (*p)[2] = &temp;
C数组指针Color myVar = Color.RED;
java枚举变量COlor[] arr = Color.values();
java数组枚举private CustomerInfo customer;
java接口变量
泛型类型
泛型是种范式,允许编写与具体类型无关的代码,将数据类型参数化,使得代码可以适用于多种不同的数据类型,而不需要为每种数据类型都编写重复的代码
模板是泛型编写的基础,泛型编程即以一种独立于任何特定类型的方式编写代码
模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,集合框架
- 编译器为泛型提供
强类型安全
public class GenericMethodTest
{
// 泛型方法 printArray
public static < E > void printArray( E[] inputArray )
{
// 输出数组元素
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
public static void main( String args[] )
{
// 创建不同类型数组: Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
System.out.println( "整型数组元素为:" );
printArray( intArray ); // 传递一个整型数组
System.out.println( "\n双精度型数组元素为:" );
printArray( doubleArray ); // 传递一个双精度型数组
System.out.println( "\n字符型数组元素为:" );
printArray( charArray ); // 传递一个字符型数组
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?