为什么shortValue()方法是具体的,但intValue()是抽象到java.lang.Number?

我已经阅读了java.lang.Number源代码,我想知道为什么

  1. intValue()
  2. longValue()
  3. floatValue()
  4. doubleValue()

是抽象的但是

  1. shortValue()
  2. 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中添加方法byteValueshortValue 。 这与第一个JDK版本中已有的其他“Value”方法不同。 我的假设是这两个方法是具体的,以便与Number现有(也是非标准)子类保持兼容,否则这些子类将通过在超类中添加新的抽象方法而被破坏。

byteshort是较少占用内存的版本,由于intValueabstract ,因此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();