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

削除された内容 追加された内容
M Semi-Brace がページ「Java/文法 クラス」を「Java/文法/クラス」に移動しました: 下位ページ
内容を整理
1 行
== 入門定義方法 ==
例1:
下記コードの
<syntaxhighlight lang="Java" line>
 
// ファイル名: ClassSyntax.java
;抜粋(後述)
/**
<syntaxhighlight lang="Java">
* 商品を表す。
class syoulis {
*/
String hinmei ; // 品名
class Product {
int kakaku; // 価格
/**
};
* 値段
</syntaxhighlight>
*/
 
String name;
のように、class を用いて、変数のパターンをまとめる事ができる。(読者がもし標準[[C言語]]を知っていれば、C言語の[[C言語/構造体・共用体|構造体]]に文法が近い。)
 
/**
インタプリタ・モードでの利用は不可能である(もしくは、できたとしても著しく困難)。上記の用途でクラスを使う場合、コンパイルして利用する。
* 価格
 
*/
;sample.java
int price;
<syntaxhighlight lang="Java">
}
// 商品リストのつもりで「syoulis」
class syoulis {
String hinmei ; // 品名
int kakaku; // 価格
};
 
class sampleClassSyntax {
public static void main(String[] args) {
syoulisProduct gyunyu;milk //= 牛乳new Product();
gyunyumilk.name = new syoulis()"牛乳";
gyunyumilk.hinmeiprice = "牛乳"150;
gyunyu.kakaku = 150;
 
syoulisProduct jyusu;juice //= ジュースnew Product();
jyusujuice.name = new syoulis()"ジュース";
jyusujuice.hinmeiprice = "ジュース"200;
jyusu.kakaku = 200;
 
System.out.println(milk.name + "テストの値段は" + milk.price + "円");
System.out.println(juice.name + "の値段は" + juice.price + "円");
}
}
</syntaxhighlight>
 
=== 実行結果 ===
;コンパイルおよび実行方法
牛乳の値段は200円
<pre>
ジュースの値段は150円
javac sample.java
java sample
</pre>
 
=== 解説 ===
;実行結果
4行目から14行目までがクラス{{code|Product}}の、16行目から31行目までがクラス{{code|ClassSyntax}}の定義である。{{code|Product}}では、{{code|Product}}の実体 (インスタンスと呼ばれる) ごとに異なる値を持つことができる変数 (以下、インスタンス変数と呼ぶ) として{{code|name}}と{{code|price}}が宣言されている。{{code|ClassSyntax}}の{{code|main}}「メソッド」では、{{code|Product}}のインスタンスをnew演算子 (new演算子に到達したときに実行される処理群を「コンストラクタ」の中に記述することができる。後述) を用いて生成することができる。
テスト
 
== インスタンス変数 ==
さて、読者は、classファイルというのがある事を知っているだろう。java ではコンパイルの際に、クラスファイルという中間ファイルが作られるのだと知っているだろう。
<syntaxhighlight lang="java" line start="4">
 
