Java - コンストラクター


■ページ目次

Top

クラスに固有なメンバ(static 属性)

Top

this 変数

this変数を使います
  1. 上記"Product.java"で、this変数を使って書き換えてください。("Product.java")
    1. // 0906
    2. // 商品クラスです。
    3. // ひとつの商品に対するフィールドやフィールドを操作するためのメソッドを
    4. // 提供しています。
    5. public class Product {
    6. private String code; // 商品コード
    7. private String name; // 商品名
    8. private int price; // 商品定価
    9. // 商品コードに値を設定します。
    10. void setCode(String code) {
    11. this.code = code;
    12. }
    13. // 商品コードの値を取得します。
    14. String getCode() {
    15. return this.code;
    16. }
    17. // 商品名に値を設定します。
    18. void setName(String name) {
    19. this.name = name;
    20. }
    21. // 商品名の値を取得します。
    22. String getName() {
    23. return this.name;
    24. }
    25. // 商品定価に値を設定します。
    26. void setPrice(int price) {
    27. if (price < 0) {
    28. this.price = 0;
    29. return;
    30. }
    31. this.price = price;
    32. }
    33. // 商品定価の値を取得します。
    34. int getPrice() {
    35. return this.price;
    36. }
    37. }

    □ 実行結果

    $ java TestProduct
    商品のインスタンスを生成しました。 p1 = Product@f6a746
       code = A001
       name = パソコン
      price = 188000
    商品のインスタンスを生成しました。 p2 = Product@15ff48b
       code = P001
       name = プリンター
      price = -24000
    

コンストラクター

例題:商品管理システムのコンストラクター
  1. 上記"Product.java"で、オブジェクトを生成するときに商品コード、商品名、商品定価を初期値として渡すようにします。このためのコンストラクターを追加してください。("Product.java")
    1. // 0907
    2. // 商品クラスです。
    3. // ひとつの商品に対するフィールドやフィールドを操作するためのメソッドを
    4. // 提供しています。
    5. public class Product {
    6. private String code; // 商品コード
    7. private String name; // 商品名
    8. private int price; // 商品定価
    9. // 商品クラスのコンストラクター。
    10. Product(String code, String name, int price) {
    11. this.code = code;
    12. this.name = name;
    13. this.price = price;
    14. }
    15. :
    16. }
  2. 以下の"TestProduct.java"を入力してコンパイル・実行してください。
    1. // 0907
    2. // 商品クラスをテストするクラスです。
    3. public class TestProduct {
    4. public static void main(String[] args) {
    5. Product p1 = new Product("A001", "パソコン", 188000);
    6. System.out.println("商品のインスタンスを生成しました。 p1 = " + p1);
    7. System.out.println(" code = " + p1.getCode());
    8. System.out.println(" name = " + p1.getName());
    9. System.out.println(" price = " + p1.getPrice());
    10. Product p2 = new Product("P001", "プリンター", -24000);
    11. System.out.println("商品のインスタンスを生成しました。 p2 = " + p2);
    12. System.out.println(" code = " + p2.getCode());
    13. System.out.println(" name = " + p2.getName());
    14. System.out.println(" price = " + p2.getPrice());
    15. }
    16. }

    □ 実行結果

    $ java TestProduct
    商品のインスタンスを生成しました。 p1 = Product@f6a746
       code = A001
       name = パソコン
      price = 188000
    商品のインスタンスを生成しました。 p2 = Product@15ff48b
       code = P001
       name = プリンター
      price = -24000
    

コンストラクター中でセッターを使います
  1. 上記"Product.java"で、コンストラクター中でセッターを使うようにしてください。("Product.java")
    1. // 0908
    2. // 商品クラスです。
    3. // ひとつの商品に対するフィールドやフィールドを操作するためのメソッドを
    4. // 提供しています。
    5. public class Product {
    6. private String code; // 商品コード
    7. private String name; // 商品名
    8. private int price; // 商品定価
    9. // 商品クラスのコンストラクター。
    10. Product(String code, String name, int price) {
    11. setCode(code);
    12. setName(name);
    13. setPrice(price);
    14. }
    15. :
    16. }

    □ 実行結果

    $ java TestProduct
    商品のインスタンスを生成しました。 p1 = Product@f6a746
       code = A001
       name = パソコン
      price = 188000
    商品のインスタンスを生成しました。 p2 = Product@15ff48b
       code = P001
       name = プリンター
      price = 0
    
