为什么不对所有方法参数使用 Object?

2022-09-02 12:36:26
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编写了这个简单的程序,它的工作原理。现在我很困惑,如果所有数据类型(,等)都属于,那么为什么我们在传递值时指定要接受的数据类型?intchardoubleObject

我的意思是,我们始终可以使用函数中使用的数据类型。是否有特定原因导致人们并不总是使用作为其数据类型来传递值?ObjectlObject


答案 1

在所有基元类型及其各自的对象对应项之间定义了隐式转换:

int -> Integer
char -> Character
etc...

这称为自动装箱

为什么人们并不总是使用“Object”作为他们的数据类型来传递值,这有什么具体的原因吗?

由于Java是强类型的,因此您无法使用Object做很多事情。

例如,试试这个:

static Object add(Object a, Object b) {
    return a + b; // won't compile
}

这是因为可以使用的方法、运算符等取决于变量的静态类型。

println可以接受,因为它只需要调用该方法。如果您只需要 中的方法提供的有限功能,那么当然,您可以将其用作类型。然而,这种情况很少见。ObjecttoStringObject


答案 2

对于你提到的原语,它们不是真正的对象,它们将被简单地框定为它们的表示对象。An 会变成一个,a 会变成一个等。intIntegerlongLong

阅读这篇关于Java自动装箱的文章。

至于你的问题

为什么人们并不总是使用“Object”作为他们的数据类型来传递值,这有什么具体的原因吗?

如果指定为方法的参数,则如果不进行强制转换,将无法调用实际对象包含的方法。例如,如果您有一个包含方法的自定义对象,则在不将对象强制转换为 的情况下,您将无法调用它。ObjectAnyObjectanyMethodAnyObject

这也是不安全的,因为您将能够将任何类型的对象传递给一个方法,该方法可能未设计为与任何这些类型一起正常工作。仅包含的方法不代表实际用例,它将与任何对象一起使用,因为默认情况下,will 将调用已在 中定义的方法。System.out.printlnprintlntoStringObject