我尝试了以下代码,但不理解输出:
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);
}
}
输出:字符串
为什么?
感谢您的关注!
编译器将选择匹配方法中最不通用的方法。i、 编译器将首先发现字符串和对象都可以为null。然后选择类层次结构中较低级别的一个。(对象的级别高于字符串)
如果有方法重载,编译器会从最特定类型到最不特定类型搜索方法
来自JLS规范
15.12.2.5. 选择最具体的方法
因此,与Object
相比,String
是一种更具体的类型。
选择具有更具体参数类型的方法。字符串比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,即使它们都指向一个字符。 为什么在第二种情况下打印数组的大小? 这个问题看起来像是这个问题的复制品,但它不能回答我的问题。
方案1
我对JavaScript作用域有相当的了解--该语言具有函数级作用域,变量和函数声明被提升到其包含作用域的顶部。但是,我想不通为什么下面两段代码记录了不同的值: 这会将值1记录到控制台: 神秘的是,这记录了10: 那引擎盖下面是怎么回事?