我已阅读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创始人已经成功了?
我不认为这些方法之间存在很大差异。它似乎是相关的。
P.S。
来自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;
}
来自Integer类
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创始人有理由这样做。
答案 0 :(得分:4)
根据documentation of the Number class,方法byteValue
和shortValue
首先在JDK1.1中添加。这与第一个JDK版本中已有的其他“Value”方法不同。
我的假设是这两个方法是具体的,以保持与Number
的现有(也是非标准)子类的兼容性,否则这些子类将被超类中添加新的抽象方法所打破。
答案 1 :(得分:1)
byte
和short
是较少占用内存的版本,由于intValue
为abstract
,因此intValue
的实现可用于字节和短。我认为这就是他们应该这样做的原因。
答案 2 :(得分:0)
@Anirudh先生,小确认正如你所说的那样,字节和短方法消耗较少的内存来存储值,但它不是通过采用相同的变量来执行操作的正确方法。因为字节变量将给你负值。
//按照(步骤1)整数是包装类对象,它以100000以上的字节值存储。但是与内存消耗或范围相比,内存使用率较低。因为int范围高达600000或smthng。剩下的是浪费内存(除了100000),所以你说int值(100000)如果我们转换为字节(步骤2),内存的使用量会减少。但是存储在“b”变量中的值是负值。所以这里我们不能用原始值(100000)执行任何操作。如果我想错了,请建议我。
步骤-1: - 整数io = new Integer(100000);
步骤-2: - byte b = io.byteValue();