Java不能执行运算符重载,但+
可以用于String
和Integer
和其他一些类。这怎么可能?
更新:
为什么这样做?
Integer i = 4;
Integer p = 5;
System.out.println(i*p); // prints 20
+
不是操作员重载的示例。+
在语言中被内置为合并运算符 和 算术加法运算符。
这意味着用Java编写程序的人不能重载运算符,但是就Java语言的语法而言,它+
被定义为连接和加法运算符。
编辑
它适用于其他类,如Integer
和Double
由于自动装箱。
如果您看一下执行字符串连接的Java程序的字节码,您会发现它创建StringBuilder
并使用了该append()
方法。Java编译器会看到+
运算符,并意识到操作数是字符串而不是原始类型(如int
)。
如果查看执行整数加法的程序的字节码,您会发现它使用iadd
指令执行整数加法。这是因为编译器意识到该操作的+
操作数是整数。
至于做这样的事情Integer i = 4
,字节码会表明你确实在做Integer i = Integer.valueOf(4)
。这称为自动装箱。稍后,当您执行i + p
,i
和p
都为type的操作时Integer
,生成的字节码将显示您正在执行i.intValue() + p.intValue()
,这两个方法的返回类型均为int
(实际的字节码指令为iadd
)。
这就是为什么+
工作Integer
,即使他们不是实际的基本类型。
问题内容: 我知道有很多文章可以解释如何在Java EE中使用CDI,但是我很难弄清楚这实际上带来了什么好处。例如,假设我有一个当前使用Foo实例的类。我可能会做 要么 我一直在阅读CDI,我可以做到: 但是为什么这比以前的基于工厂的方法更好呢?我认为还有一些我不知道的用例,但我无法识别。 如果我理解下面的响应,则概念是DI框架充当集中配置的主对象工厂。这是合理的解释吗? 更新资料 从那时起,我就
问题内容: Process p = Runtime.getRuntime().exec(command); is = p.getInputStream(); byte[] userbytes = new byte[1024]; is.read(userbytes); 我想从java在linux os中执行shell命令。但是Pmd报告说不要使用Java Runtime.exec()。为什么?是什么
问题内容: 在JBox2d中,存在以下代码: 我想知道这里的float <-> int位转换函数的作用是什么。这是否提供解决Java的float比较不准确性问题的方法(如果可能的话)?还是完全不同?我想知道它是否可以替代epsilon方法: PS。为了完整和有趣,这里是: 仅供参考,我可以完美地理解为什么在hashCode()中使用转换函数-哈希ID必须是整数。 问题答案: 解释中可以找到约书亚B
问题内容: 我试图了解使用以下命令创建列表的新实例之间的区别: 和 据我了解,稍后将返回一个不可变的列表。这意味着无法添加,删除或修改它。我想知道为什么会创建一个不可变的emptyList?有什么用?谢谢 问题答案: 假设您必须返回一个集合,并且您不想每次都创建几个对象。 返回空集合通常比返回更可取
问题内容: Java中是否有真正的并行数组用例?维护相互关联的N个数组似乎太麻烦了。 例: 我可以创建一个Person类并将对象存储在一个数组中。会贵一点,但是好用得多吗? 问题答案: 并行数组是对诸如Basic(原始语言)之类语言的保留,这些语言除数组外没有其他数据结构。您应该按照您的建议定义对象。
我知道使用lambda expression(LE)我们可以节省一些代码行,比如为函数接口创建对象。而且LE将更易读。但我确信这并不是提供该功能的主要原因。我在google上搜索,并在本文中找到了这段有趣的引用 在Java8之前,处理任何集合的元素都可以通过从集合中获取迭代器,然后迭代元素,然后处理每个元素来完成。如果需要并行处理这些元素,那么将由客户端代码完成。随着Java 8中Stream A