「Java/文法/クラス」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
用語の統一
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
敬体に統一。
タグ: 2017年版ソースエディター
38 行
 
; 解説
: 4行目から14行目までがクラス{{code|Product}}の、16行目から31行目までがクラス{{code|ClassSyntax}}の定義である
: {{code|Product}}では、{{code|Product}}の実体 (インスタンスと呼ばれます) ごとに異なる値を持つことができる変数 (以下、フィールドと呼ぶ) として{{code|name}}と{{code|price}}が宣言されています
: {{code|ClassSyntax}}の{{code|main}}「メソッド」では、{{code|Product}}のインスタンスをnew演算子 (new演算子に到達したときに実行される処理群を「コンストラクタ」の中に記述することができます
: コンストラクタについては後述) を用いて生成することができます
 
上記コードは、javacコマンドでコンパイルすると動きます。javaコマンドでインタプリタ的に実行してもエラーになります。
76 行
 
 
フィールドの所属先は、それのインスタンスを生成した呼出側である。よって、呼出側・呼び出され側のクラスと異なる第三の別クラスからは、直接的にはインスタンスの値を読み取ることはできないません
 
一方、クラス変数の所属先は、クラス自体にあります。この仕様のため、比較的に容易に、第三のクラスからも値の読み書きがしやすい。
 
 
145 行
 
== インスタンスの配列化 ==
実際にクラスを使う場合は、インスタンスを配列にすると便利な場合も多い。その場合、配列の要素数だけ new 宣言が必要である
 
要素数が100個とか多い場合にnew を 100個書くのは非現実的であるが、安心してもいいことに for 文を使うことで機械にnew宣言を繰り返しさせる仕組みがあるので大丈夫である
 
下記のようなコードになります
 
;ClassSyntax.java:<syntaxhighlight lang=java line>
class Product {
String name;
int price;
}
159 行
class ClassSyntax {
public static void main(String[] args) {
Product[] drink = new Product[2];
Product[] drink = new Product[2];
for(int i = 0; i < drink.length; i++){
drink[i] = new Product();
}
drink[0].name = "牛乳";
drink[0].price = 150;
 
for for(int i = 0; i < drink.length; i++) {
drink[1].name = "コーヒー牛乳";
drink[1i].price = 180new Product();
}
 
System.out.println(drink[0].name + "の単価は" + drink[0].price += "牛乳");
System.out.println(drink[1].name + "の単価は" + drink[10].price += "円")150;
 
}
drink[01].name = "コーヒー牛乳";
drink[01].price = 150180;
 
for (int i = 0; i < drink.length; i++) {
System.out.println(drink[i].name + "の単価は" + drink[i].price + "円");
}
}
}
</syntaxhighlight>
181 行
コーヒー牛乳の単価は180円
</syntaxhighlight>
 
.length プロパティの冒頭「l」は小文字である。間違えて大文字にするとエラーになる。
 
== メソッド ==
先述のコードで、17行目から30行目は、{{code|main}}を{{code|ClassSyntax}}のメソッドとして定義しています
javaではクラスの中にしかメソッドを定義することができないません
 
なお、特にクラスを新規作成する必要もなく単にメソッドを使いただけの場合なら、Hello Worldの定形文にあるクラス以外に新しいクラスを作る必要は無く、Hello Worldを作るときに書かれた既存のクラス内にそのまま追加したいメソッドを書けば済む。
 
ひとつのクラス内にメソッドはいくつあっても構わないです
 
おおむね、C言語でいう「関数」に相当しま。Javaにはメソッドとは別に「関数」という概念は無いです
 
=== 引数 ===
メソッドは引数を持つことができます
 
;例2:<syntaxhighlight lang=java line start="4" highlight="15-17,23-25">
例2:
:<syntaxhighlight lang=java line start="4" highlight="15-17,23-25">
class Product {
/**
226 ⟶ 223行目:
}
</syntaxhighlight>
 
※ 上記コードをコンパイルしても何も表示されないが正常である。mainもprintln命令も無いので何も表示されない。
 
なお、クラスの宣言において、メソッドなどの処理を除いた残りの <code>String name;</code> や<code>int price;</code>などの要素の型のみを定義している部分のことを「フィールド」という。後述するコンストラクタのあるコードまで考えれば、クラスからメソッドやコンストラクタなどを除いた残りの、要素の型を宣言している部分のことがフィールドである。
 
 
:構文 <syntaxhighlight lang=java>
class クラス名 {
 
アクセス修飾子 データ型1 フィールド名1;
アクセス修飾子 データ型2 フィールド名2;
voidアクセス修飾子 データー型 メソッド名() {
// そのメソッドの処理;
}
246 ⟶ 238行目:
 
== コンストラクタ ==
コンストラクタを用いるとクラスの初期化を定型化でき、内部構造の詳細を隠蔽できます
コンストラクタの名前はクラス名です。
メソッドの定義の際、メソッド名をクラス名と同じにすると、それがコンストラクタとして認識される。なお、コンストラクタでは戻り値の宣言をしてはならない。
コンストラクタの戻値はありません。
 
;例:<syntaxhighlight lang=java line start="4" highlight="12-15,20-21">
例3:
:<syntaxhighlight lang=java line start="4" highlight="12-15,20-21">
class Product {
/**
282 ⟶ 274行目:
</syntaxhighlight>
 
Javaのコンストラクタはひとつのクラスにつき原則ひとつですが、例外的に、引数の型によって処理を変える場合はそれぞれの引数の型に応じたコンストラクタを別々に書けます。よって、引数の型で処理を変える場合は、ひとつのクラス内のコンストラクタの個数が複数になります
 
== コンストラクターのあるクラスのインスタンスの配列化とprivateフィールド・メソッド ==