当我遇到Joel Spolsky时,我正在阅读更多关于Joel on Software的文章,说明一种特定类型的程序员知道a 和Java/C#(面向对象编程语言)之间的区别.intInteger
那么区别是什么呢?
可能重复:
Java可选参数
我知道在PHP中如果要调用参数较少的函数,则声明函数如下:
function foo(int param1, int param2 = "2");
Run Code Online (Sandbox Code Playgroud)
现在我可以打电话foo(2),param2并将设置为2.
我尝试在Java构造函数中执行此操作,但似乎不可能.有没有办法做到这一点,或者我只需要声明两个构造函数?
谢谢!
请考虑以下代码段:
int i = 99999999;
byte b = 99;
short s = 9999;
Integer ii = Integer.valueOf(9); // should be within cache
System.out.println(new Integer(i) == i); // "true"
System.out.println(new Integer(b) == b); // "true"
System.out.println(new Integer(s) == s); // "true"
System.out.println(new Integer(ii) == ii); // "false"
Run Code Online (Sandbox Code Playgroud)
很明显为什么最后一行总是打印出来"false":我们正在使用==引用标识比较,而new对象永远不会是==已经存在的对象.
问题是前三行:那些比较保证在原语上int,Integer自动取消装箱?是否存在基元将被自动装箱的情况,并且执行参考标识比较?(那就是全部false!)
Java具有原始数据类型,它不像Ruby中的对象派生.那么我们可以将Java视为100%面向对象的语言吗?另一个问题:为什么Java没有设计原始数据类型的对象方式?
我是Java的新手.在编写Map <>时,我发现声明Map<int, int>是语法错误,而且没问题Map<Integer, Integer>.是否只能在Java中实例化对象类型的泛型,而不是原语?如果是这样,基元的装箱/拆箱会有明显的性能损失吗?
参考:http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html
"如果你的程序尝试autounbox null,它将抛出NullPointerException."
如果尝试将null赋给布尔值,javac将给出编译时错误.说得通.尽管如此,将null赋给布尔值也是如此.我猜也是有道理的.
但是让我们考虑一下这样一个事实:当你尝试autounbox null时你会得到一个NPE.这意味着你不能在没有空值检查或异常处理的情况下安全地对布尔值执行布尔运算.在整数上进行数学运算也是如此.
很长一段时间,我是java1.5 +中自动装箱的粉丝,因为我认为它让java更接近真正的面向对象.但是,昨晚遇到这个问题之后,我得说我认为这很糟糕.当我尝试使用未初始化的原语时,编译器给我一个错误是一件好事.如果我输了,我不想使用自动装箱.
我想我可能误解了自动装箱的问题,但与此同时我永远不会接受布尔值应该能够有3个值.谁有人解释这个?我没有得到什么?
java ×6
autoboxing ×2
c# ×1
comparison ×1
constructor ×1
generics ×1
int ×1
integer ×1
oop ×1
primitive ×1
unboxing ×1
wrapper ×1