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

时间:2014-03-20 09:00:15

标签: java oop

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

  1. intValue()
  2. longValue()
  3. floatValue()
  4. doubleValue()
  5. 是抽象的但是

    1. shortValue()
    2. byteValue()
    3. 具体。

      源代码:

      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创始人有理由这样做。

3 个答案:

答案 0 :(得分:4)

根据documentation of the Number class,方法byteValueshortValue首先在JDK1.1中添加。这与第一个JDK版本中已有的其他“Value”方法不同。 我的假设是这两个方法是具体的,以保持与Number的现有(也是非标准)子类的兼容性,否则这些子类将被超类中添加新的抽象方法所打破。

答案 1 :(得分:1)

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