切換
舊版
前往
大廳
主題

Java Programming Lesson 17

ジャネス | 2011-09-10 10:51:46 | 巴幣 0 | 人氣 727


Java言語プログラミングレッスン下巻

第17章:パッケージ
。この章では
。パッケージとは何か
 。名前の衝突とパッケージ
。パッケージの利用
 。完全限定名
 。importによるクラスの取り込み
 。java.langパッケージ
。パッケージの宣言
 。パッケージの宣言
 。パッケージの階層
 。packageとimport
 。import宣言の*の意味
 。無名パッケージ
 。パッケージはクラス階層と無関係
。パッケージとアクセス制御
 。アクセス制御とは何か
 。アクセス制御の例
 。修飾子の意味とアクセス制御一覧
 。よく使われるアクセス制御1:publicクラスとそうではないクラス
 。よく使われるアクセス制御2:privateメソッド、privateフィールド
 。よく使われるアクセス制御3:privateなコンストラクタ
 。よく使われるアクセス制御4:privateなコンストラクタ
。パッケージ名は衝突しないのか
 。ユニークなパッケージ名
 。ユニークなパッケージ名の生成方法
。パッケージの保存場所
。スタティックなインポート宣言
 。スタティックなインポート宣言とは何か
 。シングル・スタティック・インポート宣言(staticフィールとの取り込み)
 。シングル・スタティック・インポート宣言(staticメソッドの取り込み)
 。スタティック・インポート・オン・デマンド宣言
。この章で学んだこと
。練習問題

★★★★★

。この章では
 。import宣言
 。package宣言
 。アクセス制御
 。パッケージの命名規則

★★★★★

。パッケージとは何か
 。名前の衝突とパッケージ
  。衝突
   。クラスの名前は他のクラスの名前と二重する
  。パッケージ
   。名前の衝突を防ぐために用意されたグループ分けの仕組み
   。たとえクラスの名前が同じであっても、パッケージが異なっている限り、異なるクラスとして扱われる
  。名前空間
   。クラスの名前やメンバーの名前の集まり
  。publicなクラス
   。public宣言をしたクラスは、パッケージの外からも利用できる
   。public宣言をしていないクラスは、パッケージの中でしか利用できない

★★★★★

。パッケージの利用
 。完全限定名(Fully Qualified Name)
  。パッケージ名.クラス名(例えば、java.util.Random)
  。パッケージ名も合わせて指定した名前
 。importによるクラスの取り込み
  。import パッケージ名.*;
  。タイプ・インポート・オン・デマンド宣言(例えば、import java.util.*;)
  。シングル・タイプ・インポート宣言   (例えば、import java.util.Random;)
 。java.langパッケージ
  。import java.lang.*;
  。java.langパッケージ内のpublicクラスとインタフェースは自動的に取り込む

★★★★★

。パッケージの宣言
 。パッケージの宣言
  。package パッケージ名;(例えば、package mytool;)
  。privateメンバー
   。publicが付いていないクラス、パッケージ内からのみ使える
  。public メンバー
   。publicが付いているクラスは、パッケージの外からも使える
 。パッケージの階層
  。publicが付いていないクラスは、パッケージの下のサブパッケージからも使えない
 。packageとimport
  。package:パッケージを作る
  。import :パッケージを利用する
 。import宣言の*の意味
  。このパッケージ内のクラスとインタフェースに合致
  。このパッケージ内のサブパッケージに合致ではない
  。サブパッケージを使いたい場合、サブパッケージ名を書く必要がある
   例
   import java.awt.*;
   import java.awt.image.*;
 。無名パッケージ
  。パッケージの指定がないとき、宣言されるクラスやインタフェースは無名パッケージ(unnamed package)
  。たくさんのクラスからなる大きなプログラムや、他の人へ配布するプログラムの場合には
   package宣言を行ってパッケージ名前をつけるのがよい
 。パッケージはクラス階層と無関係

★★★★★

