8.クラスの基本

  1. オブジェクト指向プログラミング(OOP:Object-Oriented Programming)

      オブジェクト指向(object-oriented)とは、オブジェクト同士の相互作用としてシステムの振る舞いをとらえる考え方であり、オブジェクト指向プログラミングではプログラムの構造をオブジェクト群の相互作用とその雛形であるクラス群の関係として捉える。 クラス(class)はオブジェクトの設計図にあたるもので、抽象データ型(abstract data type)の一つ。 クラスから生成したオブジェクトのことをインスタンス(instance)という。 クラスには、インスタンスの保持するデータ(フィールド、メンバ変数)と操作(メソッド、メンバ関数)が記述される。 クラスは、情報隠蔽(カプセル化:encapsulation)・継承(インヘリタンス:inheritance)・多態性(ポリモルフィズム:polymorphism)などの、オブジェクト指向プログラミングにおける重要な概念を実現する。

  2. クラスの宣言(declaration)メソッドの定義(definition)
    [修飾子] class クラス名
    {
    	// メンバー(member)
    	// ・フィールド(field)(0個以上)・・・メンバ変数
    	[修飾子] 型名 フィールド名 ;
    	// ・メソッド(method)(0個以上)・・・メンバ関数
    	[修飾子] 戻り値の型 メソッド名(仮引数リスト)
    	{
    		 ;
    	
    		return  ;
    	}
    }
    
    • クラス(class)はフィールド(field)(変数(variable))とメソッド(method)を
      メンバー(member)として持つ
    • 複数のクラスが宣言されているファイルをコンパイルすると
      それぞれのクラスファイルが生成される
      (ただしpublicクラスの場合はクラス名と同じ主ファイル名でなければならない!)
    • 実行時にクラスローダーが必要なクラスファイル読み込んで実行する
    • フィールドは初期化することができる
      型名 フィールド名 =  ;
      
      デフォルト(初期化しない場合)の初期値は 0 (boolean型の場合はfalse)
    • 引数の無いメソッドは メソッド名()と定義し、 引数が複数ある場合には , で区切る
    • 戻り値(return value)として return ; で評価した式の値を、呼び出し元に返す
      戻り値の無いメソッドの型は void で、 return; で呼び出し元に戻る
    • [修飾子]はオプション(アクセス修飾子static修飾子final修飾子


  3. 変数宣言とオブジェクト(インスタンス)の生成(インスタンス化)
    クラス名 変数名;
    変数名 = new クラス名();
    
    // あるいはまとめて、
    クラス名 変数名 = new クラス名();
    

    インスタンス


     

    クラス
  4. メンバアクセス、メソッドの呼び出し
  5. メソッド(method)
    // 斜辺の長さを求めるメソッド
    // 平均を求めるメソッド

9.クラスの機能

  1. カプセル化(アクセス制限)その1
    アクセス修飾子(modifier)機能備考
    private クラス外からアクセスできないフィールドに指定することが多い
    なし 同じパッケージに含まれるクラス内からアクセスできる(パッケージアクセス)
    public クラス外からアクセスできるメソッドに指定することが多い
  2. メソッドの多重定義(オーバーロード:overloading)
    • 同じクラスの中に同じ名前の複数のメソッドを定義する
    • メソッドの仮引数の型・個数が異なるようにしておかなければならない
    • 実引数の型・個数に応じて同じ名前のメソッドを使い分けることができる
    • このオーバーロードは、オーバーライドと並んで、多態性(ポリモルフィズム)を実現する仕組み
  3. コンストラクタ(constructor)
    [修飾子] クラス名(引数リスト)
    {
    	:
    }
    
    • クラス宣言に含めておくと、オブジェクト生成時に自動的に実行される
    • 各オブジェクトに対する単純な初期化以上の処理を行なうための仕組み
    • コンストラクタもオーバーロードできる
    • コンストラクタの先頭に this(); をおくと
      別のコンストラクタを呼び出すことができる
    • コンストラクタを省略すると、デフォルトコンストラクタ(default constructor)
      (引数の無いコンストラクタ)が用意され、自動的に呼び出される
      クラス名() { }
  4. メンバーの関連付け
    static修飾子(modifier)機能備考
    なし各オブジェクトに関連付けられる インスタンスフィールド(instance field)
    インスタンス変数(instance variable)
    インスタンスメソッド(instance method)
    staticクラス全体に関連付けられる クラスフィールド(class field)、staticフィールド(static field)
    クラス変数(class variable)、static変数(static variable)
    クラスメソッド(class method)、staticメソッド(static method)
  5. ローカル変数(local variable)

10.クラスの利用

  1. クラスライブラリ(class library)
  2. その他のクラス
  3. クラス型の変数(参照型の変数)
  4. オブジェクトの配列
    1. オブジェクト型の配列を準備する
    2. インスタンスを作成して、配列要素がそれらを指すように代入する

11.新しいクラス

  1. 継承(inheritance)

     既存のクラスを利用して新しいクラスを作成することができる。 このように新しいクラスを作成することをクラスを拡張(extends)するといい、 元になる既存クラスをスーパークラス(superclass)、新しいクラスをサブクラス(subclass)と呼ぶ。 新しいクラスは既存クラスのメンバーを受け継ぐ(継承:inheritance)ので、 新しく必要となる性質や機能だけをメンバーとして追加すればよい。 一つのスーパークラスから複数のサブクラスを作成したり、サブクラスをさらに拡張して新しいクラスを作成することもできる。 但し、2つ以上のスーパークラスを持つ多重継承(multiple inheritance)は許されていない。

    [修飾子] class サブクラス名 extends スーパークラス名
    {
    	サブクラスに新たに追加するメンバー
    
    	サブクラスのコンストラクタ引数リスト)
    	{
    
    	}
    }
    
  2. カプセル化(アクセス制限)その2
    修飾子(modifier)機能備考
    private クラス外からアクセスできない
    サブクラスからもアクセスできない!
    フィールドに指定することが多い
    なし 同じパッケージに含まれるクラス内からアクセスできる(パッケージアクセス)
    protected サブクラスからはアクセスできる!スーパークラスのフィールドに指定することが多い
    public クラス外からアクセスできるメソッドに指定することが多い
  3. メソッドのオーバーライド(overriding)

     スーパークラスと全く同じメソッド名・引数の数・型をもつメソッドを定義することもでき、 スーパークラスのメソッドに代わって機能する。 戻り値の型はスーパークラスのものと同じかそのサブクラスでなければならない。

  4. Objectクラス