クラスとメソッドの例

  1. 例1:クラスとメソッドの例

    1. 目的

      簡単なクラスの構成例を通して、データとメソッドの定義と利用法を紹介します。

    2. クラスの定義

       次は、文字列 sei(姓)、mei(名)、と整数 age を定義したクラス Name です。
      class Name{
       String sei;
       String mei;
       int age;
      }
      別のクラスで、Name のインスタンス(少し広い意味でオブジェクトともいいます)n1 を定義し、new でそのデータ領域を確保します。これで、n1.sei="Kono"; のように代入して値を設定できます。
         Name n1=new Name();
         n1.sei="Kono";
         n1.mei="Miyuki";
         n1.age=18;

    3. コンストラクタ

       このクラスに、クラス名と同じ メソッド(C言語の関数)を定義しますと、new でオブジェクトを生成するとき、このコンストラクタが呼び出されます。生成するとき呼び出されるメソッドなので、コンストラクタと呼ばれます。コンストラクタは戻り値がありませんので、型を指定する必要はありません。
       ここでは、引数のないNameと引数のあるNameの二つのコンストラクタがあります。前者は
        Name n1=new Name(); 
      の場合、後者は、
           Name n2=new Name("Kano","Yosio",20);
      の場合呼び出されます。同一の引数を持っているコンストラクタが呼び出されることになります。
       後者では、引数で渡される値を、クラスの変数に代入しています。最後の this.age=age; の左辺の this は Name クラス自身を参照します。実は、 sei=s; も、正確には this.sei=s; と書くべきですが、省略されています。最後の this.age=age; の場合、thisがないと、ageの名前が引数のageかクラスの変数か区別ができません。
       
      class Name{
       String sei;
       String mei;
       int age;
       
       Name(){
              
       }
       
       Name(String s,String m,int age){
              sei=s;
              mei=m;
              this.age=age;
       }
      }
       
       コンストラクタはこの2種なので、
       Name n2=new Name("Kano","Yosio");
      や、
       Name n2=new Name("Kano","Yosio",20.0);
      などで、newはできません。同じ引数の構成をもつコンストラクタが存在しないからです。二つ目は、20.0 と最後の値が 少数になっていることに注意して下さい。

    4. toString() メソッド

       このメソッドは特別なメソッドで、
       System.out.println( n1)
      のように、クラスの出力が要求された場合、この、toString() メソッドが利用されます。ここでは、次のようにクラスのデータを文字列で表現します。

       public String toString(){
              return sei + ":" + mei + "(" +age + ")";
       }
      システムで定義されたほとんどのクラスにはこの toString() が定義されていますから、クラスを丸ごと出力できます。

    5. young() メソッド

       これは、このクラス独特のメソッドで、特定の条件を満たすと、trueが返ります。戻り値が boolean ですから、
       if (n1.young())
      のように、条件式としてそのまま利用できます。

    6. ソース

       以下にソース全体をのせます。Name と method の二つのクラスから構成されています。main() で、二つの方法で、クラスNameのオブジェクトを生成しています。toStrig() を定義しましたから、System.out.println(n1); でいきなり出力しています。これは、System.out.println(n1.toString()) と同じです。

      class Name{
       String sei;
       String mei;
       int age;
       
       Name(){
          
       }
       
       Name(String s,String m,int age){
          sei=s;
          mei=m;
          this.age=age;
       }
       
       public boolean young(){
          if(age<=18) return true;
          return false;
       }
       
       public String toString(){
          return sei + ":" + mei + "(" +age + ")";
       }
       
      }//Name
      
      
      public class method {
          public static void main(String[] args) {
              Name n1=new Name();
              n1.sei="Kono";
              n1.mei="Miyuki";
              n1.age=18;
              System.out.println(n1);
              if (n1.young()) System.out.println("young");
              
              Name n2=new Name("Kano","Yosio",20);
              System.out.println(n2);
          }
      }

      実行結果
      Kono:Miyuki(18)
      young
      Kano:Yosio(20)

  2. 例2:変数の有効範囲


    1. 目的

      メソッドや変数を定義したとき、変数が利用できる範囲、や引数の影響範囲について調べます。メソッドの外側で変数が宣言されている場合、その変数はグローバル変数と呼ばれ、クラスの内側のメソッド全体で利用されます。次の例で、変数 j はグローバル変数です。

       piblic class { param static int j = 1; }

      これに対し、メソッドの内部で定義されている変数はローカル変数で、そのメソッドの中だけで利用できます。次の例で、変数 i はローカル変数です。

       public static void main(String[] args) { int i = 3; }

    2. 引数の変数

       メソッドの引数は、そのメソッドのローカル変数になります。

      void func(int i,Point pt)
       の場合、int i,Point pt はローカル変数を宣言しています。

       メソッドが呼び出されると、呼び出す文で指定されている値が対応する引数の変数にコピーされます。つまり、引数となっている変数は、初期化されることになります。
       prm.func( i, p1);
      のばあい、main() の i の値が func の i にコピーされます。func() の中で i の値を変更しても、main() の変数 i は変化しません。
       
       一方 p1 はオブジェクトの参照子で、Point型の領域の番地(ポインタ)を記録しています。この値が pt にコピーされますから、func() の中で、pt.x の値を変更すると、main() の p1.x の値も変化します。ただし、pt の値そのものを変更しても、main() の p1の値は変化しません。

    3. static宣言

       staticを付加して宣言すると、その宣言に対する「実体:メモリ領域」が作成されます。main() メソッドはあらかじめ作成しておく必要がありますから、 static は必須です。先頭の int j=1; にも static がありますから、あらかじめ生成されています。 j に static を付加しておかないと、main() から参照できません。j の領域があらかじめ確保されていないからです。

       func() にはstatic がありません。したがって、main() から func() を直接呼べません。呼び出すには、
       param prm=new param();
      で、このクラスのインスタンス(実体:メモリ領域)を作成しておき、
       prm.func(i,p1);
      で、par の中の、func() を呼び出します。もし、
       static void func(int i,Point pt)
      と、func( ) に static をつけておけば、func() を直接呼び出すことができます。

    4. ソース
       以下にソース全体をのせます。Name と method の二つのクラスから構成されています。main() で、二つの方法で、クラスNameのオブジェクトを生成しています。toStrig() を定義しましたから、System.out.println(n1); でいきなり出力しています。これは、System.out.println(n1.toString()) と同じです。

      import java.awt.*;
      
      public class param {
          
          static int j=1;
      
          public static void main(String[] args) {
              param prm=new param();
              int i=3;
              Point p1=new Point(1,2);
              prm.func(i,p1);
              System.out.println("local:i="+i+", global:j="+j);
              System.out.println("p1:"+p1);
          }
          
          void func(int i,Point pt){
              i=0;
              j=2;
              pt.x=0;
          }
      }

      実行結果

      local:i=3, global:j=2
      p1:java.awt.Point[x=0,y=2]