笼统的类型处理

通常来说,根据数据类型可以将编程语言分为两类:

强类型语言

  • 强类型语言(Strongly typed language)不仅强制要求事先声明变量,还要求声明每个变量的数据类型,这样编译器就能准确地知道这个变量中的值的类型。强类型语言在数据类型上要求很严格:必须事先说明变量中存放的数据的类型,而在程序的代码中不将其他类型的数据存放到变量中。若将某个变量声明为数字,那么编辑器就认为存放的是一个数字;若违反了这个规定 ,比如将日期存放在这个变量中,比那机器就会报错。

弱类型语言

  • 在弱类型语言(loosely typed language)中,无需事先声明变量的数据类型。但存放在变量的数据类型依然是个需要注意的问题(不能要求计算机2 + banana),但弱数据类型不会在这个问题上斤斤计较。通常,在弱类型语言中都无法声明数据类型,而强类型语言则强制要求声明每个变量的数据类型

编译型语言

  • 编译型语言通常都是强类型的,但也确实存在介于两者之间的语言。用编译型语言编写的代码预先由编译器处理,生成一个经过优化的二进制可执行文件————例如EXE文件。脚本语言事先不会被编译,而是在运行时编译。

编译型语言流程

编译型更接近机器底层,此基础的上层语言Java,C#,更强大更灵活

  1. 在普通文本中编写代码
  2. 将代码编译成可执行文件
  3. 执行编译好的可执行文件
  4. 程序运行

脚本型语言

  • 脚本语言通常都是弱类型的, 其中运行时引擎(runtime engine)会在运行时解释代码,而不是事先编译

脚本型语言流程

脚本型更脱离机器底层,注重宿主业务php,python也更上层更高级

  1. 在普通文本中编写代码
  2. 执行脚本文件(hashbang)
  3. 脚本运行时引擎在程序运行时编译代码
  4. 程序运行

由于代码实在程序运行时才编译,所以编译器会检查变量存放的数据和操作合理的猜测其数据类型(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 ); // 传递一个字符型数组
    } 
}
posted @   NAGISB  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示