当前位置: 首页 > news >正文

关于诸多编程语言类型介绍

目录

1、强类型语言

1.1、定义

1.2、特点

1.3、语言归类

2、静态类型语言

3、var类型

3.1、概念

3.2、语法和规则

3.3、为什么引入 var

4、优缺点


前言

        编程语言中的数据最终都要放到内存中,在内存中存取数据要明确三件事情:数据存储地址数据的长度以及数据的处理方式

1、数据存储地址决定了数据放在哪里;
2、数据长度决定了当前数据使用了多少个字节的内存;
3、数据处理方式不仅让计算机能够正确转换数据的内容,不至于导致“乱码”,还让计算机知道如何处理基于该数据的各种运算,比如加减乘除。

关于编程语言的分类如下:

        变量名不仅仅是为数据起了一个好记的名字,还告诉数据的存储地址,使用数据时,只要提供变量名即可,变量名会自送转换成数据在内存中的地址。

而数据类型则指明了数据的长度和处理方式,它确定了除地址以外的其它所有信息。

诸如int n;、char c;、float money;这样的变量定义形式就确定了数据在内存中的所有要素。

关于强类型语言的编译检查链路图如下所示:

        强类型语言(Strongly Typed Language)是相对于 弱类型语言(Weakly Typed Language)来说的。


1、强类型语言

1.1、定义

        它表示在语言的编译或运行过程中,对变量类型有严格限制,不允许隐式类型转换或忽略类型检查

Java(强类型)示例:

int num = 10;
String s = "Hello";
num = s; // ❌ 编译报错:不兼容的类型

必须显式转换时:

int num = 10;
double d = num; // ✅ 自动类型提升(安全)
int x = (int) 3.14; // ✅ 必须显式转换

弱类型语言的对比(如 JavaScript):

let a = 10;      // 数字
a = "abc" + a;   // ✅ 自动转换成字符串 "abc10"
console.log(a);  // 输出 "abc10"

JavaScript 运行时类型自动转换,灵活但容易引发隐性类型错误。

1.2、特点

1、每个变量/表达式都必须有确定的数据类型(int、double、String...);

2、类型一旦声明,就不能随意改变;

3、编译器会检查类型一致性,不符会直接编译报错(Java是编译期就检查);

4、很多转换必须显式声明(强制类型转换 cast);

1.3、语言归类

如下所示:


2、静态类型语言

很多时候我们会同时听到 静态类型(Static Typed)这个概念。

  • 强类型:强调类型检查严格;
  • 静态类型:强调在编译期就检查数据类型(编译器在运行前就会知道每个变量的类型);

Java 既是:

  • 强类型(类型安全,禁止乱赋值);
  • 静态类型(类型在编译期确定);
  • 所以编译期就能发现大部分类型错误;

Java 中几乎所有变量和表达式都有显式的类型

  • 基本类型(int、double、boolean...)——值类型;
  • 引用类型(String、Object、自定义类...);
  • 泛型(Generic)通过类型参数约束集合等对象类型;

如下所示:


3、var类型

3.1、概念

var 不是数据类型,而是一种 局部变量类型推断语法(Local Variable Type Inference)。

  • 编译器会根据赋值表达式的右侧类型自动推断变量的静态类型
  • 不是动态类型(不像 JS/Python 那样运行时确定类型)
  • 编译期仍然是强类型检查 ✅

3.2、语法和规则

介绍:

var name = "Java"; // 推断为 String
var num = 123;     // 推断为 int
var list = new ArrayList<String>(); // 推断为 ArrayList<String>

❌ 不允许:

var x; // ❌ 编译错误:必须有初始值(无法推断类型)
var y = null; // ❌ 不能仅用 null 推断
var arr = {1, 2, 3}; // ❌ 必须有明确类型

⚠️注意:

  • 只能用于 局部变量、增强 for 循环变量、try-with-resources 的资源变量
  • 不能用于:
    • 方法参数
    • 方法返回类型
    • 成员变量(字段)

3.3、为什么引入 var

  • 减少冗长声明:尤其在泛型推导时
  • 提升可读性(让代码关注右值类型而非重复声明)
  • 配合泛型更方便:
// 没有 var 时
Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();// 有 var 时(编译器自动推断)
var map = new HashMap<String, List<Integer>>();

小结:


4、优缺点

1、优点:

  • 类型安全(减少运行期未知错误)
  • 编译器可优化性能
  • IDE 提示更智能(代码补全、重构友好)

2、缺点:

  • 编码时需要较多类型声明(Java 10开始引入 var 简化)
  • 灵活性不如动态弱类型语言(如 JS、Python)

总结

        强类型语言在类型安全性和代码健壮性方面具有明显优势,但也带来了一定的灵活性限制。        

        但是在编译和类型匹配方面强类型语言对类型一致性的要求使得代码的开发集成以及跨平台和跨语言的协作变得更为复杂


参考文章

1、强类型语言(Java、C++、Typescript?等)-CSDN博客文章浏览阅读1.2k次,点赞22次,收藏27次。强类型语言在类型安全性和代码健壮性方面具有明显优势,但也带来了一定的灵活性限制。在编译和类型匹配方面,强类型语言对类型一致性的要求使得代码的开发、集成以及跨平台和跨语言的协作变得更为复杂。因此,在多语言模型集成或异构系统中,如何有效处理这些类型问题成为了一个需要解决的技术挑战。Java和JavaScript在处理泛型(Generics)方面有显著的差异。Java是一种静态类型、强类型的语言,泛型是其类型系统中的一个关键特性。_强类型语言 https://blog.csdn.net/m0_55049655/article/details/142327455?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ccb48aa4c9152bd37d485afaa49e7b88%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=ccb48aa4c9152bd37d485afaa49e7b88&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-142327455-null-null.142^v102^control&utm_term=%E5%BC%BA%E7%B1%BB%E5%9E%8B%E8%AF%AD%E8%A8%80&spm=1018.2226.3001.4187

2、静态语言、动态语言、强类型语言、弱类型语言的区别-CSDN博客文章浏览阅读1.1k次,点赞29次,收藏32次。如果你是一名程序员,那你一定使用过变量、函数参数或者函数返回值,它们都用来表示数据,在编程语言中无处不在;但是,你是否知道它们的真正含义呢?又是否知道它们在后台如何控制计算机的呢?在很多编程语言(比如 C/C++、Java、C# 等)中,定义变量时除了需要指明变量的名字,还需要告诉计算机它是什么类型,比如简单的整数、浮点数、字符串,还有复杂的类、结构体、数组。编程语言中的数据最终都要放到内存中,在内存中存取数据要明确三件事情:数据存储地址、数据的长度以及数据的处理方式。_静态语言 https://blog.csdn.net/weixin_42673574/article/details/136784820?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ccb48aa4c9152bd37d485afaa49e7b88%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=ccb48aa4c9152bd37d485afaa49e7b88&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-136784820-null-null.142^v102^control&utm_term=%E5%BC%BA%E7%B1%BB%E5%9E%8B%E8%AF%AD%E8%A8%80&spm=1018.2226.3001.4187

http://www.xdnf.cn/news/1326547.html

相关文章:

  • AP6275S AMPAK正基WiFi6模块方案与应用
  • 链表-2.两数相加-力扣(LeetCode)
  • 中科米堆CASAIM自动化三维测量设备测量汽车壳体直径尺寸
  • 丝杆支撑座在自动化生产线中的关键支撑
  • Java -- 用户线程和守护线程--线程同步机制
  • ios使用saveVideoToPhotosAlbum 保存视频失败提示 invalid video
  • oracle官网下载jdk历史版本,jdk历史版本下载
  • 小程序开发APP
  • 应用控制技术、内容审计技术、AAA服务器技术
  • STL——string的使用(快速入门详细)
  • 可靠性测试:软件稳定性的守护者
  • Flink Stream API - 源码二开详细实现
  • 低延迟、跨平台与可控性:直播SDK的模块化价值解析
  • 基于 PyTorch 模型训练优化、FastAPI 跨域配置与 Vue 响应式交互的手写数字识别
  • 微服务架构的演进:从 Spring Cloud Netflix 到云原生新生态
  • 如何在 uBlock Origin 中忽略指定网站的某一个拦截规则
  • 数字孪生 :提高制造生产力的智能方法
  • 当宠物机器人装上「第六感」:Deepoc 具身智能如何重构宠物机器人照看逻辑
  • 常见的软件图片缩放,算法如何选择?
  • 当机器猫遇上具身智能:一款能读懂宠物心思的AI守护者
  • ISIS高级特性
  • 驱动开发系列66 - glCompileShader实现 - GLSL中添加内置函数
  • MySQL练习题50题(附带详细教程)
  • 【GNSS定位原理及算法杂记5】​​​​PPK(后处理动态定位)深度解析:后处理的艺术与 RTK 的互补
  • ListBoxes使得在专为灵活性和易用性设计
  • GaussDB 中 alter default privileges 的使用示例
  • 从数据表到退磁:Ansys Maxwell中N48磁体磁化指南
  • GaussDB 八种常规锁介绍
  • MoonBit Perals Vol.06: Moonbit 与 LLVM 共舞 (上):编译前端实现
  • CloudDM 新增支持 GaussDB 与 openGauss:国产数据库管理更高效