繁体   English   中英

Integer类中的valueof方法

[英]valueof method in class Integer

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

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

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

引用有关“理解类成员”的Java教程:

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

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


似乎适用的JLS内容:

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

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

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

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

因此,在定义了如何评估这种表达方式的规则的范围内是允许的。 那是:

  • static方法总是使用static调用来调用。 (这似乎很明显,但是仍然需要指定。假设地说,Java将来会引入类似C#扩展方法的方法,这些方法将遵循不同的规则。)
  • 出于静态方法调用的目的,将忽略接收器表达式的值。 (尽管确实会在调用之前得到评估。)

这是在运行时评估此类调用的方式。 与编译器确定调用方法的方式不同,这是较早的一步。 但是,规范的那部分对我来说是难以理解的。 那就是说,很容易验证接收方表达式的编译时类型是否重要,被调用的方法是static的事实也是如此。 (静态类型是编译器必须使用的所有功能,并且静态调用是早期绑定的。)

更有趣的是这种情况:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM