2013-07-29 266 views
0

我知道在基本数据类型的情况下的自动类型提升概念。但是在引用数据类型的情况下,我有下面的代码,它完美地工作。为什么对象类不是空值

public class Test4 { 

void set(Object o) { 
    System.out.println("Inside Object"); 
} 

void set(double[] a) { 
    System.out.println("Array"); 
} 
public static void main(String[] args) { 
    new Test4().set(null); 

} 
} 

它给出输出数组。

但是,如果在地方对象O的,如果我们有任何其他的类,那么这将显示编译时错误的方法是不明确的类型TEST4

下面的代码提供编译时错误

public class Test4 { 

/*void set(Object o) { 
    System.out.println("Inside Object"); 
}*/ 

void set(String s) { 
    System.out.println("String"); 
} 
void set(double[] a) { 
    System.out.println("Array"); 
} 
public static void main(String[] args) { 
    new Test4().set(null); 

} 

} 

据我所知,每个引用数据类型(Class,Interface和Array)的默认值为null。

那么为什么上面的代码工作在对象o的情况下。

在此先感谢

回答

7

编译器总是选择具有更多特定参数类型的方法,该方法可以匹配传递的参数,以防参数可以用于这两个参数。

因为,null对于String,Object,double[]有效,所以编译器必须决定调用哪个方法。

  • Objectdouble[]情况下,由于double[]Object更具体的(阵列只不过是Object)。所以编译器会在这里选择更具体的类型 - double[]
  • Stringdouble[]的情况下,编译器无法确定哪一个是更具体的类型,因为数组和字符串类型之间没有任何关系(它们不属于同一继承层次结构)。因此,这种呼吁模糊不清。

你可以通过JLS §15.12.2.5 - Choosing the Most Specific Method

0

因为double[]更为具体。

double[]Object。所以当你打电话给set(some-double-array)这个版本。请注意,该null是好的double[]

但在第二种情况下没有更具体的方法。

-3

因为,对象不是数据类型,只要用户输入一些数据,它决定它的数据类型。例如, Object obj = null; //语法错误

Object obj = 4.0; //这里的obj是双倍的,因为传递的值是4.0

Object obj =“raj”; //这里obj是字符串。

对象与javascript中的var相同。

+2

这是完全错误的。对象不是*和JavaScript var相同。这是完全合法的:'Object o = new Object();'和Object obj = null;'。它甚至编译。也许你正在考虑Java以外的语言? –

相关问题