アプリ版:「スタンプのみでお礼する」機能のリリースについて

javaのObject型配列について質問です。
現在、文字列と数値の両方を同じ配列に格納しようとしているのですが
うまくいきません。
Object[][] a = new Object[2][3];
for(int i = 0; i < 2; i++){
for(int j = 0; j <3; j++){
a[i][j] = new Object();

のようなかんじでいいのでしょうか?
<Q1>これだけだとa[i][j]に値をいれていませんよね?

<Q2>Objectはそのままで文字列と数値両方いれれるのでしょうか?

あるサイトでは
Student[][] a = new Student[2][3];
for(int i = 0; i < 2; i++){
for(int j = 0; j <3; j++){
a[i][j] = new Student();

class Student{
int num;
String name;

Student(int num,String name){
this.num=num;
this.name=name;
}

Studentクラスをつくり、Student型の配列を定義するとかいてありました。

<Q3>このStudentクラスではなにをしているのでしょうか?

<Q1>、<Q2>、<Q3>それぞれ回答よろしくお願いします。

A 回答 (3件)

>double型をInteger等のラッパークラスに入れずとも、


>自動変換されるということでよろしいのでしょうか?

所謂 auto boxing というものです。キャストさえ不要です。
分かりにくくなるので、あまりお勧めしませんが・・・

>Studentクラス内にa[i][j]に入れたい詳しい数値、
>文字列を設定してあげればいいのでしょうか?

そうですね。細かなところを突っ込んでおくと、

まず、Stdudent のコンストラクタを書くと、デフォルトコンストラクタが
消えるので new Student() とは書けなくなります。
必要ならデフォルトコンストラクタを書いてください。こういうの

public Student () {
//
}

それと、クラスには普通は public を、フィールドには private を、
コンストラクタやメソッドには public を付けて宣言し
フィールドには必要に応じてpublicなアクセッサを付けるのが良いです。

本当に狭い範囲でしか使わないオブジェクトなら publicも privateも
アクセッサもなしでよいですが、いろいろなツールに大丈夫かと
注意されるでしょう(^^;

この辺はアクセス制御やカプセル化をゆっくり学んでゆけばわかります。
    • good
    • 0

><Q1>これだけだとa[i][j]に値をいれていませんよね?



Object型のオブジェクトの参照を代入しています。
Object型は特に何も情報を持つ能力は持たないので、
代入しても特に意味はないです。

文法的には何も問題がありませんが、こういうコードを
見ることはないですね。

><Q2>Objectはそのままで文字列と数値両方いれれるのでしょうか?

「そのままで」が、「Object型のオブジェクトの参照を代入した
配列要素に何か代入する」という意味なら、
Object型の配列要素に何かを代入すれば、最初に
代入した Object型のオブジェクトの参照は上書きされて消えてしまいます。
つまり、Object型のオブジェクトの参照の代入は、徒労であったということです。

String型のオブジェクト(の参照)はそのままObject型の配列要素に代入できます。
int 型や double 型などのプリミティブ型は Integer型、Double型の
オブジェクト(参照型のインスタンス)に自動的に変換されて、
その参照が代入されます。

><Q3>このStudentクラスではなにをしているのでしょうか?

この場合、Student は数値と文字列を保持する参照型です。
「なにをしている」というのはどういう意味なんでしょう?

配列に何かデータを代入するなら、int型等のプリミティブ型を使うか
このStudent型のようなデータを保持できる型を使います。

そうするしか、データを保持する方法はありません。

配列は Object型のままで、それの配列要素に Student型のオブジェクトの
参照を代入することも可能ですが、間違いが起こりやすいので
推奨されていません。最初から配列要素に Student型のみを入れるのが
分かっているなら、配列は Student型で宣言し、Student型を代入して
使います。
    • good
    • 0
この回答へのお礼

詳しい回答ありがとうございます!
このObject型をつかうのであれば
double型をInteger等のラッパークラスに入れずとも、自動変換されるということでよろしいのでしょうか?

書き換えるのであれば下記のようにして、
Studentクラス内にa[i][j]に入れたい詳しい数値、文字列を設定してあげればいいのでしょうか?

Student[][] a = new Student[2][3];
for(int i = 0; i < 2; i++){
for(int j = 0; j <3; j++){
a[i][j] = new Student();

class Student{
int num;
String name;

Student(int num,String name){
this.num=num;
this.name=name;
}

質問ばかりで申し訳ないです

お礼日時:2016/11/30 02:11

autoboxing があるからあんまり考えることはないような気がするんだけどなぁ.... 「うまくいきません」が, 具体的になに

がどう「うまくいかない」のかわからんのだけど.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!