。パッケージとアクセス制御
 。アクセス制御とは何か
  。private  自分のクラス内だけに見せる名前
  。なし   自分のパッケージに見せる名前
  。protected パッケージだけでなくサブクラスにも見せる名前
  。public  みんなに見せる名前
 。アクセス制御の例
 。修飾子の意味とアクセス制御一覧
  。public:他のパッケージからのアクセスを許可する
  。protected:自パッケージ及びサブクラスからのアクセスを許可する
  。修飾子なし:アクセスできる範囲をパッケージ内に制限する
  。private:アクセスできる範囲をクラス内だけに制限する
  。クラスとインタフェースの制御:public または なし
  。クラスがpublicでなければ、メソッドやフィールドをpublicにしても、他のパッケージからは使えない
  。クラスとインタフェースに対するアクセス制御
   ---------------------
   なし |同じパッケージからのみ使える
   public|他のパッケージからでも使える
   ---------------------
  。クラスのメソッドとフィールドに対するアクセス制御
   -------------------------------------------
   メソッドと|publicが付いているクラス         |publicが付いていないクラス
   フィールド|のメソッドとフィールド          |のメソッドとフィールド
   -----|---------------------|---------------
   private  |クラス内でのみ使える           |クラス内でのみ使える
   -----|---------------------|---------------
   なし   |同じパッケージからのみ使える       |同じパッケージからのみ使える
   -----|---------------------|---------------
   protected |同じパッケージとサブクラスからのみ使える |同じパッケージからのみ使える
   -----|---------------------|---------------
   public  |他のパッケージから使える         |同じパッケージからのみ使える
   -------------------------------------------
  。インタフェースのメソッドとフィールドに対するアクセス制御
   -------------------------------------------
   メソッドと|publicが付いているクラス         |publicが付いていないクラス
   フィールド|のメソッドとフィールド          |のメソッドとフィールド
   -----|---------------------|---------------
   private  |(指定できない)             |(指定できない)
   -----|---------------------|---------------
   なし   |他のパッケージから使える         |同じパッケージからのみ使える
   -----|---------------------|---------------
   protected |(指定できない)             |(指定できない)
   -----|---------------------|---------------
   public  |他のパッケージから使える         |同じパッケージからのみ使える
   -------------------------------------------
  。クラスとインタフェースに対するアクセス制御
   --------------------------------
   メソッドと|      クラス     | インタフェース  |
   フィールド|public     |publicなし|public |publicなし|
   --------------------------------
   private  |クラス内    |クラス内 |できない|できない |
   --------------------------------
   なし   |同パ      |同パ   |他パ  |同パ   |
   --------------------------------
   protected |同パ、サブクラス|同パ   |できない|できない |
   --------------------------------
   public  |他パ      |同パ   |他パ  |同パ   |
   --------------------------------
 。よく使われるアクセス制御1:publicクラスとそうではないクラス
  例
  package mytool;
  public class PublicA { ← このクラスだけがパッケージの外から使える
    ...
  }
  class PackageB {    ← パッケージ内部の作業用のクラス
    ...
  }
  class PackageC {    ← パッケージ内部の作業用のクラス
    ...
  }
 。よく使われるアクセス制御2:privateメソッド、privateフィールド
  public class MyPlayer {
    private int mediaId;           ← privateなフィールド、内部作業用
    public MyPlayer() {            ← publicなコンストラクタ
      ...
    }
    public void play() {           ← publicなメソッド
      ...
    }
    public void stop() {           ← publicなメソッド
      ...
    }
    private void loadFile(String filename) { ← privateなメソッド、内部作業用
      ...
    }
  }
 。よく使われるアクセス制御3:privateなコンストラクタ
  例
  package java.lang;

  public class Math {
    public static double PI = 3.141592653589793;
    private Math() {             ← privateなコンストラクタ
    }
    public static double sin(double th) {
      ...
    }
    public static double cosin(double th) {
      ...
    }
  }
 。よく使われるアクセス制御4:privateなコンストラクタ
  例
  public class MyClass {
    private MyClass() {            ← privateなコンストラクタ、継承されない
      ...
    }
    public MyClass(String s) {         ← publicなコンストラクタ、継承されない
      this();
      ...
    }
    public MyClass(String s, boolean append) { ← publicなコンストラクタ、継承されない
      this();
      ...
    }
    ...
  }

★★★★★

。パッケージ名は衝突しないのか
 。ユニークなパッケージ名
 。ユニークなパッケージ名の生成方法
  。自分が所属する組織用にインターネットのドメイン名を取得する
   または、すでに組織が持っているドメイン名を用意する
   例:softbank.co.jp, stanford.edu
  。ドメイン名を逆順する
   例:jp.co.softbank, edu.stanford
  。できた文字列を、組織内部で定めたパッケージ名の前にくっつける
   例:jp.co.softbank.books.mytool.security, edu.stanford.timemachine

★★★★★

。パッケージの保存場所
 例
 パッケージ名  保存場所
 java.lang   java\lang
 java.io    java\io
 java.util   java\util
 java.util.zip java\util\zip
 java.awt    java\awt
 java.awt.image java\awt\image

