クイズとか
またもや突然クイズです。
「Javaにおいて、全ての配列およびクラスは暗黙的にObjectクラスを継承している」
YESかNOか
答えとか
これ、自分もよくこういうことを言ってしまっていますし、日本語のJavaDoc読んでみたら
Objectクラスは、クラス階層のルートです。すべてのクラスは、スーパー・クラスとしてObjectを持ちます。配列を含むすべてのオブジェクトは、このクラスのメソッドを実装します。
と書いてありますし。
が、答えはNOです。
Javaにおいて、全ての配列およびクラスは暗黙的にObjectクラスを継承しているわけではありません。
例外があるんです。
例外のクラスとか
例外となるクラスはObjectクラスです。
ObjectクラスはObjectを継承しません。
そりゃそーですよね。
Object extends Objectとかやったら
Objcet::newを実施→super();→Object::newを実施→super();→以下略
と、コンストラクタが無限再帰しちゃいます。
"GNU's Not Unix!"みたいになっちゃう!
何を継承してるのかとか
そうすると、気になるのはObjectクラスが何を継承しているかですよね。
特にObject::new後。
そういうわけで、コードで確認してみました。
java
System.out.println(new Object().getClass().getSuperclass().toString());
Exception in thread "main" java.lang.NullPointerException
ぬるぽ
おまけとか
ついでなのでJavaの言語仕様を見てみましょう。
The class Object is a superclass (§8.1.4) of all other classes.
「Objectクラスは"他の"全てのクラスのスーパークラスである」
ちゃんと書いてあった!