web-dev-qa-db-ja.com

なぜJava.lang.Arrayクラスがないのですか? Java配列がオブジェクトである場合、それはオブジェクトを拡張すべきではありませんか?

Java package-tree: http://docs.Oracle.com/javase/7/docs/api/Java/lang/package-tree.html =

Javaのチュートリアルは、Java配列はオブジェクトであると述べています。

配列クラスはどこですか?なぜこのように配列を作成できるのですか?

_byte[] byteArr = new byte[];
char[] charArr = new char[];
int[] intArr = new int[];
_

配列はObjectからメソッドを継承します。例えば:

_    byte thisByte = 1;
    byte thatByte = 2;
    byte[] theseBytes = new byte[] {thisByte, thatByte};
    int inheritance = theseBytes.length; //inherited 'length' field and some methods
    int wasntInWill = thatByte.length; //error
_

何が起きてる?

編集:

答えに従って、私はそれが_Java.lang.reflect_パッケージのfinalクラスであることを知った。

Androidプロジェクトに_Java.lang.reflect_パッケージを作成し、それにArray.Javaというクラスを追加しました。これが元のクラスの邪魔であることを確認するために、Eclipseは私のエラー「...はすでにpath/to/Android.jarに存在します」

_Java.lang.reflect.Array_と同じクラスを書き出したが、toString()メソッドを変更した場合...これはアプリケーション内で機能するはずです。

38
Ozzy

[〜#〜] jls [〜#〜] から:

すべての配列には関連付けられたClassオブジェクトがあり、同じコンポーネント型を持つ他のすべての配列と共有されます。 [これ]は次のように機能します。配列型の直接のスーパークラスはObjectであり、すべての配列型はインターフェイスCloneableおよびJava.io.Serializableを実装します。

これは、次のコード例で示されています。

class Test {
    public static void main(String[] args) {
        int[] ia = new int[3];
        System.out.println(ia.getClass());
        System.out.println(ia.getClass().getSuperclass());
    }
}

これは次のように出力します:

class [I
class Java.lang.Object

ここで、文字列"[I"は、クラスオブジェクトのランタイム型シグネチャ"array with component type int"

そして、はい、配列型は効果的にObjectを拡張するため、arrayObjectでtoString()を呼び出すことができます。上記の例も参照してください。

int arr[] = new arr[2];
arr.toString();
43
Jigar Joshi

配列は言語機能です-配列には、宣言とアクセスのための特定の構文があります。そして、それらのクラス定義はあなたから隠されています。

Refleciton API-_Java.lang.reflect.Array_で表現されています

ところで、lengthフィールドはObjectから継承されません。 .getClass().toString()などのメソッドが継承されます。

9
Bozho

上記のコードセグメントのわずかな詳細:

_public class ClassForName {
    public static void main(String[] argv) throws ClassNotFoundException {
        Class theClass = Class.forName("[I");
        System.out.println(theClass.getName());
        Class superClass = theClass.getSuperclass();
        System.out.println(superClass.getName());
    }
}
_

結果:

_C:\JavaTools>Java ClassForName
[I
Java.lang.Object
_

見て分かるように、「[I」は英語では「int of array」と呼ばれるクラスの名前です。クラスは「完全な市民権」であるJavaクラスであり、オブジェクトのすべてのメソッドに応答します。唯一の違いは、new構文が異なり、サポートしていないことですクラスのnewInstance()メソッド。

(クラス「[I」、「[C」、その他は、JVMで「事前定義」されています-それらに対応する.classファイルはありません。Javaも暗黙的にプログラムに「MyJavaClass」の配列がある場合は、その場で「[MyJavaClass;」クラスを作成します。)

7
Hot Licks

なぜ配列クラスがないのですか?

プログラムで使用される要素タイプごとに1つare配列クラスがあります。 JLSとJVM仕様の両方で、配列のクラスオブジェクトが動的に作成されることが明記されています。 JLS#10.8 '配列オブジェクトのクラス' および JVM仕様#5.3.3 '配列クラスの作成'

Java配列がオブジェクトである場合、それを拡張すべきではありませんObject?

拡張Java.lang.Object. JLS#10.8は、「すべての配列型の直接のスーパークラスはオブジェクトである」と明確に述べています。

2
user207421