配列について話すときは長さがデータフィールドであり、Javaで文字列について話すときはlength()なのはなぜですか?意味:
int a[10] = {1,2,3,4,5,6,7,8,9,10};
String str = "foo";
int a_len = a.length;
int str_len = str.length();
配列の場合、長さが関数ではないのはなぜですか?またはその逆ですか?
簡単に言うと、それはまさにその通りであり、これまでのやり方です。
JLSセクション10.7で、配列にパブリックfinallength
フィールドがあることが指定されています。一貫性を保つために、代わりにメソッドとして指定することもできますが、そうではありませんでした...同様に、パブリック最終フィールドを持つように実装を決定することもString
できましたが、そのようにはなりませんでした。length
1.0以降存続しているいくつかの不整合があります-明らかに、これらのことはリリース後に実際に変更することはできません...
String
インターフェイスはメソッドしか指定できないため、この場合はを実装CharSequence
し、したがってlength
メソッドである必要があります。
配列はインターフェイスを実装する必要がないためlength
、この場合、余分なメソッド呼び出しのオーバーヘッドを回避するために、パブリックfinalフィールドとして実装されます。
編集:
Hot Licksが以下で指摘しているように、Java1.4CharSequence
より前には存在していませんでした。CharSequenceは明らかにこの設計選択の背後にある原動力ではありませんでしたが(存在しなかったため)、Stringが将来新しいインターフェイスを実装する必要があるかもしれないという考えでこの設計を選択することは依然として理にかなっています。
これは変数と見なされ、メソッドとは見なされません。それは、クラスを作成し、Public static int numと言った後、メソッドでnumがグローバルに何かに等しいことを示したようになります。