当前位置: 首页 > 知识库问答 >
问题:

方法重载混淆[重复]

齐振
2023-03-14

我尝试了以下代码,但不理解输出:

Class A{
  public void print(Object o){
     System.out.println("Object");
  }
  public void print(String o){
     System.out.println("String");
  }  
  public static void main(String arr[]){
     A obj = new A();
     obj.print(null);
  }
}

输出:字符串

为什么?

感谢您的关注!

共有3个答案

段弘和
2023-03-14

编译器将选择匹配方法中最不通用的方法。i、 编译器将首先发现字符串和对象都可以为null。然后选择类层次结构中较低级别的一个。(对象的级别高于字符串)

濮君植
2023-03-14

如果有方法重载,编译器会从最特定类型到最不特定类型搜索方法

来自JLS规范

15.12.2.5. 选择最具体的方法

因此,与Object相比,String是一种更具体的类型。

弘涛
2023-03-14

选择具有更具体参数类型的方法。字符串比Object更具体。

请注意,如果您有另一个print方法,例如带有Intger参数,您将收到编译错误,因为在这种情况下编译器将没有规则来决定是否调用print(String)print(Intger)。当您有print(String)print(Object)时它有效的原因是String是Object的子类,因此print(String)是首选。

 类似资料:
  • 问题内容: 我对此代码有两个问题 1)函数f在Override po的引用上如何可见; 2)为什么输出“ private f()” 问题答案: 该方法在班级内部,因此当然可以看到班级的私有成员。 您 没有在类中重写方法,没有多态。变量的类型为,因此它将采用class中的方法。 注意class 中的方法在class中根本不可见。该方法在课堂上是一种不同的方法,不具有任何与该方法在超类。

  • 我对这个方法引用语法有点困惑。 需要一个双函数,然而,尽管温度较高,lessThanTemp仍然是有效的参数。lessThanTemp()只接受一个参数。 这一行到底发生了什么:? MCVE:

  • 我尝试在android studio中使用Proguard,但Proguard似乎没有混淆类名,例如,我的应用程序结构和配置: 和配置 但当我尝试在应用程序中触发异常时: ADB控制台中列出了异常: 只有方法被混淆了,MainActivity.class没有

  • 问题1。数组名不是指向数组开头的指针吗??如果是这样,那么为什么sizeof运算符在上述代码中计算为两个不同的值。 i、 e为什么产生8,而产生12,即使它们都指向一个字符。 为什么在第二种情况下打印数组的大小? 这个问题看起来像是这个问题的复制品,但它不能回答我的问题。

  • 我对JavaScript作用域有相当的了解--该语言具有函数级作用域,变量和函数声明被提升到其包含作用域的顶部。但是,我想不通为什么下面两段代码记录了不同的值: 这会将值1记录到控制台: 神秘的是,这记录了10: 那引擎盖下面是怎么回事?