2014-06-30 39 views
-1

这个问题是困扰我while.Please帮助冲突超载

假设有两种方法

public void add(Object obj){ 
/* some logic*/ 
} 

public void add(String str){ 
/*Some logic*/ 
} 

所以,当我打电话add(null)哪种方法能够得到执行,为什么?

感谢

+0

添加语言标签。 –

+0

,但在什么样的基础上jvm认为最**特殊**类型?它仍然不清楚我 – vicky

回答

1

在这种情况下,String参数版本获胜,因为String是更具体的类型,因为每个类都是Object(除本身之外)的子类。

无论如何,您仍然可以通过投射调用Object参数版本。

例如

app.add((Object) null); 

如果是超过一个潜在的匹配,如具有版本的可用版本add(Integer i),这是一个错误,并不会编译。

+0

如果特定类型赢得那么这个“加(整数求和)”和“加(String str)”? – vicky

+0

@vicky,那么它不会编译,更新答案。 – ryenus

1

它将调用方法与参数String ......

Java中的类是对象的直接或间接的子类。所以String是Object的一个子类型,重载接受一个String的方法比重载方法更接近一个Object。一个String可以被转换(向上)为Object,但是一个Object不能被转换(向下或向上)为String,所以采用String参数的方法更具体。因此,print(String s)将被调用print(null)调用。