类Integer中的valueof值

时间:2016-02-01 19:26:19

标签: java

我们知道Integer类中的valueof值是静态的。但是当我们通过Integer类的对象调用时,它没有给出任何错误。例如:以下代码运行正常......

public class Test {
    public static void main(String[] args)
    {

        Integer i=new Integer(5);
        System.out.println(i.valueOf(i));
    }
}

2 个答案:

答案 0 :(得分:5)

"Understanding Class Members"上引用Java教程:

  

注意:您也可以使用对象引用来引用静态方法       instanceName.methodName(args)   但这是不鼓励的,因为它没有说明它们是类方法。

这应该是任何官方消息来源。

似乎适用的JLS内容:

  

15.12.3. Compile-Time Step 3: Is the Chosen Method Appropriate?

     

     
      
  • 调用模式,计算方法如下:
  •   
    •   
    • 如果编译时声明具有static修饰符,则调用模式为static
    •   
  •   
     

15.12.4.1. Compute Target Reference (If Necessary)

     

     
      
  • 如果表单是 ExpressionName。 [TypeArguments]标识符,然后:
  •   
    •   
    • 如果调用模式为static,则没有目标引用。评估 ExpressionName ,但结果将被丢弃。
    •   
  •   
    •   
    •   
  •   
  • 如果表单是主要。 [TypeArguments]标识符涉及,然后:
  •   
    •   
    • 如果调用模式为static,则没有目标引用。将评估 Primary 表达式,但结果将被丢弃。
    •   
  •   
    •   
    •   
  •   

因此,只要有关于如何评估这种表达的规则,就可以这样做。那就是:

  • static方法始终使用static调用进行调用。 (这似乎很明显,但它仍然应该被指定。假设,假设Java将来引入类似C#扩展方法的东西,那些将遵循不同的规则。)
  • 出于静态方法调用的目的,接收器表达式的值忽略。 (虽然在通话之前会对其进行评估。)

这是在运行时评估此类调用的方式。这与编译器确定要调用的方法的方式截然不同,这是先前发生的。但是,这部分规范对我来说是不可理解的。这表示很容易验证接收器表达式的编译时类型在那里很重要,被调用的方法是static的事实也是如此。 (静态类型是编译器必须使用的所有类型,静态调用是早期绑定的。)

答案 1 :(得分:0)

这种情况更有趣的是:

public class A {
  public static int foo() {
    return 0;
  }
}

public class B extends A{
  public static int foo() {
    return 1;
  }
}

public static void bar() {
  A a = new B();
  System.out.println("val: " + a.foo());
}

打印'0',因为a被声明为A