Top
デフォルト・コンストラクター
Top

メソッドのオーバーロード

コマンドラインから商品の各値を指定します
  1. 以下の"TestProduct.java"を入力してコンパイル・実行してください。なお、商品コード、商品名、商品定価はコマンドラインから指定します。
    1. // 0909
    2. // 商品クラスをテストするクラスです。
    3. public class TestProduct {
    4. public static void main(String[] args) {
    5. Product p1 = new Product(args[0], args[1], Integer.parseInt(args[2]));
    6. System.out.println("商品のインスタンスを生成しました。 p1 = " + p1);
    7. System.out.println(" code = " + p1.getCode());
    8. System.out.println(" name = " + p1.getName());
    9. System.out.println(" price = " + p1.getPrice());
    10. }
    11. }

    □ 実行結果

    $ java TestProduct B001 CD-ROM 20000
    商品のインスタンスを生成しました。 p1 = Product@f6a746
       code = B001
       name = CD-ROM
      price = 20000
    
商品管理システムでのコンストラクターやセッターのオーバーロード
  1. 上記"Product.java"で、setPrice()メソッドなどの引数をString型でも可能にしてください。("Product.java")
    1. // 0910
    2. // 商品クラスです。
    3. // ひとつの商品に対するフィールドやフィールドを操作するためのメソッドを
    4. // 提供しています。
    5. public class Product {
    6. private String code; // 商品コード
    7. private String name; // 商品名
    8. private int price; // 商品定価
    9. // 商品クラスのコンストラクター。
    10. Product(String code, String name, int price) {
    11. setCode(code);
    12. setName(name);
    13. setPrice(price);
    14. }
    15. // 商品クラスのコンストラクター。
    16. Product(String code, String name, String price) {
    17. setCode(code);
    18. setName(name);
    19. setPrice(price);
    20. }
    21. // 商品コードに値を設定します。
    22. void setCode(String code) {
    23. this.code = code;
    24. }
    25. // 商品コードの値を取得します。
    26. String getCode() {
    27. return this.code;
    28. }
    29. // 商品名に値を設定します。
    30. void setName(String name) {
    31. this.name = name;
    32. }
    33. // 商品名の値を取得します。
    34. String getName() {
    35. return this.name;
    36. }
    37. // 商品定価に値を設定します。
    38. void setPrice(int price) {
    39. if (price < 0) {
    40. this.price = 0;
    41. return;
    42. }
    43. this.price = price;
    44. }
    45. // 商品定価に値を設定します。
    46. void setPrice(String price) {
    47. setPrice(Integer.parseInt(price));
    48. }
    49. // 商品定価の値を取得します。
    50. int getPrice() {
    51. return this.price;
    52. }
    53. }
  2. 以下の"TestProduct.java"を入力してコンパイル・実行してください。
    1. // 0910
    2. // 商品クラスをテストするクラスです。
    3. public class TestProduct {
    4. public static void main(String[] args) {
    5. Product p1 = new Product(args[0], args[1], args[2]);
    6. System.out.println("商品のインスタンスを生成しました。 p1 = " + p1);
    7. System.out.println(" code = " + p1.getCode());
    8. System.out.println(" name = " + p1.getName());
    9. System.out.println(" price = " + p1.getPrice());
    10. }
    11. }

    □ 実行結果

    $ java TestProduct B001 CD-ROM 20000
    商品のインスタンスを生成しました。 p1 = Product@f6a746
       code = B001
       name = CD-ROM
      price = 20000
    
