Javaの仕様書では明確に異なる意味で使われています。
参照型(reference types)には次の四つの種類があります。
- クラス型(class types)
- インターフェース型(interface types)
- 型変数(type variables)
- 配列型(array types)
クラス型は参照型の一種ですので、クラス型であれば同時に参照型です。しかし、参照型であっても、クラス型であるとは限りません。たとえば、配列型は参照型ですが、クラス型ではありません。
仕様書ではオブジェクト型(object types)という言葉は見受けられませんでした(もし、見つけた方がいたら、コメントで教えてください)。そこで、オブジェクトが何であるのか見ていきたいと思いますが、ここでのオブジェクトがobjectを指すのか、Object
を指すのかが問題であり、この二つは厳密に異なります。
objectはクラスのインスタンスまたは配列です。Object
は全てのクラスのスパークラスになるクラスの名前です。英語でObject
と表現したとき、Object
クラスそのものというよりObject
クラスのインスタンスを指す場合があります。これは「配列」と言ったとき、「配列」という型そのものよりも「配列」になっている何かをさす事と同じです。しばしば、稚拙な解説文では、「オブジェクト」といったとき、objectとObject
クラスとObject
クラスのインスタンスを混同していることがあることに注意してください。
以上を踏まえ、オブジェクト型というJava仕様書にない用語について、objectを扱うときに用いる型か、Object
クラスのインスタンスを扱うときに用いる型の何れかの意味で作ったのだと思われます。objectを扱うときに用いる型としては、参照型とほぼ一致しますが、例外として、参照型である変数にはnull
を入れられるのに対して、null
自体はobjectではないことに注意してください。Javaにはnull
を入れられない型の変数というのは存在しないため、objectを扱える型はあってもobjectしか扱えない型はありません。Object
クラスのインスタンスを扱うときに用いる型は単純にObject
クラスをそのまま使ったクラス型とも考えられますが、同じくObject
型の変数自体はnull
が扱えてしまうことに注意してください。