2016-08-27 7 views
1

申し訳ありません。私は、オブジェクトクラスの長さフィールドに関するいくつかの疑問を持っています。私が間違っている場合は私を修正します。すべてのクラスはimpilcitlyオブジェクトクラスを継承します。equals、clone、hashcodeなどのようなすべてのメソッドにアクセスできるのはなぜですか?オブジェクトクラスの長さフィールド

私の質問は、int []、foo [ ]オブジェクトクラスの長さフィールドにアクセスすることはできますが、オブジェクトを作成するときには長さ変数を見ることができません。なぜですか?

+2

'Object'に' length'が定義されていないので、 –

+0

と同じ理由で、asdf変数またはfoobar変数を見ることができません。 – immibis

+0

長さフィールドはどこで定義されていますか? – FaisalAhmed

答えて

5

クラスにはlengthフィールドが定義されておらず、Objectにはフィールドがありません。

lengthフィールドは、アレイタイプの場合にのみと定義されています。 JLS状態:Javaプログラミング言語の

」は、配列オブジェクト(§4.3.1)は、動的に作成され、Object型(§4.3.2)の変数に割り当てることができます[..。 。]配列の長さは、最終的なインスタンス変数の長さとして利用可能です。 "

長さフィールドは暗黙的に定義されています。 fieldが定義されているJava APIクラス宣言はありません。 lengthフィールドは、通常、 "JVMマジック"によって実装されます。例えばオブジェクトヘッダーに格納します。それにアクセスするための特別なバイトコード(arraylength)さえあります。

...任意のオブジェクトを作成すると、長さ変数は表示されません。なぜですか?

なぜですか?それは1つ持っていないので!

+0

長さフィールドはどこに定義されていますか? – FaisalAhmed

+2

@FaisalAhmed *動的に作成された配列クラス。 [JLS](https://docs.oracle.com/javase/specs/jls/se8/html/jls-10.html)を参照してください。* Javaプログラミング言語では、配列はオブジェクトです(§4.3.1)。動的に作成され、 'Object'型の変数に代入することができます(§4.3.2)。 [...]配列の長さは、 'final'インスタンス変数' length'として利用可能です。* – Andreas

+0

宣言はどこですか?どこにもない! >>暗黙的です。これはどこに定義されていますか? JLSでは、上記を参照。 –

-1

私の理解によれば、配列の長さは、配列を初期化するときに設定されたsize変数であり、配列の実際の容量を示します。一度アレイの容量を変更することはできませんので、Object []arr = new Object[2]; System.out.length(arr.length)は正常に動作します。配列のコンポーネントの数を含むpublic finalフィールドの長さ。長さは正またはゼロになります。

+0

私はこの非常によく弟を知っています。私の質問は、通常のオブジェクトを作成するときに長さを見ることができない理由でした。そして私はスティーブンCの答えを得ました。そして今、暗黙のうちにどこで定義されているのか考えていますか? – FaisalAhmed

2

"継承"のどちらの方向に進むか注意しなければなりません。あなたが知っているように、「継承」は「関係がある」ということを定義することです。基本クラスがフィールドを定義する場合、メソッドは派生クラスでアクセスすることができます。

Javaでは、任意の整数オブジェクトです。配列は、オブジェクトです。

逆方向の場合はそうではありません。任意のオブジェクトはではなく、の配列です!意味:bar = new Object()のようにオブジェクトを作成した場合、バーには配列のプロパティがありません。 バーがオブジェクトであるためです。配列ではありません。

したがって、Objectがではないため、配列にが含まれていないため、Objectで「length」が見つかりません。

しかし、オブジェクトは次のように、「本当に」何か他のものであれば当然のことながら、:

int[] anotherRefToNumbers = (int[]) foo; 

編集:ちょうど与える

int[] numbers = { 1, 2, 3 }; 
Object foo = numbers; 

、あなたはいつものようにキャストを、行うことができます異なる視点。座って紙の上に円を描くと、このサークルは「形状」(またはあなたがそれを誰と呼んでもよい)でもあります。しかし、あなたが描くことができるすべての形...が円になるわけではありません。

+0

あなたはこの用語をより明確に「オブジェクトは配列ではありません」と定義できますか? –

関連する問題