类Integer中的valueof值

Pat*_*rth 1 java

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

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

        Integer i=new Integer(5);
        System.out.println(i.valueOf(i));
    }
}
Run Code Online (Sandbox Code Playgroud)

mil*_*ose 5

引用"了解类成员"的Java教程:

注意:您也可以使用对象引用来引用静态方法, instanceName.methodName(args) 但不建议这样做,因为它并不清楚它们是类方法.

这应该是任何一个良好的官方来源.


JLS的东西似乎适用:

15.12.3.编译时步骤3:选择的方法是否合适?

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

15.12.4.1.计算目标参考(如有必要)

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

因此,只要有关于如何评估这种表达的规则,就允许这样做.那是那个:

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

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

  • 它在[JLS 15.12.3](https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.3)中:*如果是编译时声明具有`static`修饰符,然后调用模式是`static`.*意味着如果在非静态模式中调用静态方法(读取:在实例值上),则它仍然被视为静态调用. (3认同)