配列がオブジェクトである理由

このQ&Aのポイント
  • 配列はデータを保持し、指定されたインデックスのデータを渡す機能を持つ
  • 配列は箱にデータを保管し、要素へのアクセスを提供する
  • 配列はデータと操作をひとまとめにしたものであり、オブジェクトと呼ばれる
回答を見る
  • ベストアンサー

配列は何故オブジェクト?

僕はプログラミング初心者です。 javaの参考書で、配列について記述されていた章にて以下の記述がありました。 「データとそれを操作する機能をひとまとまりにしたものをオブジェクトといいますが、その意味では配列もオブジェクトです」と。 そこで、配列がオブジェクトである理由について、以下の仮説を立ててみました。正しいですか? 配列 ・データを保持する(配列要素を保存する) ・指定されたインデックス(牽引番号)のデータ(配列要素)を渡す 例えば、int [] n ={3,5,7};という配列があったとします。このソースコードにより、配列は箱に入れられヒープに保管されます。これにより、配列はデータを持っていることを意味する。これに int data=n[0];のように配列要素へのアクセスを行うと、配列は自身の持ってるデータ(配列要素) を変数dataに渡します。これは配列は、指定されたインデックス(牽引番号)のデータ(配列要素)を渡す機能を実行している。 つまり、上記から配列はデータとそれを操作する機能を持っており、オブジェクトといえる。

  • Java
  • 回答数6
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
noname#161640
noname#161640
回答No.1

まず、「値を取り出し渡す」のは「機能」ではありません。それを機能といったら、ごく普通の変数にしたところで、値を取り出し渡す「機能」があることになりますし、123という値も「123という値を渡す機能がある」ということになってしまいます。変数への値の代入、値の取得は、機能ではありません。それは言語の基本的な仕様として定められているものです。例えば+という演算子が右辺と左辺の和を返す「機能」があるからオブジェクトだ、とはいいません。言語仕様は機能ではありません。 Javaでは、機能とは、ありていにいってしまえば「メソッド」のことです。つまり、Javaでは「内部にメソッドがあればオブジェクト(クラスかインスタンス)」です。もちろんメソッドのないクラスもありますが、Javaの配列にはメソッドがあります。例えば、arr.clone();でクローンを生成したりできます。 その他の言語、例えばC言語などでは、配列はメモリ上に単純に値がズラリと書かれているだけです。arr[x]とすると、単にそのポインタにある値が得られるだけです。が、Javaの配列では、値がメモリ空間に書かれているだけではなく、スーパークラス(Object)の情報があり、ソッドを呼び出すことができます。したがって、これはあきらかにオブジェクトです。

wantanton
質問者

お礼

丁重なご回答誠にありがとうございます!!!! >機能とは、ありていにいってしまえば「メソッド」のことです なるほど!!! この記述は、「オブジェクト」の概念を理解する上で重要なキーワードですね! 助かります!

その他の回答 (5)

  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.6

正しいといえば正しいです。 というより、何をオブジェクトと見なすかということに 明確な決まりはありません。 例えばJavaでは普通の整数がオブジェクトとして扱われていませんが、 他の言語では整数をオブジェクトとして扱うものがあります。 そのような言語の中には、四則演算を操作(メソッド)として扱うものがあります。 例えば3+5という式は、 「3というオブジェクトが、5というオブジェクトを引数にとって、 +という操作(メソッド)を実行した」 と解釈されます 結局、オブジェクト指向言語では、 オブジェクトっぽい要素があるものは全て、 オブジェクトとして扱えるんです。 ただ、オブジェクトっぽい要素があるものを あえてオブジェクトとして扱わないのもありです。 そこはプログラマーの自由です。 Java言語は純粋なオブジェクト指向言語ではないです。 そのため、Java言語だけやっていると、オブジェクトが何なのか 分からなくなるかもしれません。 他のオブジェクト指向言語に触れてみると オブジェクトについて理解しやすくなるかもしれません。

wantanton
質問者

お礼

丁重なご回答誠にありがとうございます!!!! オブジェクト指向って難しいですね、、

回答No.5

単順に、そうならざるを得ないからです。 それはどういう事かというと、配列は値型として運用する事ができないという事です。 値型は全て倍精度(64bit)以内のメモリ領域内で運用できる事を前提に設計されています。 一方配列はその限りではありません。なので参照型(オブジェクト型)として取り扱います。 値型変数が実値を保持するのに対し、 参照型変数はヒープ上に生成されたオブジェクトの先頭アドレスを参照として保持します。 この辺りの考え方は開発者がポインタやメモリ領域管理を意識せざるを得ない、 C言語等の言語を先に少しかじっておくと理解しやすいかもしれませんね。

wantanton
質問者

お礼

丁重なご回答誠にありがとうございます!!!! C言語やってみようかな、、

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.4

