Javaの勉強7 クラス、オーバーロード、オーバーライド、継承

最終更新:2005/10/02

トップページへ戻る
前へ 次へ

7-1. クラス

    ・クラス

      クラスとは、オブジェクトの設計図にあたる部分です。
      実際のプログラミングでは、クラスを基に「インスタンス」を生成します。
      クラスの構成要素には、「フィールド」、「メソッド」、「コンストラクタ」があります。

    ・フィールド

      フィールドとは、言い換えると変数であり、クラスの動作を定義するためのパラメータです。
      フィールドに対し、private修飾子をつけて、他のクラスからアクセスできないようにします。
      隠蔽したフィールドにアクセスする場合は、かならずアクセッサー・メソッドを使います。

     ・this変数について

       自身のオブジェクトを指します。this変数を使うことによって、フィールドとローカル変数を明確に
       区別することができます。

    ・メソッド

      メソッドは、オブジェクトを操作するものです。

    ・コンストラクタ

      オブジェクトを生成する時点で、オブジェクトに対する初期処理を行うことができます。
      コンストラクタの宣言には、必ずクラス名を使います。


    ・標準的なクラスの記述は、以下のようになります。

      [修飾子] class [クラス名] {

          // フィールド
          [型] [変数名] = [値];

          // コンストラクタ
          [クラス名] (パラメータ) {
              処理;
          }

          // メソッド
          戻り値 = [メソッド](引数) {
              処理;
          }
      }

        サンプル (ファイル名はProduct.javaで保存して、コンパイルだけを行ってください。)
// 商品クラス
public class Product {

     // フィールド

     private String code;    // 商品コード
     private String name;    // 商品名
     private int price;      // 商品定価

    // コンストラクタ

    Product() {
    }

    Product(String code, String name, int price) {
        setCode(code);
        setName(name);
        setPrice(price);
    }

    // メソッド

    // 商品コードの値を設定
    void setCode(String code) {
        this.code = code;
    }

    // 商品コードの取得
    String getCode() {
        return this.code;
    }

    // 商品名の価を設定
    void setName(String name) {
        this.name = name;
    }

    // 商品名の取得
    String getName() {
        return this.name;
    }

    // 商品定価に値を設定
    void setPrice(int price) {
        if ( price < 0 ) {
            this.price = 0;
            return;
        }
        this.price = price;
    }

    // 商品定価の値を取得
    int getPrice() {
        return this.price;
    }
}
        サンプル (ファイル名はTestProduct.javaで保存してください。)
// 商品クラスをテストするクラス
public class TestProduct {
    public static void main(String[] args) {
        Product p1 = new Product("0001","日経ソフトウェア",980);
        Product p2 = new Product("0002","日経システム構築",1300);
        Product p3 = new Product("0003","日経NETWORK",1200);

        System.out.println(" code = " + p1.getCode());
        System.out.println(" name = " + p1.getName());
        System.out.println(" price = " + p1.getPrice());

        System.out.println(" code = " + p2.getCode());
        System.out.println(" name = " + p2.getName());
        System.out.println(" price = " + p2.getPrice());

        System.out.println(" code = " + p3.getCode());
        System.out.println(" name = " + p3.getName());
        System.out.println(" price = " + p3.getPrice());
    }
}
        TestProductの実行結果
 code = 0001
 name = 日経ソフトウェア
 price = 980
 code = 0002
 name = 日経システム構築
 price = 1300
 code = 0003
 name = 日経NETWORK
 price = 1200


7-2. オーバーロード

    同じメソッド名でシグネチャの異なるメソッドをクラス内に同時に宣言することを、
    メソッドのオーバーロードといいます。
    
    サンプル (7-1で作成した product.javaにコード下記のコードを追加して、コンパイルしてください。)

    Product(String code, String name, String price) {
        setCode(code);
        setName(name);
        setPrice(price);
    }

    void setPrice(String price) {
        setPrice(Integer.parseInt(price));
    }

// 商品クラス
public class Product {

     // フィールド

     private String code;    // 商品コード
     private String name;    // 商品名
     private int price;      // 商品定価

    // コンストラクタ

    Product() {
    }

    Product(String code, String name, int price) {
        setCode(code);
        setName(name);
        setPrice(price);
    }

    Product(String code, String name, String price) {
        setCode(code);
        setName(name);
        setPrice(price);
    }

    // メソッド

    // 商品コードの値を設定
    void setCode(String code) {
        this.code = code;
    }

    // 商品コードの取得
    String getCode() {
        return this.code;
    }

    // 商品名の価を設定
    void setName(String name) {
        this.name = name;
    }

    // 商品名の取得
    String getName() {
        return this.name;
    }

    // 商品定価に値を設定
    void setPrice(int price) {
        if ( price < 0 ) {
            this.price = 0;
            return;
        }
        this.price = price;
    }

    void setPrice(String price) {
        setPrice(Integer.parseInt(price));
    }