Top
実習

  1. コマンドライン引数をチェックするクラス"ArgsUtil.java"を改造し、コマンドラインで指定する数を範囲で指定できるようにしてください。

    "ArgsUtil.java"

    1. public class ArgsUtil {
    2. static boolean isValid(int count, String[] args, String message) {
    3. // ここにコードを記述してください。
    4. }
    5. static boolean isValid(int lcount, int hcount, String[] args, String message) {
    6. if (args.length < lcount || args.length > hcount) {
    7. System.err.println(message);
    8. return false;
    9. }
    10. return true;
    11. }
    12. }

    "ArgsTest.java"

    1. public class ArgsTest {
    2. public static void main(String[] args) {
    3. System.out.println("args.length=1: " +
    4. ArgsUtil.isValid(1, args, "引数をひとつ指定してください。"));
    5. System.out.println("1<=args.length<=3: " +
    6. ArgsUtil.isValid(1, 3, args, "ひとつ以上3つ以下の引数を指定してください。"));
    7. for (int i = 0; i < args.length; i++) {
    8. System.out.println("引数: " + args[i]);
    9. }
    10. }
    11. }

    □ 実行結果

    $ java Args
    java ArgsTest
    引数をひとつ指定してください。
    args.length=1:     false
    ひとつ以上3つ以下の引数を指定してください。
    1<=args.length<=3: false
    
    $ java ArgsTest Hello
    args.length=1:     true
    1<=args.length<=3: true
    引数: Hello
    
    $ java ArgsTest Hello Java World
    引数をひとつ指定してください。
    args.length=1:     false
    1<=args.length<=3: true
    引数: Hello
    引数: Java
    引数: World
    
    $ java ArgsTest Hello Java Java World
    引数をひとつ指定してください。
    args.length=1:     false
    ひとつ以上3つ以下の引数を指定してください。
    1<=args.length<=3: false
    引数: Hello
    引数: Java
    引数: Java
    引数: World
    
  2. 作成したクラス"Graph.java"を利用して、下記のようなヒストグラムを横にプリントするアプリケーション"Histogram.java"を作成してください。
    このとき、星印は横に、0から9までの乱数で算出します。乱数は、java.lang.MathクラスのメソッドMath#random()を使います。詳細はAPIドキュメントを参照してください。
    1. public class Histogram {
    2. public static void main(String[] args) {
    3. Graph g = new Graph();
    4. for (int i = 0; i < 10; i++) {
    5. // コードを記述してください。
    6. }
    7. }
    8. }

    □ 実行結果

    $ java Histogram
    9|*********
    4|****
    8|********
    7|*******
    0|
    8|********
    6|******
    8|********
    5|*****
    4|****
    
  3. 第7回の最大公約数を計算するクラス"GCD.java"を改造し、String型の2つの引数から最大公約数を計算してint型で戻すメソッドGCD#getGCD()をクラス("GCD.java")の中に作成してください。
    1. public class GCD {
    2. int getGCD(String a, String b) {
    3. // コードを記述してください。
    4. }
    5. int getGCD(int a, int b) {
    6. int r;
    7. while ((r = a % b) != 0) {
    8. a = b;
    9. b = r;
    10. }
    11. return b;
    12. }
    13. }
  4. 上記メソッド"GCD#getGCD()"を利用するアプリケーション"TestGCD.java"を作ってください。
    1. public class TestGCD {
    2. public static void main(String[] args) {
    3. GCD gcd = new GCD();
    4. System.out.println(args[0] + " と " + args[1] + " の最大公約数は, " + gcd.getGCD(args[0], args[1]) + " です。" );
    5. }
    6. }

    □ 実行結果

    $ java TestGCD 12 32
    12 と 32 の最大公約数は, 4 です。
    

  5. 本(Book)クラスを、書名と作者名をコンストラクターで指定するクラスBook.javaにしてください。

    Book.java

    1. public class Book {
    2. private String title; // 書名
    3. private String author; // 著作者
    4. // コンストラクター
    5. // コードを記述してください。
    6. // title のゲッター
    7. String getTitle() {
    8. return this.title;
    9. }
    10. // author のゲッター
    11. String getAuthor() {
    12. return this.author;
    13. }
    14. // title のセッター
    15. void setTitle(String title) {
    16. this.title = title;
    17. }
    18. // author のセッター
    19. void setAuthor(String author) {
    20. this.author = author;
    21. }
    22. }

    Book.javaクラスをテストするアプリケーションBookTest.java

    1. public class BookTest {
    2. public static void main(String[] args) {
    3. Book b1 = new Book(args[0], args[1]);
    4. System.out.println(" Title:" + b1.getTitle());
    5. System.out.println("Author:" + b1.getAuthor());
    6. }
    7. }

    □ 実行結果

    $ java BookTest JavaBook Maruno
     Title:JavaBook
    Author:Maruno
    

  6. じゃんけんの手をあらわすJankenTeクラスを、手を設定してインスタンスを生成できるようなコンストラクターを作成したクラスJankenTeにしてください。

    JankenTe.java

    1. public class JankenTe {
    2. private int te; // 手
    3. static final String[] TE_NAMAE = {"ぐー", "ちょき", "ぱー"};
    4. // コンストラクター
    5. // コードを記述してください。
    6. // te のセッター
    7. void setTe(String te) {
    8. for (int i = 0; i < TE_NAMAE.length; i++) {
    9. if (TE_NAMAE[i].equals(te)) {
    10. this.te = i;
    11. return;
    12. }
    13. }
    14. this.te = 0;
    15. }
    16. // te のセッター
    17. void setTe(int te) {
    18. if (!(te == 0 || te == 1 || te == 2)) {
    19. this.te = 0;
    20. return;
    21. }
    22. this.te = te;
    23. }
    24. // te のゲッター
    25. int getTe() {
    26. return this.te;
    27. }
    28. }

    JankenTe.javaクラスをテストするアプリケーションJankenAppl.java

    1. public class JankenAppl {
    2. public static void main(String[] args) {
    3. int n = Integer.parseInt(args[0]);
    4. JankenTe te1 = new JankenTe(n);
    5. JankenTe te2 = new JankenTe(JankenTe.TE_NAMAE[n]);
    6. System.out.println("手1: " + te1.getTe());
    7. System.out.println("手2: " + te2.getTe());
    8. }
    9. }

    □ 実行結果

    $ java JankenAppl 0
    手1: 0
    手2: 0
    
    $ java JankenAppl 1
    手1: 1
    手2: 1
    
    $ java JankenAppl 2
    手1: 2
    手2: 2
    

  7. じゃんけんの手をあらわすJankenTeクラスを、勝敗がわかるメソッド janken(JankenTe) と、オブジェクトを文字列化するメソッド toString() を追加したクラスJankenTeにしてください。

    JankenTe.java

    1. public class JankenTe {
    2. private int te; // 手
    3. static final String[] TE_NAMAE = {"ぐー", "ちょき", "ぱー"};
    4. // コンストラクター
    5. JankenTe(String te) {
    6. setTe(te);
    7. }
    8. JankenTe(int te) {
    9. setTe(te);
    10. }
    11. // te のセッター
    12. void setTe(String te) {
    13. for (int i = 0; i < TE_NAMAE.length; i++) {
    14. if (TE_NAMAE[i].equals(te)) {
    15. this.te = i;
    16. return;
    17. }
    18. }
    19. this.te = 0;
    20. }
    21. // te のセッター
    22. void setTe(int te) {
    23. if (!(te == 0 || te == 1 || te == 2)) {
    24. this.te = 0;
    25. return;
    26. }
    27. this.te = te;
    28. }
    29. // te のゲッター
    30. int getTe() {
    31. return this.te;
    32. }
    33. // オブジェクトの文字列化
    34. public String toString() {
    35. // コードを記述してください。
    36. }
    37. // じゃんけん
    38. char janken(JankenTe te) {
    39. final char[][] KEKKA = {{'分', '勝', '負'} // ぐー
    40. , {'負', '分', '勝'} // ちょき
    41. , {'勝', '負', '分'}}; // ぱー
    42. //コンピューター ぐー ちょき ぱー
    43. // コードを記述してください。
    44. }
    45. }

    JankenTe.javaクラスをテストするアプリケーションJankenAppl.java

    1. public class JankenAppl {
    2. public static void main(String[] args) {
    3. JankenTe user = new JankenTe(args[0]);
    4. JankenTe computer = new JankenTe((int)(Math.random() * 3));
    5. System.out.print("結果: " + user.janken(computer));
    6. System.out.print(", user = " + user.toString());
    7. System.out.println(", computer = " + computer.toString());
    8. }
    9. }

    □ 実行結果

    $ java JankenAppl ぐー
    結果: 分, user = ぐー, computer = ぐー
    
    $ java JankenAppl ぐー
    結果: 勝, user = ぐー, computer = ちょき
    
    $ java JankenAppl ぐー
    結果: 負, user = ぐー, computer = ぱー
    
Top

inserted by FC2 system