日本語がまずいね。 ×「……といいますが、その意味では配列もオブジェクトです」 これだと、JAVA の配列は本来オブジェクトじゃないみたいに受け取れるよね。 ○「……といいますが、その意味でも配列はオブジェクトです」 「その意味では」(限定) 「その意味でも」(追加) JAVA 言語仕様上も、実際の JAVA 実行環境の実装上も、配列はオブジェクトだけれど、 http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/reflect/Array.html データを保持するし、たくさんメソッド(機能)が定義されてるでしょう?

wantanton
質問者

お礼

丁重なご回答誠にありがとうございます!!!! 配列において、「データ」とはなんだろう、、 int型の配列だったら、数値の並びがデータですよね?

  • nobuoka
  • ベストアンサー率69% (23/33)
回答No.3

基本的に他の方の回答で述べられているとおり、言語仕様で 「配列はオブジェクトである」 と定められているので、配列はオブジェクトです。 Java の言語仕様の配列に関しては参照 URL を見てみてください。 また、そもそも言語仕様においてそのように定められている根拠は何であるか、という疑問もあるかもしれませんが、それも No.1 の方が仰るように、配列に対して Object クラスで定義されたメソッドの呼び出しを行うことが可能であるなど、おおよそ一般的なオブジェクト指向プログラミングの分野における 「オブジェクト」 という言葉に適合するようなものであり、「Java 言語における配列はオブジェクトである」 という定義はごく自然なものであると思います。

参考URL:
http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#27803
wantanton
質問者

お礼

丁重なご回答誠にありがとうございます!!!! 参考URLは、ちょっと僕には難しすぎるようです、、 英語ずらり、、 メソッド=機能だったんですね。 これを知れたのが収穫です!

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

もっと単純な理由よ。 配列がオブジェクトである ではなく 配列をオブジェクトとして扱う が正解。 1+1を2とする というのとおなじね。

wantanton
質問者

お礼

いつも丁重なご回答誠にありがとうございます!!!! 僕は難しく考えすぎちゃうんですよね、、 askaaskaさんみたいに、シンプルに事柄をとらえられるようになりたい、、

