Java - クラスの定義


■ページ目次

Top

クラス

Top
クラスの定義
Top
クラス型の宣言とインスタンスの生成
Top
サンプル・システム - 商品管理システム -
Top
クラスの候補
  1. "Product.java"を入力してコンパイルしてください。
    1. // 0901
    2. // 商品クラスです。
    3. // ひとつの商品に対するフィールドやフィールドを操作するためのメソッドを
    4. // 提供しています。
    5. class Product {
    6. }
  2. "TestProduct.java"を入力してコンパイル・実行してください。
    1. // 0901
    2. // 商品クラスをテストするクラスです。
    3. public class TestProduct {
    4. public static void main(String[] args) {
    5. Product p1 = new Product();
    6. System.out.println("商品のインスタンスを生成しました。 p1 = " + p1);
    7. Product p2 = new Product();
    8. System.out.println("商品のインスタンスを生成しました。 p2 = " + p2);
    9. }
    10. }

    □ 実行結果

    $ java TestProduct
    商品のインスタンスを生成しました。 p1 = Product@f6a746
    商品のインスタンスを生成しました。 p2 = Product@15ff48b
    
    "Product@f6a746"の"f6a746"は、環境により異なります。

  3. (オプション)
    "Product.class" および "TestProduct.class"を削除して、もう1度"TestProduct.java"だけをコンパイルし、実行してください。
    実行できますか。また、"Product.class" はあるでしょうか。
■参照変数の内容
Top
■フィールド
フィールドの宣言
フィールドへのアクセス
Top
商品システム・サンプル
  1. 上記"Product.java"に、フィールドを加えます。("Product.java")
    1. // 0902
    2. // 商品クラスです。
    3. // ひとつの商品に対するフィールドやフィールドを操作するためのメソッドを
    4. // 提供しています。
    5. public class Product {
    6. String code; // 商品コード
    7. String name; // 商品名
    8. int price; // 商品定価
    9. }
  2. つぎの"TestProduct.java"を入力してコンパイル・実行してください。
    1. // 0902
    2. // 商品クラスをテストするクラスです。
    3. public class TestProduct {
    4. public static void main(String[] args) {
    5. Product p1 = new Product();
    6. p1.code = "A001";
    7. p1.name = "パソコン";
    8. p1.price = 188000;
    9. System.out.println("商品のインスタンスを生成しました。 p1 = " + p1);
    10. System.out.println(" code = " + p1.code);
    11. System.out.println(" name = " + p1.name);
    12. System.out.println(" price = " + p1.price);
    13. }
    14. }

    □ 実行結果

    $ java TestProduct
    商品のインスタンスを生成しました。 p1 = Product@f6a746
       code = A001
       name = パソコン
      price = 188000
    
Top
実習
  1. つぎの本(Book)クラスを作成してください。(Book.java)  本(Book)クラスには、つぎのフィールドがあります。

    Book.java

    1. public class Book {
    2. // ここにコードを記述してください。
    3. }

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

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

    □ 実行結果

    $ java BookTest JavaBook Maruno
     Title:JavaBook
    Author:Maruno
    
