コンテンツにスキップ

02-3: INSTANCEメソッドプログラミング(自クラス呼出し)

前節では、静的な(Staticな)メソッドベースでメソッドを管理しました
今度はインスタンスメソッドを管理してみましょう。
インスタンスメソッドは、クラスを利用して、インスタンスオブジェクトを生成する必要があります。
クラスからインスタンスを生成する方法は以下の通りです。

String instance = new String();

いつもの文字列型の宣言では、文字列のStringクラスからinstanceという名前のインスタンスを生成しています。
では、自クラス呼び出しではどうなるかというと...

public class InstanceMethodTest{
  public static void main(String[] args){
    InstanceMethodTest instance = new InstanceMethodTest(); //自クラス呼び出し
    instance.iMethod(); //メソッド呼び出し
  }
  //インスタンスメソッド `iMethod`
  void iMethod(){
    System.out.println("Hello, Instance!");
  }
}

これは、普段文字列型からstr.subString()str.charAt()をしているのと同じ要領です。

グローバル変数・メンバー変数(フィールド)とローカル変数、変数スコープについて

変数は、宣言する場所によって、変数を確認できる範囲(スコープ)が異なります。また、Javaにはこのほかにアクセス修飾子(publicprivateなど)を付記することも可能です。

カテゴリ 用語名 宣言例 説明 スコープ
一般的用語として グローバル変数 - どこからでも確認できる変数 プログラム上の全てのところから
一般的用語として ローカル変数 - 宣言した場所でのみ確認できる変数 宣言した関数やメソッドの範囲内
Javaにおける メンバー変数(フィールド) int hoge; グローバル変数相当。クラスのメンバーになるので。クラス宣言の直下のブロックをフィールドというので、フィールド変数とも。 クラスのインスタンス全体から。
Javaにおける クラス変数 static int hoge; グローバル変数相当。クラスに紐づくので。 クラス全体から。
Javaにおける ローカル変数 int hoge; 一般的ローカル変数相当。 インスタンスのメソッド内やブロック内({})でのみ確認できる

Javaにおいて、例えば、メンバー変数でstatic int hogebarと宣言したとします。あるメソッド内で、同じくint hogebarと宣言したとします。そうすると、hogebarでアクセスできるのは、後者のほうです。

public class ScopeTest{
  static int hogebar = 10; // クラス変数
  int hogefoo = 10; //メンバー変数
  public static void main(String[] args){
    int hogebar = 100;
    System.out.println("hogebar ->"+ hogebar);
    ////////////////////////////////
    // インスタンス生成
    ScopeTest instance = new ScopeTest(); // 自クラス呼び出し
    System.out.println("instance.hogefoo ->"+ instance.hogefoo);
    System.out.println("call -> instance.controlHoge();");
    instance.controlHoge();
    System.out.println("instance.hogefoo ->"+ instance.hogefoo);
  }
  ////////////////////////////////////
  // インスタンスメソッドの場合
  void controlHoge(){
    int hogefoo = 1;
    System.out.println("hogefoo ->"+ hogebar);
    System.out.println("this.hogefoo ->"+ this.hogefoo);
    this.hogefoo = 10000;
    System.out.println("this.hogefoo = 10000;");
    System.out.println("this.hogefoo ->"+ this.hogefoo);
  }
}

インスタンス変数で同様のことがあった場合は、thisをつけることによって、メンバー変数を

サンプルプログラム

public class InstanceMethodTest{
  /*
  ¦* インスタンス変数`ins`と
  ¦* クラス変数`cls`を定義
  ¦*/
  String ins = "hoge";
  static String cls = "foo";

  public static void main(String[] args){
    /*
     * 4つのインスタンスを生成
     */
    InstanceMethodTest i1 = new InstanceMethodTest();
    InstanceMethodTest i2 = new InstanceMethodTest();
    InstanceMethodTest i3 = new InstanceMethodTest();
    InstanceMethodTest i4 = new InstanceMethodTest();
    /*
     * 値を操作しながら、順に呼び出してみる
     */
    i1.iMethod();       // 1. `i1`(インスタンス操作なし)を呼び出してみる
    i2.ins = "fuga";    // 2. インスタンス`i2`の`ins`を変える
    i2.iMethod();       // 3. `i2`(`ins`操作済)を呼び出してみる
    cls = "bar";        // 4. クラス変数`cls`を変更してみる
    i3.iMethod();       // 5. `i3`(インスタンス操作なし)を呼び出してみる
    i4.iMethod("hoga"); // 6. `i4`を呼び出してみる
    i4.iMethod();
  }
  /*
   * iMethod - 変数を表示する
   */
  void iMethod(){
    System.out.println("CLS変数:" + cls);
    System.out.println("INS変数:" + ins);
    System.out.println("-----------------------------");
  }
  /*
   * iMethod - 変数を表示する
   * @param str this.insに挿入する文字列
   */
  void iMethod(String str){
    String ins = "moo";
    this.ins = str;
    System.out.println("CLS変数:" + cls);
    System.out.println("INS変数:" + ins);
    System.out.println("THIS.INS変数:" + this.ins);
    System.out.println("-----------------------------");
  }
}

最終更新日: 2021年4月30日