★★★★★

。スタティックなインポート宣言
 。スタティックなインポート宣言とは何か
  。シングル・スタティック・インポート宣言
  。スタティック・インポート・オン・デマンド宣言
 。シングル・スタティック・インポート宣言(single-static-import declaration)
  (staticフィールとの取り込み)
  例
  import static java.lang.System.out;

  public class Hello {
    public static void main(String[] args) {
      out.println("Hello!");
    }
  }
 。シングル・スタティック・インポート宣言(single-static-import declaration)
  (staticメソッドの取り込み)
  例
  import static java.lang.System.out;
  import static java.lang.Math.max;

  public class Max {
    public static void main(String[] args) {
      int x = 45;
      int y = 100;
      int z = max(x, y);
      out.println("z = " + z);
    }
  }
 。スタティック・インポート・オン・デマンド宣言(static-import-on-demand declaration)
  例
  import static java.lang.System.*;
  import static java.lang.Math.*;

  public class Max2 {
    public static void main(String[] args) {
      int x = 45;
      int y = 100;
      int z = max(x, y);    → int z = Math.max(x, y);
      out.println("z = " + z); → System.out.println("z = " + z);
      out.println("π= " + PI); → System.out.println("π= " + PI);
    }
  }

★★★★★

。この章で学んだこと
 。パッケージ

★★★★★

。練習問題

問題17-1

正しいものに○、誤っているものに×
× (1) あるパッケージのクラスを使う場合にはpackageという予約語を使う。
    packageではなく、importです
○ (2) publicなクラスは、別のパッケージから利用できる。
× (3) java.langパッケージは自動的に取り込まれるから、java.lang.reflectパッケージも自動的に取り込まれる。
    java.langとjava.lang.reflectは別のパッケージです
○ (4) Java言語の文字列と表示するStringクラスの完全限定名はjava.lang.Stringである。
× (5) あるクラスのpublicなメソッドは、別のパッケージから利用できる。
    メソッドがpublicでも、クラスがpublic出ない場合には別のパッケージから使えない
× (6) java.ioパッケージには、java.lang.Objectの拡張クラスは含まれない。
    パッケージに含まれるクラスとクラス階層は関係ない
× (7) クラスのコンストラクタは常にpublicである。
× (8) privateなメソッドを宣言しても、クラスの外から使えないので意味がない。
    クラスの中では使えるので意味がある
○ (9) 同じパッケージ名を使ったpackage宣言を複数のファイルに書いてもよい。
    複数のpublicなクラスを含むパッケージを作成するには、必ずこうなる。

問題17-2
正しいものに○、誤っているものに×
○ (1) import java.util.Random; → Randomクラスの取り込み
○ (2) import java.util.*;    → java.utilパッケージのクラスとインタフェースの取り込み
× (3) import java.util;
× (4) import java.*;
× (5) import java;

問題17-3
java.awt.ImageFilterクラスをImageFilterとして参照するには、正しいimport宣言をすべて選んでください。
× (1) import java.awt.*;
○ (2) import java.awt.image.*;      → java.awtパッケージのクラスとインタフェースの取り込み
○ (3) import java.awt.image.ImageFilter; → ImageFilterクラスの取り込み

問題17-4
本書の最初に登場したプログラムHello.java(上巻p.6)は、List 17-13のようになっていました。
Helloクラスは何というパッケージに属していますか。
Hello.java
public class Hello {
  public static void main(String[] args) {
    System.out.println("Hello!");
  }
}

答え
package宣言がないので、無名パッケージに属しています

問題17-5
List 17-14は、PasswordRegisterはpublicになっていないので、mytool.security以外のパッケージから利用できません。PasswordRegisterを他のパッケージからも利用できるようにするためには、どのようにプログラムを修正すればよいですか。

List 17-14
PasswordChecker.java
----------
package mytool.security;
import yourtool.*;

public class PasswordChecker {
  ...
}

class Password Register {
  ...
}
----------

答え
1つのファイルに2つのpublicなクラスを宣言することができないので、PasswordRegisterにpublicを付けるだけではいけません。
ファイルを2つに分けてから、PasswordRegisterをpublicにします。

PasswordChecker.java
----------
package mytool.security;
import yourtool.*;

public class PasswordChecker {
  ...
}
----------

PasswordRegister.java
----------
package mytool.security;
import yourtool.*;

public class Password Register {
  ...
}
----------

★★★★★

第17章 終わり

創作回應

相關創作

更多創作