Top
メソッド
メソッドの宣言
アクセッサー・メソッド
メソッドへのアクセス
Top
商品システム・サンプル
  1. 上記"Product.java"に、アクセッサー・メソッドをつけます。("Product.java")
    1. // 0903
    2. // 商品クラスです。
    3. // ひとつの商品に対するフィールドやフィールドを操作するためのメソッドを
    4. // 提供しています。
    5. public class Product {
    6. String code; // 商品コード
    7. String name; // 商品名
    8. int price; // 商品定価
    9. // 商品コードに値を設定します。
    10. void setCode(String value) {
    11. code = value;
    12. }
    13. // 商品コードの値を取得します。
    14. String getCode() {
    15. return code;
    16. }
    17. // 商品名に値を設定します。
    18. void setName(String value) {
    19. name = value;
    20. }
    21. // 商品名の値を取得します。
    22. String getName() {
    23. return name;
    24. }
    25. // 商品定価に値を設定します。
    26. void setPrice(int value) {
    27. if (value < 0) {
    28. price = 0;
    29. return;
    30. }
    31. price = value;
    32. }
    33. // 商品定価の値を取得します。
    34. int getPrice() {
    35. return price;
    36. }
    37. }
  2. "TestProduct.java"を入力してコンパイル・実行してください。
    1. // 0903
    2. // 商品クラスをテストするクラスです。
    3. public class TestProduct {
    4. public static void main(String[] args) {
    5. Product p1 = new Product();
    6. p1.setCode("A001");
    7. p1.setName("パソコン");
    8. p1.setPrice(188000);
    9. System.out.println("商品のインスタンスを生成しました。 p1 = " + p1);
    10. System.out.println(" code = " + p1.getCode() );
    11. System.out.println(" name = " + p1.getName() );
    12. System.out.println(" price = " + p1.getPrice());
    13. Product p2 = new Product();
    14. p2.setCode("P001");
    15. p2.setName("プリンター");
    16. p2.setPrice(-24000);
    17. System.out.println("商品のインスタンスを生成しました。 p2 = " + p2);
    18. System.out.println(" code = " + p2.getCode() );
    19. System.out.println(" name = " + p2.getName() );
    20. System.out.println(" price = " + p2.getPrice());
    21. }
    22. }

    □ 実行結果

    $ java TestProduct
    商品のインスタンスを生成しました。 p1 = Product@f6a746
       code = A001
       name = パソコン
      price = 188000
    商品のインスタンスを生成しました。 p2 = Product@15ff48b
       code = P001
       name = プリンター
      price = 0
    
メソッドの引数
static修飾子
Top
■(参考)クラスの定義
Top

カプセル化

アクセッサー・メソッド
Top
カプセル化の必要性を示すサンプル
  1. 以下の"TestProduct.java"を入力してコンパイル・実行してください。
    1. // 0904
    2. // 商品クラスをテストするクラスです。
    3. public class TestProduct {
    4. public static void main(String[] args) {
    5. Product p1 = new Product();
    6. p1.setCode("A001");
    7. p1.setName("パソコン");
    8. p1.setPrice(-188000);
    9. System.out.println("商品のインスタンスを生成しました。 p1 = " + p1);
    10. System.out.println(" code = " + p1.getCode());
    11. System.out.println(" name = " + p1.getName());
    12. System.out.println(" price = " + p1.getPrice());
    13. Product p2 = new Product();
    14. p2.code = "P001";
    15. p2.name = "プリンター";
    16. p2.price = -24000;
    17. System.out.println("商品のインスタンスを生成しました。 p2 = " + p2);
    18. System.out.println(" code = " + p2.getCode());
    19. System.out.println(" name = " + p2.getName());
    20. System.out.println(" price = " + p2.getPrice());
    21. }
    22. }

    □ 実行結果

    $ java TestProduct
    商品のインスタンスを生成しました。 p1 = Product@f6a746
       code = A001
       name = パソコン
      price = 0
    商品のインスタンスを生成しました。 p2 = Product@15ff48b
       code = P001
       name = プリンター
      price = -24000
    
  2. 上記"Product.java"のフィールドのアクセス修飾子をpivateにしてください。("Product.java")
    1. // 0905
    2. // 商品クラスです。
    3. // ひとつの商品に対するフィールドやフィールドを操作するためのメソッドを
    4. // 提供しています。
    5. public class Product {
    6. private String code; // 商品コード
    7. private String name; // 商品名
    8. private int price; // 商品定価
    9. :
    10. }
  3. 上記"TestProduct.java"に変更を加えずに、コンパイル・実行してください。
    $ javac TestProduct.java
    TestProduct.java:15: code は Product で private アクセスされます。
            p2.code = "P001";
              ^
    TestProduct.java:16: name は Product で private アクセスされます。
            p2.name = "プリンター";
              ^
    TestProduct.java:17: price は Product で private アクセスされます。
            p2.price = -24000;
              ^
    エラー 3 個
    