    // 商品定価の値を取得
    int getPrice() {
        return this.price;
    }
}
public class TestProduct2 {
    public static void main(String[] args) {
        Product p1 = new Product("0001","日経ソフトウェア",980);
        Product p2 = new Product("0002","日経システム構築","1300");
        Product p3 = new Product("0003","日経NETWORK",1200);

        System.out.println(" code = " + p1.getCode());
        System.out.println(" name = " + p1.getName());
        System.out.println(" price = " + p1.getPrice());

        System.out.println(" code = " + p2.getCode());
        System.out.println(" name = " + p2.getName());
        System.out.println(" price = " + p2.getPrice());

        System.out.println(" code = " + p3.getCode());
        System.out.println(" name = " + p3.getName());
        System.out.println(" price = " + p3.getPrice());
    }
}
    TestProduct2の実行結果
 code = 0001
 name = 日経ソフトウェア
 price = 980
 code = 0002
 name = 日経システム構築
 price = 1300
 code = 0003
 name = 日経NETWORK
 price = 1200


7-3. 継承

    既存のクラスをもとに新しいクラスを定義することができます。
    継承する際に使用される既存のクラスをスーパークラス(親クラス)といいます。
    継承して作成される新しいクラスをサブクラス(子クラス)といいます。
    また、サブクラスをスーパークラスとして継承することもできます。
    Java言語では、単一継承のみをサポートしています。

    ・this()

      コンストラクタに対してオーバーロードする場合は、this()を使います。

    ・super()

      スーパークラスのコンストラクタを使う場合は、super()を使います。

    サンプル
// 割引商品クラス
public class DiscountProduct extends Product {
    private int discount;    // 商品割引率

    // コンストラクタ

    DiscountProduct(String code, String name, int price) {
        this(code, name, price, 0);
    }

    DiscountProduct(String code, String name, String price) {
        this(code, name, price, "0");
    }

    DiscountProduct(String code, String name, int price, int discount) {
        super(code, name, price);
        setDiscount(discount);
    }

    DiscountProduct(String code, String name, String price, String discount) {
        super(code, name, price);
        setDiscount(discount);
    }

    // メソッド

    // 商品値引率に値を設定します。
    void setDiscount(int discount) {
        if ( discount < 0 || discount > 100 ) {
            this.discount = 0;
            return;
        }
        this.discount = discount;
    }

    void setDiscount(String discount) {
        setDiscount(Integer.parseInt(discount));
    }

    // 商品値引率の値を取得
    int getDiscount() {
        return this.discount;
    }
}
public class TestProduct3 {
    public static void main(String[] args) {
        DiscountProduct p1 = new DiscountProduct("0001","日経ソフトウェア",980);
        DiscountProduct p2 = new DiscountProduct("0002","日経システム構築",1300,10);
        DiscountProduct p3 = new DiscountProduct("0003","日経NETWORK",1200,30);

        System.out.println(" code = " + p1.getCode());
        System.out.println(" name = " + p1.getName());
        System.out.println(" price = " + p1.getPrice());
        System.out.println(" discount = " + p1.getDiscount());

        System.out.println(" code = " + p2.getCode());
        System.out.println(" name = " + p2.getName());
        System.out.println(" price = " + p2.getPrice());
        System.out.println(" discount = " + p2.getDiscount());

        System.out.println(" code = " + p3.getCode());
        System.out.println(" name = " + p3.getName());
        System.out.println(" price = " + p3.getPrice());
        System.out.println(" discount = " + p3.getDiscount());
    }
}
    TestProduct3の実行結果
 code = 0001
 name = 日経ソフトウェア
 price = 980
 discount = 0
 code = 0002
 name = 日経システム構築
 price = 1300
 discount = 10
 code = 0003
 name = 日経NETWORK
 price = 1200
 discount = 30


7-4. オーバーライド

    オーバーライドは、サブクラス内でスーパークラスで定義しているメソッドと同じ
    シグネチャでメソッドを再定義することです。

    サンプル (7-3で作成した DiscountProduct.javaにコード下記のコードを追加して、コンパイルしてください。)

    // 商品の売値を取得
    int getPrice() {
        return (int)(super.getPrice() * (1 - this.discount / 100.0));
    }
// 割引商品クラス
public class DiscountProduct extends Product {
    private int discount;    // 商品割引率

    // コンストラクタ

    DiscountProduct(String code, String name, int price) {
        this(code, name, price, 0);
    }

    DiscountProduct(String code, String name, String price) {
        this(code, name, price, "0");
    }

    DiscountProduct(String code, String name, int price, int discount) {
        super(code, name, price);
        setDiscount(discount);
    }

    DiscountProduct(String code, String name, String price, String discount) {
        super(code, name, price);
        setDiscount(discount);
    }

    // メソッド

    // 商品値引率に値を設定します。
    void setDiscount(int discount) {
        if ( discount < 0 || discount > 100 ) {
            this.discount = 0;
            return;
        }
        this.discount = discount;
    }

    void setDiscount(String discount) {
        setDiscount(Integer.parseInt(discount));
    }

    // 商品値引率の値を取得
    int getDiscount() {
        return this.discount;
    }

    // 商品の売値を取得
    int getPrice() {
        return (int)(super.getPrice() * (1 - this.discount / 100.0));
    }
}
    TestProduct3の実行結果
 code = 0001
 name = 日経ソフトウェア
 price = 980
 discount = 0
 code = 0002
 name = 日経システム構築
 price = 1170
 discount = 10
 code = 0003
 name = 日経NETWORK
 price = 840
 discount = 30
トップページへ戻る
前へ 次へ
Copyright© 2005- Naoyuki Sano. All rights reserved.