对象类型的对象有什么用处?

3
我在SCJP书籍的练习题中看到了以下代码:
Object obj = new Object();

一开始我以为这可能是一个错误,因为我没有使用这样的语句。现在我明白这是一个有效的语句。

我只想了解如果有的话,这个语句的实际用途是什么。你可以使用Object类型的对象(而不是从Object派生的类)做什么?


1
你还有什么其他方法可以创建一个 Object 类的新实例? - Justin Niessner
@JustinNiessner 我认为他在问创建一个 Object 类的新实例有什么用处。 - Mason T.
1
@JustinNiessner,为什么Object不能是一个接口而不是具体类?既然它在Java中是一个类,那么作为类而不是接口的用途是什么? - Athiruban
1
@Athiruban Object提供了#equals等方法的实现,只有类提供实现,接口不能。没有指定父级的类继承自Object,因此它们都继承这些方法。这很重要 - 例如对于集合 - 因为测试对象是否在集合中永远不能未定义。 - James
@James,Object提供了#equals等方法的默认实现。如果没有人期望这些方法有默认实现,那么接口也可以工作。我认为真正的原因是历史:Java的Object和Class类的根源可以追溯到Smalltalk——早在任何人想到“接口”之前。 - Solomon Slow
可能是重复的问题:Java:为什么Object类没有声明为抽象类? - Raedwald
4个回答

16

该代码声明了一个类型为Object的引用,并将一个新分配的Object实例赋给它。

现在,Object类的实例可能看起来毫无意义。然而,它们确实有实际用途之一是锁定:

...
synchronized (obj) {
   ...
}
...

只回答与问题有关的内容。+1 - christopher

1
它可以用于例如同步:
synchronized (obj) {
   ... 
}

1
一个实际的用途并不是很常见(NPE答案就是一个例子),但由于每个类都继承自Object,当您调用它的构造函数时,Object类的构造函数将在某个时候被隐式调用,因此您需要能够构造一个新的Object。
public class Foo {   // implicitly inherits from Object
    public Foo() {
        super(); // Object default constructor call
    }
}

public class Bar extends Foo {
    public Bar() {
        super(); // Foo default constructor call
    }
}

Bar b = new Bar();  // new Bar() calls new Foo() that calls new Object()

需要注意的是,编译器会隐式地插入super()(超类构造函数)的调用。


谢谢你提醒我,我们仍然在隐式使用Object的构造函数。当我在SCJP书中看到这个问题时,没有想到这一点。 - Athiruban

0
使用new运算符,您可以为对象分配内存并调用其构造函数。 通常,在日常编码中创建Object类的实例不会出现太多。同样重要的是要知道,您制作的每个类都是从object继承而来的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接