Top
実習
  1. コマンドライン引数をチェックするクラス"Args01.java"を一般化して、コマンドライン引数をチェックするメソッドisValid()を持つクラス"ArgsUtil.java"を作成してください。
    1. public class Args {
    2. static boolean isValid(int count, String[] args, String message) {
    3. // ここにコードを記述してください。
    4. }
    5. public static void main(String[] args) {
    6. if (!isValid(1, args, "引数をひとつ指定してください。")) {
    7. System.exit(1); // アプリケーションを終了します
    8. }
    9. System.out.println("引数: " + args[0]);
    10. }
    11. }

    □ 実行結果

    $ java Args
    引数をひとつ指定してください。
    
    $ java Args Hello
    引数: Hello
    
    $ java Args Hello World
    引数をひとつ指定してください。
    
    $ java Args "Hello World"
    引数: Hello World
    
  2. コマンドラインから入力した数値の数だけ、星印(*)を横に並べるアプリケーション"StarPrint01.java"を改造し、int型の引数から数値の数だけ、星印(*)を並べた文字列を返すメソッドgetStars()をクラス("Graph.java")の中に作成してください。
    1. public class Graph {
    2. String getStars(int n) {
    3. // ここにコードを記述してください。
    4. }
    5. }
  3. 上記メソッド"TestGraph#printGraph()"を利用するアプリケーション"TestGraph.java"を作ってください。
    1. public class TestGraph {
    2. public static void main(String[] args) {
    3. Graph g = new Graph();
    4. System.out.println(g.getStars(Integer.parseInt(args[0])));
    5. }
    6. }

    □ 実行結果

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

    □ 実行結果

    $ java TestGCD 12 32
    12 と 32 の最大公約数は, 4 です。
    
  6. 素数か否かを判定するアプリケーション"IsPrimeNumber.java"を改造し、引数が素数か否かを判定してboolean型で戻すメソッド isPrimeNumber() を持つクラス("PrimeNumber.java")を作成してください。
    1. public class PrimeNumber {
    2. static boolean isPrimeNumber(int n) {
    3. //
    4. // ここにコードを記述してください。
    5. //
    6. return true;
    7. }
    8. }
  7. 上記メソッド"PrimeNumber#isPrimeNumber()"を利用するアプリケーション"TestPrimeNumber.java"を作ってください。
    1. public class TestPrimeNumber {
    2. public static void main(String[] args) {
    3. int n = Integer.parseInt(args[0]);
    4. if (PrimeNumber.isPrimeNumber(n)) {
    5. System.out.println(n + " is a prime number.");
    6. } else {
    7. System.out.println(n + " is not a prime number.");
    8. }
    9. }
    10. }

    □ 実行結果

    $ java TestPrimeNumber 7 <-- 素数の場合、
    7 is a prime number.
    
    $ java TestPrimeNumber 8 <-- 素数でない場合、
    8 is not a prime number.
    
  8. (オプション)
    上記メソッドIsPrimeNumber3#isPrimeNumber()をstaticにして、確認してください。
  9. 上記メソッド"PrimeNumber#isPrimeNumber()"を利用して、コマンドラインから指定された数までの素数をすべてプリントするアプリケーション"PrimeNumber10.java"を作ってください。
    1. public class PrimeNumber10 {
    2. public static void main(String[] args) {
    3. int n = Integer.parseInt(args[0]);
    4. // ここにコードを記述してください。
    5. System.out.println();
    6. }
    7. }

    □ 実行結果

    $ java PrimeNumber10 100
    2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
    
  10. つぎの本(Book)クラスをカプセル化してください。(Book.java)  本(Book)クラスには、つぎのフィールドがあります。

    □ カプセル化前のBook.java

    1. public class Book {
    2. String title; // 書名
    3. String author; // 著作者
    4. }

    □ カプセル化後のBook.javaクラスをテストするアプリケーションBookTest.java

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

    □ 実行結果

    $ java BookTest JavaBook Maruno
     Title:JavaBook
    Author:Maruno
    

  11. じゃんけんの手をあらわすJankenTeクラスを作成してください。 このクラスには、つぎのフィールドがあります。なお、カプセル化し、フィールド te には、0, 1, 2 しか入らないものとします。これ以外の値のときは、0 が指定されたものとします。

    JankenTe.java

    1. public class JankenTe {
    2. // ここにコードを記述してください。
    3. }

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

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

    □ 実行結果

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

  12. じゃんけんの手をあらわすJankenTeクラスを、日本語の "ぐー", "ちょき", "ぱー" も設定できるようにしたクラスJankenTeにしてください。

    JankenTe.java

    1. public class JankenTe {
    2. // ここにコードを記述してください。
    3. }

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

    1. public class JankenAppl {
    2. public static void main(String[] args) {
    3. JankenTe te = new JankenTe();
    4. te.setTe(args[0]);
    5. System.out.println("手: " + te.getTe());
    6. }
    7. }

    □ 実行結果

    $ java JankenAppl ぐー
    手: 0
    
    $ java JankenAppl ちょき
    手: 1
    
    $ java JankenAppl ぱー
    手: 2
    
    $ java JankenAppl ちゃー
    手: 0
    

  13. つぎの四角形を処理するクラス"Shikaku.java"を作ります。コンストラクターはつぎのとおりです。なお、図形の座標の原点は左上にあるものとします。
    Shikaku(int x0, int y0, int x1, int y1) 左上の座標(x0, y0)と右下の座標(x1, y1)。デフォルトの名前は、"四角形"とします。
    Shikaku(String name, int x0, int y0, int x1, int y1) 四角形の名前と左上の座標(x0, y0)、右下の座標(x1, y1)

    このクラスには、四角形の周の長さを戻すメソッドlength()を作成してください。周の長さは、つぎの式によります。

    "Shikaku.java"

    1. public class Shikaku {
    2. private int x0, y0; // 左上の頂点の座標
    3. private int x1, y1; // 左上の頂点の座標
    4. private int w, h; // 幅と高さ
    5. private String name; // 名前
    6. Shikaku(String name, int x0, int y0, int x1, int y1) { // コンストラクター
    7. setName(name);
    8. this.x0 = x0;
    9. this.y0 = y0;
    10. this.x1 = x1;
    11. this.y1 = y1;
    12. w = Math.abs(x0 - x1);
    13. h = Math.abs(y0 - y1);
    14. }
    15. Shikaku(int x0, int y0, int x1, int y1) { // コンストラクター
    16. this("四角形", x0, y0, x1, y1);
    17. }
    18. String getName() { // 名前の取得
    19. return name;
    20. }
    21. void setName(String name) { // 名前の設定
    22. this.name = name;
    23. }
    24. double length() { // 周の長さ
    25. // ここにコードを記述してください。
    26. }
    27. }

    なお、これらをテストするアプリケーション"ZukeiTest01.java"は、以下のとおりです。

    "ZukeiTest01.java"

    1. public class ZukeiTest01 {
    2. public static void main(String[] args) {
    3. int x0 = Integer.parseInt(args[0]);
    4. int y0 = Integer.parseInt(args[1]);
    5. int x1 = Integer.parseInt(args[2]);
    6. int y1 = Integer.parseInt(args[3]);
    7. Shikaku s0 = new Shikaku(x0, y0, x1, y1);
    8. System.out.println(s0.getName() + " の周の長さ = " + (int)(s0.length()));
    9. Shikaku s1 = new Shikaku("しかく", x0, y0, x1, y1);
    10. System.out.println(s1.getName() + " の周の長さ = " + (int)(s1.length()));
    11. }
    12. }

    □ 実行結果

    $ java ZukeiTest01 0 0 100 100
    四角形 の周の長さ = 400
    しかく の周の長さ = 400
    
Top

inserted by FC2 system