【问题标题】:Method overloading in java regarding arguments with int/long and String/objectjava中关于int/long和String/object参数的方法重载
【发布时间】:2017-10-27 02:50:48
【问题描述】:

对于下面的程序,为什么调用带有 int 和 String 参数的方法而不是 long 和 Object?

想知道为什么编译器选择 int 而不是 longString 而不是 Object 参数。

注意:这是在一次采访中提出的。

public class MethodOverloadingTest {

    public static void add(int n, int m){
        System.out.println("Int method");
        System.out.println(n+m);
    }

    public static void add(long n, long m){
        System.out.println("Long method");
        System.out.println(n+m);
    }

    public static void method(String st){
        System.out.println("from String method");
    }

    public static void method(Object obj){
        System.out.println("from Object method");
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        add(2,3);
        method(null);
    }

}

【问题讨论】:

  • Rafa El 的评论得到了支持,但这是错误的。编译器不会选择它找到的第一个方法;它选择适合论点的最具体的方法。尝试将方法在类中以不同的顺序排列,您会发现这并不重要。
  • 也许因为它很有趣而被投票赞成。
  • 这不是“好笑”,只是错了。
  • 然后会选择最具体的方法。如果您想知道确切的规则,请在Java Language Specification 中查找。
  • 哦!现在我记得我实际上在高中时就学会了它!真丢脸。

标签: java overloading


【解决方案1】:

对于add(2,3) 方法,您传递的是整数,这就是调用整数的原因。 对于method(null),选择最具体的方法参数。在这种情况下,StringObject 更具体。因此method(String st); 被调用。

【讨论】:

  • 不,这不是面试必须寻找的完整且完全正确的答案..
  • @Khay 我猜你已经知道答案了,你正在测试这里的所有人。
  • 是的 - 使用 add(2L,3L);用 Longs 或 method((Object)null) 调用它:]
【解决方案2】:

这很简单,因为 Java 默认将数字视为 int,将字母视为字符串对象,而不是通用对象。

所以当你通过 add(2,3) 时,它会将参数作为普通的 int

调用 add(long , long) 将参数传递为 ; add(2.0,4.0) 类似这样的东西。并用于调用函数方法(对象)

1.first 将您的字符串类型转换为类型对象 字符串 str; str= (object) "Hello world";

2.然后传递给method(str);

【讨论】:

    【解决方案3】:

    这个概念被称为早期绑定。最具体的方法(基于参数)是在编译时选择的。

    Object 是 java 中最不具体的类,因为它是所有类的超类。

    如果多个成员方法既可访问又适用于方法调用,则有必要选择一个为运行时方法分派提供描述符。 Java 编程语言使用选择最具体方法的规则。

    如何选择在规则集中给出,这里指定

    http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 2011-12-03
      相关资源
      最近更新 更多