点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

作者 | Yujiaao

来源 | https://segmentfault.com/a/1190000019962661

另一个类似的 Java 面试难题。为什么 C++ 支持运算符重载而 Java 不支持? 有人可能会说 + 运算符在 Java 中已被重载用于字符串连接,不要被这些论据所欺骗。

与 C++ 不同,Java 不支持运算符重载。Java 不能为程序员提供自由的标准算术运算符重载,例如+, -,*和/等。如果你以前用过 C++,那么 Java 与 C++ 相比少了很多功能,例如 Java 不支持多重继承,Java中没有指针,Java中没有地址引用传递。

另一个类似的问题是关于 Java 通过引用传递,这主要表现为 Java 是通过值还是引用传参。虽然我不知道背后的真正原因,但我认为以下说法有些道理,为什么 Java 不支持运算符重载。

1) 简单性和清晰性。

清晰性是 Java 设计者的目标之一。设计者不是只想复制语言,而是希望拥有一种清晰,真正面向对象的语言。添加运算符重载比没有它肯定会使设计更复杂,并且它可能导致更复杂的编译器, 或减慢 JVM,因为它需要做额外的工作来识别运算符的实际含义,并减少优化的机会, 以保证 Java 中运算符的行为。

2) 避免编程错误。

Java 不允许用户定义的运算符重载,因为如果允许程序员进行运算符重载,将为同一运算符赋予多种含义,这将使任何开发人员的学习曲线变得陡峭,事情变得更加混乱。

据观察,当语言支持运算符重载时,编程错误会增加,从而增加了开发和交付时间。由于 Java和 JVM 已经承担了大多数开发人员的责任,如在通过提供垃圾收集器进行内存管理时,因为这个功能增加污染代码的机会, 成为编程错误之源, 因此没有多大意义。

3) JVM复杂性。

从JVM的角度来看,支持运算符重载使问题变得更加困难。通过更直观,更干净的方式使用方法重载也能实现同样的事情,因此不支持 Java 中的运算符重载是有意义的。与相对简单的 JVM 相比,复杂的 JVM 可能导致 JVM 更慢,并为保证在 Java 中运算符行为的确定性从而减少了优化代码的机会。

4) 让开发工具处理更容易。

这是在 Java 中不支持运算符重载的另一个好处。省略运算符重载后使语言更容易处理,如静态分析等,这反过来又更容易开发处理语言的工具,例如 IDE 或重构工具。Java 中的重构工具远胜于 C++。

往期推荐

一个故事讲完CPU的工作原理

MySQL中有哪些锁?

到底一台服务器能够支持多少TCP并发连接?

2020 年 4月全国程序员工资出炉!

轻轻一扫,立刻扣款,付款码背后的原理你不想知道吗?

扫一扫,关注我

一起学习,一起进步

为什么 Java 不支持运算符重载?相关推荐

  1. java运算符重载_为什么Java不支持运算符重载?

    Java不支持运算符重载 = 小白也能学编程 Java之所以不支持运算符重载,并不是如下原因: 会使JVM变得复杂.性能下降:君不见C++内置运算符重载的能力?C++的性能在任何时代秒杀Java相信没 ...

  2. java 漂亮的连接曲线_猜猜 Java 为什么不支持运算符重载?

    作者 | Yujiaao 来源 | https://segmentfault.com/a/1190000019962661 另一个类似的 Java 面试难题.为什么 C++ 支持运算符重载而 Java ...

  3. 编写一个程序,用户使用for循环输入5个数字,所有这些数字将存储在一个数组中。之后,程序将添加这五个数字并显示结果。程序必须支持运算符重载的概念。

    Write a program in which users enter 5 numbers using for loop and all these numbers will store in an ...

  4. java 两个运算符重载_Java中的操作符重载

    0.Java操作符重载 Java中我们可以执行如下语句: String fullName = "hongliang "+"cao"; System.out.pr ...

  5. Java为什么不提供运算符重载?

    从C ++到Java,一个显而易见的未解决问题是Java为什么不包括运算符重载? 不是Complex a, b, c; a = b + c;吗Complex a, b, c; a = b + c; C ...

  6. groovy–运算符重载

    Groovy支持运算符重载,各种运算符被映射到普通的java对象的方法调用,这就使得开发者可以利用运算符重载的优势来编写自己的Java或者groovy对象. 下面的表格描述了groovy中的操作符所映 ...

  7. c++友元函数及运算符重载

     c++的类和java的类机制着实不大一样,不仅仅是语法,还包括一些特殊的东西,如c++用友元函数来破坏类的封装性,使得外界(友元函数体)可以访问类的私有属性,而java呢,java则可以通过反射机制 ...

  8. python 运算符重载_《fluent python》第 13 章 正确重载运算符

    引言 有些事情让我不安,比如运算符重载.我决定不支持运算符重载,这完全是个人选择,因为我见过太多 C++ 程序员滥用它--James Gosling(Java 之父) ps: 运算符重载它不香吗 写在 ...

  9. 第11章 运算符重载与约定

    第11章 运算符重载与约定 我们在<第2章 Kotlin 语法基础>中已经学习过关于运算符的相关内容,本章将继续深入探讨Kotlin中的运算符的重载与约定. 通常一门编程语言中都会内置预定 ...

最新文章

  1. IE6下绝对定位的DIV被相对定位的DIV挡住的问题
  2. 使用LoadRunner测试WMS
  3. 基于WINCE6.0的nandflash驱动(基于K9F1G08U0B)
  4. 使用jar命令查看搜索提取jar包中的文件
  5. Linux redhat下安装swftools(转载后修改)
  6. Java基础之正则表达式
  7. C++编译出现binding ‘const string {aka const std::__cxx11::basic_string<char>}’ to reference of type ‘std
  8. iframe 跨域_【梯云纵】搞定前端跨域
  9. 用python二重循环求成绩表_python的循环
  10. python re 简单实例_python的re正则表达式实例代码
  11. MySQL 事务 MVCC 版本链
  12. 程序安全性之配置文件安全
  13. 解决全网 99的视频下载问题
  14. python3 打包exe 加密_python代码加密之生成exe可执行文件
  15. mysql微信昵称特殊符号_mysql保存微信昵称特殊字符的方法
  16. 中国传统四大菜系之:淮扬菜
  17. 技嘉主板设置服务器启动不了系统,技嘉主板开启ahci模式不认硬盘 - 卡饭网
  18. 【Python数据清洗】numpy.take()用法
  19. 基于魔兽RPG对当前游戏发展趋势的分析,以及尝试一个高游戏性玩法的设计
  20. 自己动手制作C 语言编译器(8):表达式

热门文章

  1. python3 设置函数执行超时 eventlet模块
  2. linux shell 单行多行注释
  3. Windows10 + Visual Studio 2017 + CMake +OpenCV编译、开发环境配置及测试
  4. python:BeautifulSoup 模块使用指南
  5. linux下文件夹的创建、复制、剪切、重命名、清空和删除命令
  6. 常见的端口扫描类型及原理
  7. Win7 OBJECT_HEADER之TypeIndex解析
  8. Eclipse MyEclipse下常用快捷键介绍
  9. Makefile 实际用例分析(一) ------- 比较通用的一种架构
  10. 数据结构 - 二元查找树