関連するQ&A

  • 「オブジェクト」について質問

    javaの参考書に、オブジェクトについて、「データとそれを操作する機能をひとまとまりにしたものをオブジェクトといいますが、」と書いてありました。 質問1:抽象的過ぎて、上記の解説がわたしにはよく理解できませんでした。 初心者の私にも理解できるように、身近な具体例を織り交ぜてご説明頂けましたら幸いです。 ^ 質問2:「データとそれを操作する機能をひとまとまり」と書いてありますが、これを配列に例えると、 例えば、int [] n ={3,5,7};という配列があったとします。これに int data=n[0];のように配列要素へのアクセスを行うと、配列は自身の持ってるデータを渡しますよ?これはまさしく「配列はデータを持っていて(上記例ではint型の数値を持っていて)、それを操作する機能(上記例では配列の0番目の要素を変数dataに引き渡す)を持っている」こういうことですか?

    • ベストアンサー
    • Java
  • 配列について質問

    僕はjava初心者です、ご回答は優しくお願いします! 質問1:配列の定義について、本質的には「配列要素の集合」のことでしょうか? 違ったら、その本質をご教示ください。 質問2:配列は、オブジェクトだとjavaの参考書には書かれていました。そして、オブジェクトとは、「データとそれを操作する機能(メソッド)がひとまとまりになったもの」とも書いてありました。 ここでいう「データ」とはなんですか?配列要素のことですか? 質問3:配列とは、ヒープ内にある「配列要素の集合を保管した箱」でしょうか?

    • ベストアンサー
    • Java
  • IntArrayクラスのプログラムを組んでいるのですが・・・

    javaプログラミングで以下の内容を満たす、IntArrayクラスを作成しています。 ・インスタンス変数  int型の配列data ・コンストラクタ  (1)int型の配列を受け取り、そのコピーを内部的に保持する  (2)第1引数で指定された要素数を持つ配列を確保し、全ての要素に初期値として第2引数で指定された値をセットする  (3)第1引数で指定された要素数を持つ配列を確保し、全ての要素に初期値としてゼロをセットする ・メソッド  (1)sort   内部的に保持している配列を、引数の値がtrueであれば昇順、falseであれば降順にソートする  (2)length   IntArrayが保持している配列の要素数を取得する  (3)getElement   引数に指定された要素番号の値を取得する  (4)setElement   第1引数に指定された要素番号に第2引数で指定された値を格納する   (5)getArray   IntArrayが保持している配列のコピーを取得する 実際にプログラムを組んでみたのですが、※の部分が冗長だと指摘を受けました。 しかしどのように修正したらよいかわかりません。 どうかアドバイスなどをよろしくお願いいたします。 package java_Lesson; import java.util.Arrays; /** * int型の配列dataの要素を取得、あるいは操作するクラス */ class IntArray { private int[] data; /** * int型の配列を受け取り、そのコピーを内部的に保持する * * @param args コピー元となる配列 */ IntArray(int[] args) { data = (int[])args.clone(); } /** * 第1引数で指定された要素数を持つ配列を確保し、 * 全ての要素に初期値として第2引数で指定された値をセットする * * @param arg1 配列の要素数 * @param arg2 配列の初期値 */ IntArray(int arg1, int arg2) { this(arg1); /* ※ */ for (int index = 0; arg1 > index; index ++) { data[index] = arg2; } } /** * 第1引数で指定された要素数を持つ配列を確保し、 * 全ての要素に初期値としてゼロをセットする * * @param arg 配列の要素数 */ IntArray(int arg) { data = new int[arg]; } /** * 内部的に保持している配列を昇順、あるいは降順にソートする * * @param arg trueであれば昇順、falseであれば降順にソート */ void sort(boolean arg) { Arrays.sort(data); if (arg) { return; } int array = data.length - 1; for (int index = 0; array > index; index ++, array --) { int temp = data[index]; data[index] = data[array]; data[array] = temp; } } /** * IntArrayが保持している配列の要素数を取得する * * @return 配列の要素数 */ int length() { return data.length; } /** * 引数に指定された要素番号の値を取得する * * @param arg 返す要素の要素番号 * * @return 配列dataの要素番号argの値 */ int getElement(int arg) { return data[arg]; } /** * 第1引数に指定された要素番号に第2引数で指定された値を格納する * * @param arg1 値を格納する要素番号 * @param arg2 配列に格納する値 */ void setElement(int arg1, int arg2) { data[arg1] = arg2; } /** * IntArrayが保持している配列のコピーを取得する * * @return 配列dataのコピー */ int[] getArray() { return data.clone(); } }

    • ベストアンサー
    • Java
  • ヒープソート 追加操作について

    配列を用いたヒープにデータを追加する。 この際、データの追加は配列の最後の要素に新たなデータを加え、ヒープ条件を満足するまで 親子間でデータの交換を行う。 要素数をnとしたら、この追加操作にかかる最悪時間計算量を求めよ。 この問題なのですが、ただ単にデータを一つ追加する際の最悪時間計算量だったら、 オーダlog n ですが、 追加する要素がnこだったら、n* log nになります。 この問題ではどちらがより適切なのでしょうか? どなたかご教授ください。

  • C++言語の配列の呼び方,動的・可変長の違い

    C++言語での配列の名称についての質問です. int Array[10]; みたいに宣言する普通の配列は「静的配列」と呼びますよね.コンパイル時に定数で要素数を指定しておかなければならないからですよね. これに対して,new[]演算子を用いて int *Array = new int[n]; といったように確保する配列はなんと呼ばれるのでしょうか. 実行後に変数を用いてその要素数を動的に指定できるので,「動的配列」と呼ぶ人が周りには多いです(「ポインタ配列」とも).しかし,C言語でのrealloc関数みたいに,直接に配列長を変化させるといったようなことはできませんよね. (改めてnew[]してmemcpy()すれば出来るのでしょうが) そこで,配列長をプログラム中で自在に変化させる方法としてstd::vectorを利用する方法がありますよね.このvectorを「動的配列」と呼ぶ人もいました. 私は,new[]したものは動的に要素数を指定できるがその後の配列長は固定であり,vectorはいつでも配列長が可変なので int Array[10]; ・・・静的固定長配列(静的配列) int n = 10; int *Array = new[n]; ・・・動的固定長配列 std::vector<int> v; ・・・可変長配列 と呼んでいるのですが,一般的にはそれぞれどのように呼ばれるのでしょうか. また,最近はstd::arrayをいうものを知りました.これについてもどのように呼ばれるのか,教えてください. よろしくお願いいたします.

  • 配列の頭に要素を挿入する方法

    初心者です。配列でご教授お願いします。 インデックス0からひとつずつ要素をずらして、配列の一番前に要素を挿入するにはどうしたらいいのでしょうか? int[] a = new int[10]; int n = a.length; for (int i = n-1; i < 1; i--){ a[i] = a[i-1]; } a[0] = 新しい要素 といった感じで書いたのですが、どうもループの中が実行されていないようなのです。 よろしくお願いいたします。

  • stdClass Objectを連想配列のように個別に取り出したい。

    $aに連想配列が入っているとして、 print "<pre>";print_r($a);print "</pre>";   ↓ array (  [Return] => array   (    [data] => あいうえお   ) ) このように連想配列の入った変数から データを個別に取るとき このように、配列名を並べると print $a['Return']['data']; ↓ あいうえお と、個別に取り出せますが、 あるデータをprint_rすると、 stdClass Object (  [Return] => stdClass Object   (    [data] => あいうえお   ) ) というふうに"stdClass Object"として出力されてしまいました。 stdClass Objectのデータを個別に取り出したいのですが 連想配列のような記述だとうまく取り出せません。 stdClass Objectのデータはどのようにして個別に取り出すのでしょうか?

    • ベストアンサー
    • PHP
  • 配列について質問

    質問1:配列とは、本質的には、「データの集合であり、配列要素の集合」ということでしょうか? 質問2:配列型は、例えば「 int[] 」であれば、「int型の配列」といえ、土台には他のデータ型があるということでしょうか?

    • ベストアンサー
    • Java
  • C#

    C#の質問です。 『クラスIntArrayを作成し、作成したクラスが正常に動作するか検証するためのクラスを作成してください。』 というプログラムを組んでおり、クラスIntArrayとその動作を検証するクラスを作成したのですが、クラスIntArrayについて「問題文で指定された通りに作成されていません。」という指摘を受けました。 何度も見直したのですが、どの部分が指定された通りになっていないのか、自分では見つけることが出来ませんでした; 私が作成したクラスIntArrayとその仕様については、下記のとおりです。 お分かりになる方がいらっしゃいましたら、ご助言をお願いいたします。 【クラスIntArray 仕様】 <インスタンス変数> int型の配列data <コンストラクタ> 以下の3種類を用意します。 ・int型の配列を受け取り、そのコピーを内部的に保持します。 ・第1引数で指定された要素数を持つ配列を確保し、全ての要素に初期値として第2引数で指定された値をセットします。 ・第1引数で指定された要素数を持つ配列を確保し、全ての要素に初期値としてゼロをセットします。 <メソッド> ・Sort 内部的に保持している配列を、引数の値がtrueであれば昇順、falseであれば降順にソートする ・Length IntArrayが保持している配列の要素数を取得する ・GetElement 引数に指定された要素番号の値を取得する ・SetElement 第1引数に指定された要素番号に第2引数で指定された値を格納する ・GetArray IntArrayが保持している配列のコピーを取得する 【作成したクラスIntArray】 using System; private int[] data; public IntArray(int[] array) { this.data = new int[array.Length]; array.CopyTo(this.data, 0); for (int index = 0; index < this.data.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(this.data[index]); } Console.WriteLine(); } public IntArray(int args1, int args2) { int[] myarray = new int[args1]; for (int index = 0; index < args1; index++) { myarray[index] = args2; } for (int index = 0; index < myarray.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(myarray[index]); } Console.WriteLine(); } public IntArray(int args) { int[] myarray = new int[args]; for (int index = 0; index < args; index++) { myarray[index] = 0; } for (int index = 0; index < myarray.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(myarray[index]); } Console.WriteLine(); } public void Sort(bool flg) { Array.Sort(this.data); //昇順にソート if (!flg)  //降順にソート { Array.Reverse(this.data); } for (int index = 0; index < this.data.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(this.data[index]); } Console.WriteLine(); } public int Length() { return this.data.Length; } public int GetElement(int args) { int getvalue = this.data[args]; return getvalue; } public void SetElement(int args1, int args2) { this.data[args1] = args2; } public void GetArray() { for (int index = 0; index < this.data.Length; index++) { // 先頭の要素以外を出力する場合 if (index > 0) { Console.Write(", "); } Console.Write(this.data[index]); } Console.WriteLine(); } }

  • 2次元配列とじゃんけんアルゴリズムについて質問

    以下の、過去に私が質問した、2次元配列とじゃんけんアルゴリズムの質問のURLの見た上で私の質問に答えてください。 URL:ttp://okwave.jp/qa/q7038056.html 質問: public static int janken(int n){ int[][]tb1={ {9,9,9,9}, {9,0,1,2}, {9,2,0,1}, {9,1,2,0} }; int m=rand3(); System.out.println(m+" "); return tb1[n][m]; } 上記ソースコードの2次元配列について、何故「9」という数字があるのか、又1次元目と2次元目の要素数が「4」あるのかわかりませんでした。 上記のURL先で頂いた回答を元に、私は理解に努めました。その理解が正しいか判定してください。 「この勝敗表をあらわす2次元配列について、それぞれのプレイヤーのジャンケンの『手』を要素番号『1,2,3』に対応させている。つまり要素番号『0』は使っていないので、要素数が4つ必要。 また、要素番号『0』は、このjankenプログラムでは不要なので、何の値が入っても構わないので、『たまたま』9が入ってるだけで、9という数字に特に意味はない。因みに、その2つの要素番号に対応する要素が勝敗の結果の番号になる。」 こういうことでしょうか?

    • ベストアンサー
    • Java