我已经阅读了java.lang.Number
的源代码,我想知道为什么
-
intValue()
-
longValue()
-
floatValue()
-
doubleValue()
是抽象的,但是
-
shortValue()
-
byteValue()
混凝土。源代码:
public abstract class Number implements java.io.Serializable {
public abstract int intValue();
public abstract long longValue();
public abstract float floatValue();
public abstract double doubleValue();
public byte byteValue() {
return (byte)intValue();
}
public short shortValue() {
return (short)intValue();
}
private static final long serialVersionUID = -8742448824652078965L;
}
为什么java创始人这样做?
我看不出这些方法之间有什么大的区别。这似乎是相关的。
注:
from Long class:
public byte byteValue() {
return (byte)value;
}
public short shortValue() {
return (short)value;
}
public int intValue() {
return (int)value;
}
public long longValue() {
return (long)value;
}
public float floatValue() {
return (float)value;
}
public double doubleValue() {
return (double)value;
}
from Integer class
public byte byteValue() {
return (byte)value;
}
public short shortValue() {
return (short)value;
}
public int intValue() {
return value;
}
public long longValue() {
return (long)value;
}
public float floatValue() {
return (float)value;
}
public double doubleValue() {
return (double)value;
}
因此我们看到很多相同的代码。我认为copy paste
的开发是不好的,但我认为Java的创始人是有原因的。
根据Number类的文档,方法byteValue
和shortValue
是在JDK1.1中首先添加的。这与在第一个JDK版本中已经可用的其他"Value"方法不同。我的假设是,这两个方法是具体的,以保持与Number
的现有(也是非标准的)子类的兼容性,否则将被在超类中添加新的抽象方法打破。
byte
和short
是内存消耗较少的版本,由于intValue
是abstract
, intValue
的实现可以用于字节和短字节。我想这就是为什么他们应该那样做。
@Anirudh先生,正如你所说的字节和短方法消耗较少的内存来存储值,但是通过使用相同的变量来执行操作不是正确的方式。因为字节变量将返回负值。
//As per (step-1)Integer是包装器类对象,存储在字节范围以上的100000个值。但是与int内存消耗或范围相比,内存使用较少。因为int的范围可以达到600000之类的。剩下的是浪费内存(除了100000),所以你说int值(100000)如果我们转换成字节(步骤2)更多的内存使用将得到减少。但是存储在变量b中的值是负值。所以这里我们不能对原始值(100000)执行任何操作。如果我想错了,请告诉我。
步骤1:-
步骤2:-字节b = io.byteValue ();