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