public class helloworld {
public static void main(String[] args) {
String text = "Hello World";
l(text);
int n = 0;
l("--------------------------");
l(n);
}
public static void l(Object obj) {
System.out.println(obj);
}
}
我用Java编写了这个简单的程序并且它有效。现在我很困惑,如果所有数据类型(int
,char
,double
等)都在Object
下,那么我们为什么要指定我们想要的数据类型我们传递价值时接受?
我的意思是我们总是可以使用函数Object
中使用的数据类型l
。人们为什么不总是使用Object
作为数据类型来传递值?
答案 0 :(得分:21)
在所有基元类型和它们各自的对象对应物之间定义了隐式转换:
int -> Integer
char -> Character
etc...
这称为autoboxing。
人们为什么不总是使用"对象"作为传递值的数据类型?
由于Java是强类型的,因此您不能使用Object
做很多事情。
E.g。试试这个:
static Object add(Object a, Object b) {
return a + b; // won't compile
}
这是因为可用的方法,运算符等取决于变量的静态类型。
println
可以接受Object
,因为它只需要调用toString
方法。如果仅需要Object
中方法提供的有限功能,那么您可以将其用作类型。但是,这种情况很少发生。
答案 1 :(得分:8)
对于你提到的基元,它们不是真正的对象,它们只是被装箱作为对象的表示。 int
将成为Integer
,long
将成为Long
等。
阅读有关Autoboxing in java的文章。
关于你的问题
人们为什么不总是使用"对象"如 他们的数据类型传递值?
如果指定Object
作为方法的参数,则无法在不进行强制转换的情况下调用真实对象包含的方法。例如,如果您有一个包含方法AnyObject
的自定义对象anyMethod
,则无法将对象强制转换为AnyObject
,您将无法调用它。
它也将是不安全的,因为您将能够将任何类型的对象传递给可能无法使用任何这些类型正常运行的方法。仅包含System.out.println
的方法不能代表实际用例,它只适用于任何对象,因为默认情况下println
将调用toString
方法,该方法已在{ {1}}。
答案 2 :(得分:2)
虽然它看起来像一个似乎接受所有类型参数的函数,但你必须处理这些