class Product {
実は、上記コードの商品リストのように、単に変数をまとめるための目的でクラスを利用しただけでも、コンパイル時にクラスファイルが作られる。
/**
 
* 値段
 
*/
なので、上記 sample.java をコンパイルすると、ソースコード中にclassが2つあるので、作成されるクラスファイルも2つであり。
// インスタンス変数
:sample.class ファイルと、
String name;
:syoulis.class ファイルという、
2個のファイルがコンパイルによって作成される。
/**
 
* 価格
また、インタプリタ・モードでの使用は不可能である。インタプリタのコマンドを入力しても、エラーになる。
*/
 
// インスタンス変数
 
int price;
main関数などでのクラスの利用のための代入の際には、下記のように先にクラス変数(gyunyu がクラス変数である)を宣言してから、そのあと new 宣言をしてから、代入していくのが、Java特有の決まりである。
 
// インスタンス変数ではない
<pre>
static int staticField;
syoulis gyunyu; // クラス変数の宣言
gyunyu = new syoulis(); // new 宣言
gyunyu.hinmei = "牛乳"; // 代入
gyunyu.kakaku = 150; // 代入
</pre>
 
書式は
<pre>
クラス名 クラス変数名; // クラス変数の宣言
クラス変数名 = new クラス名(); // new 宣言
クラス変数名.メンバ名 = 代入したいデータ ; // 代入
</pre>
である。
 
「メンバ」とは、クラスのパターン定義での、変数などの各データのこと。
 
== C・C++その相違点 ==
C++ のclass とは違い、publicとかprivate といったアクセス修飾子は、Java では不要。
 
クラス変数に各データを代入していく方法は、C言語などの構造体および構造体変数の関係に近い。相違点としてJavaでは
 
<pre>
gyunyu = new syoulis();
</pre>
 
のように new 宣言をする必要がある。
 
== メソッド ==
=== 概要 ===
Javaのクラスでは、変数(へんすう)だけでなく関数(かんすう)も所有できる。なお関数(かんすう)とは、処理をまとめたモノの事である。
 
プログラミング業界では、なんらかのクラスに従属している関数のことを「メソッド」という。または、クラスに類似したものに従属している関数のことも「メソッド」という。
 
Javaではmain関数すらも、規格上、なんらかのクラスにmainは所属していなければいけないので、main関数もメソッドである。
 
そもそもJava では、(C言語やC++のような)クラスに所属していない形の むき出しの関数は、作成できない。Javaの関数はすべて、なんらかのクラスに所属する必要があり、よってJavaの関数はすべてメソッドである。
 
というか、市販の入門書では「関数」という用語を用いていない入門書も多く、最初から「メソッド」という用語で説明している場合も多い。
 
=== 具体例 ===
;コード例
<syntaxhighlight lang="Java">
class keisan {
public static void kansu() {
System.out.println("関数の中");
}
};
 
class sample {
public static void main(String[] args) {
keisan.kansu();
}
}
</syntaxhighlight>
 
== メソッド ==
;実行結果
先述のコードで、17行目から30行目は、{{code|main}}を{{code|ClassSyntax}}のメソッドとして定義している。
関数の中
クラスの中にしかメソッドを定義することができない。
 
;文法の解説
Javaの「関数」というかメソッドを使用するために呼び出すには、
クラス名.メソッド名()
でアクセスできる。
 
その関数(メソッド)が所属しているクラスを先に記述し、ドット記号(.)のあと、メソッド名を記述し、最後に <code>( )</code> がつく。
 
メンバ変数へのアクセスとは違い、メソッドのアクセスには最後に <code>( )</code> がつくのを忘れないように。
 
 
;余談
C++の構造体およびクラスも関数を所有できるので、C++には「メソッド」的な機能がある(C++では「メンバ関数」と呼んでいる)。なお、標準C言語にはメソッドが無く、そもそも標準Cの構造体は関数を所有できないし、また標準Cにクラスは無い。
 
=== 引数 ===
Javaにかぎらず、メソッドや関は引数を呼び出す持つこきに、値を渡して、渡した値に応じた なんらかの処理をさせる事もできる。
また、そうやって受け渡しされる値やその入れ物の変数のことを、'''引数'''(ひきすう)という。
 
例2:
下記のコードは、単に足し算をする処理を、プログラマー自作のメソッドを使って再現している。
<syntaxhighlight lang="java" line start="4" highlight="15-18,23-25">
 
class Product {
;コード例
/**
<syntaxhighlight lang="Java">
* 値段
class keisan {
*/
public static void kansu(int a,int b) {
String name;
System.out.println( a + b );
}
/**
};
* 価格
 
*/
class sample {
int price;
public static void main(String[] args) {
keisan.kansu(3, 5);
}
 
/**
* 標準出力に商品の内容を書き出す
*/
void printDetails() {
System.out.println(this.name + "の値段は" + this.price + "円");
}
/**
* 価格を更新する
* @param newPrice 新しい価格
*/
void setPrice(int newPrice) {
this.price = newPrice;
}
}
</syntaxhighlight>
 
== コンストラクタ ==
;表示結果
コンストラクタをうまく用いると、クラスの初期化を簡略化することができる。
8
 
例3:
<syntaxhighlight lang="java" line start="4" highlight="12-15,20-21">
class Product {
/**
* 値段
*/
String name;
/**
* 価格
*/
int price;
Product(String name, int price) {
this.name = name;
this.price = price;
}
}
 
class ClassSyntax {
Javaに限らず、一般にプログラミングでは、main関数など呼び出す側では、
public static void main(String[] args) {
keisan.kansu(3, 5);
Product milk = new Product("牛乳", 150);
のように、どのような値を渡すかを、具体値で指定しないければならない。
Product juice = new Product("ジュース", 200);
 
System.out.println(milk.name + "の値段は" + milk.price + "円");
受け取る側のメソッドでは、
System.out.println(juice.name + "の値段は" + juice.price + "円");
public static void kansu(int a,int b) {
}
の丸カッコ ( ) の中のコードのように、型(int の部分)と変数名(a や b の部分)を指定しなければならない。
 
当然、渡す側の数値の型と、渡される側の変数の型とは、一致しなければいけない。(もし一致させないとエラーになる場合もある。)
 
たとえば、もし受け取り側を int で定義しているのに、もし小数「1.41」を渡したら、コンパイル結果はエラーになる。
 
== 未分類 ==
オブジェクト指向言語であるjava言語は、ソースの再利用と有効活用が主な利点である。そのために、できる限り一つの機能を実装する際には、それらを一つのくくりにまとめることが重要になる。そうすることで、ソースコードを見やすくするばかりか、オブジェクト指向の基本的な機能であるインスタンス化が容易に行われる。
 
例えば、以下のようなクラスを定義する。
 
<syntaxhighlight lang="Java">
public class family {
 
int menber;
int money:
 
boolean loves;
 
public family(int member,int money,boolean loves) {
return Exception(e);
}
 
}
</syntaxhighlight>
 
メソッドと違う点は、名前がクラスの名前と同じでなければならないという制約がつくこと、戻り値の宣言をしてはならないことだ。
このfamilyクラスは処理内容は別として。その内部のソースコードがあらわす一連の振る舞いがひとくくりになって活用しやすい形である。こういった機能は次のようにして再利用しやすくなっている。
 
family f = new family(6,4000000,true);
 
familyクラスをインスタンスという、即席で作り出したコピーのような空間にfというオブジェクト変数を用意する。こうすることでfというオブジェクトを呼び出すことで直接におおもとのfamilyクラスにアクセスすることなく、同じ様なふるまいの機能を再利用できる。こうすることでオブジェクトという単位でクラスという一連のソースコードのまとまりを別な形で利用できるというメリットがある。