为什么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创始人这样做?

我看不出这些方法之间有什么大的区别。这似乎是相关的。

注:

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类的文档,方法byteValueshortValue是在JDK1.1中首先添加的。这与在第一个JDK版本中已经可用的其他"Value"方法不同。我的假设是,这两个方法是具体的,以保持与Number的现有(也是非标准的)子类的兼容性,否则将被在超类中添加新的抽象方法打破。

byteshort是内存消耗较少的版本,由于intValueabstract, intValue的实现可以用于字节和短字节。我想这就是为什么他们应该那样做。

@Anirudh先生,正如你所说的字节和短方法消耗较少的内存来存储值,但是通过使用相同的变量来执行操作不是正确的方式。因为字节变量将返回负值。

//As per (step-1)Integer是包装器类对象,存储在字节范围以上的100000个值。但是与int内存消耗或范围相比,内存使用较少。因为int的范围可以达到600000之类的。剩下的是浪费内存(除了100000),所以你说int值(100000)如果我们转换成字节(步骤2)更多的内存使用将得到减少。但是存储在变量b中的值是负值。所以这里我们不能对原始值(100000)执行任何操作。如果我想错了,请告诉我。

步骤1:-

步骤2:-字节b = io.byteValue ();

相关内容

最新更新