Java/文法 クラス

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

入門[編集]

下記コードの

抜粋(後述)
class syoulis {
  String hinmei ; // 品名
  int kakaku; // 価格
};

のように、class を用いて、変数のパターンをまとめる事ができる。(読者がもし標準C言語を知っていれば、C言語の構造体に文法が近い。)

インタプリタ・モードでの利用は不可能である(もしくは、できたとしても著しく困難)。上記の用途でクラスを使う場合、コンパイルして利用する。

sample.java
// 商品リストのつもりで「syoulis」
class syoulis {
  String hinmei ; // 品名
  int kakaku; // 価格
};

class sample {
  public static void main(String[] args) {
      syoulis gyunyu; // 牛乳
      gyunyu = new syoulis();
      gyunyu.hinmei = "牛乳";
      gyunyu.kakaku = 150;

      syoulis jyusu; // ジュース
      jyusu = new syoulis();
      jyusu.hinmei = "ジュース";
      jyusu.kakaku = 200;

      System.out.println("テスト");
   }
}
コンパイルおよび実行方法
javac sample.java
java sample
実行結果
テスト

さて、読者は、classファイルというのがある事を知っているだろう。java ではコンパイルの際に、クラスファイルという中間ファイルが作られるのだと知っているだろう。

実は、上記コードの商品リストのように、単に変数をまとめるための目的でクラスを利用しただけでも、コンパイル時にクラスファイルが作られる。


なので、上記 sample.java をコンパイルすると、ソースコード中にclassが2つあるので、作成されるクラスファイルも2つであり。

sample.class ファイルと、
syoulis.class ファイルという、

2個のファイルがコンパイルによって作成される。

また、インタプリタ・モードでの使用は不可能である。インタプリタのコマンドを入力しても、エラーになる。


main関数などでのクラスの利用のための代入の際には、下記のように先にクラス変数(gyunyu がクラス変数である)を宣言してから、そのあと new 宣言をしてから、代入していくのが、Java特有の決まりである。

      syoulis gyunyu; // クラス変数の宣言
      gyunyu = new syoulis(); // new 宣言
      gyunyu.hinmei = "牛乳"; // 代入
      gyunyu.kakaku = 150; // 代入

書式は

      クラス名 クラス変数名; // クラス変数の宣言
      クラス変数名 = new クラス名(); // new 宣言
      クラス変数名.メンバ名 = 代入したいデータ ; // 代入

である。

「メンバ」とは、クラスのパターン定義での、変数などの各データのこと。

C・C++その相違点[編集]

C++ のclass とは違い、publicとかprivate といったアクセス修飾子は、Java では不要。

クラス変数に各データを代入していく方法は、C言語などの構造体および構造体変数の関係に近い。相違点としてJavaでは

      gyunyu = new syoulis();

のように new 宣言をする必要がある。

メソッド[編集]

概要[編集]

Javaのクラスでは、変数(へんすう)だけでなく関数(かんすう)も所有できる。なお関数(かんすう)とは、処理をまとめたモノの事である。

プログラミング業界では、なんらかのクラスに従属している関数のことを「メソッド」という。または、クラスに類似したものに従属している関数のことも「メソッド」という。

Javaではmain関数すらも、規格上、なんらかのクラスにmainは所属していなければいけないので、main関数もメソッドである。

そもそもJava では、(C言語やC++のような)クラスに所属していない形の むき出しの関数は、作成できない。Javaの関数はすべて、なんらかのクラスに所属する必要があり、よってJavaの関数はすべてメソッドである。

というか、市販の入門書では「関数」という用語を用いていない入門書も多く、最初から「メソッド」という用語で説明している場合も多い。

具体例[編集]

コード例
class keisan {
    public static void kansu() {
        System.out.println("関数の中");
    }
};

class sample {
    public static void main(String[] args) {
        keisan.kansu(); 
    }
}
実行結果
関数の中
文法の解説

Javaの「関数」というかメソッドを使用するために呼び出すには、

クラス名.メソッド名()

でアクセスできる。

その関数(メソッド)が所属しているクラスを先に記述し、ドット記号(.)のあと、メソッド名を記述し、最後に ( ) がつく。

メンバ変数へのアクセスとは違い、メソッドのアクセスには最後に ( ) がつくのを忘れないように。


余談

C++の構造体およびクラスも関数を所有できるので、C++には「メソッド」的な機能がある(C++では「メンバ関数」と呼んでいる)。なお、標準C言語にはメソッドが無く、そもそも標準Cの構造体は関数を所有できないし、また標準Cにクラスは無い。

引数[編集]

Javaにかぎらず、メソッドや関数を呼び出すときに、値を渡して、渡した値に応じた なんらかの処理をさせる事もできる。 また、そうやって受け渡しされる値やその入れ物の変数のことを、引数(ひきすう)という。

下記のコードは、単に足し算をする処理を、プログラマー自作のメソッドを使って再現している。

コード例
class keisan {
    public static void kansu(int a,int b) {
        System.out.println( a + b );
    }
};

class sample {
    public static void main(String[] args) {
        keisan.kansu(3, 5); 
    }

}
表示結果
8


Javaに限らず、一般にプログラミングでは、main関数など呼び出す側では、

keisan.kansu(3, 5); 

のように、どのような値を渡すかを、具体値で指定しないければならない。

受け取る側のメソッドでは、

 public static void kansu(int a,int b) {

の丸カッコ ( ) の中のコードのように、型(int の部分)と変数名(a や b の部分)を指定しなければならない。

当然、渡す側の数値の型と、渡される側の変数の型とは、一致しなければいけない。(もし一致させないとエラーになる場合もある。)

たとえば、もし受け取り側を int で定義しているのに、もし小数「1.41」を渡したら、コンパイル結果はエラーになる。

未分類[編集]

オブジェクト指向言語であるjava言語は、ソースの再利用と有効活用が主な利点である。そのために、できる限り一つの機能を実装する際には、それらを一つのくくりにまとめることが重要になる。そうすることで、ソースコードを見やすくするばかりか、オブジェクト指向の基本的な機能であるインスタンス化が容易に行われる。

例えば、以下のようなクラスを定義する。

public class family {

    int menber;
    int money:

    boolean loves;

    public family(int member,int money,boolean loves) {
        return Exception(e);
    }

}

このfamilyクラスは処理内容は別として。その内部のソースコードがあらわす一連の振る舞いがひとくくりになって活用しやすい形である。こういった機能は次のようにして再利用しやすくなっている。

family f = new family(6,4000000,true);

familyクラスをインスタンスという、即席で作り出したコピーのような空間にfというオブジェクト変数を用意する。こうすることでfというオブジェクトを呼び出すことで直接におおもとのfamilyクラスにアクセスすることなく、同じ様なふるまいの機能を再利用できる。こうすることでオブジェクトという単位でクラスという一連のソースコードのまとまりを別な形で利用できるというメリットがある。