JAVAのアクセス制限はどこからアクセスするかによって違ってくる。何処からには3種類ある。それは以下の通りである。
1)パッケージの外からのアクセス
2)同じパッケージ内のあるクラスから別のクラスへのアクセス
3)同じクラス内でのアクセス
パッケージとは、一つ又は複数のクラスをまとめたものである。従って、JAVAのプログラムはパッケージ群によりできている。
この3種類のアクセスをクラスとメンバーの2段階で制御するのがJAVAのアクセス制御である。これまでに学習したパッケージは無名パッケージだけであるので、ここでは無名パッケージでのアクセス制御について解説する。つまり、同じパッケージ内の別クラスからのアクセスについてである
(Java: Access from a Different Class within a Package )。
クラスのアクセス修飾子はpublicと「指定なし」がある。メンバーの修飾子にはpublic, protected, 「指定なし」, privateがあるが、
protectedについては後程学習Java: package-パッケージ間のACCESSする。
図Proo7_1_ACCESS1は異なるパッケージ間でのアクセス制限である。クラスもフィールドもpublicでないとアクセスできない。図Proo7_1_ACCESS2は同じパッケージ内でのクラス間のアクセスである。メンバーがpublic又は「指定なし」であれば、クラスはpublicでも「指定なし」でもよい。クラス内でのアクセスは常に可能である。
図Book_no_modi、図Book2_public,図Proo7_1_srcはソースプログラムである。これらは同じパッケージ内でのアクセス制御を説明するためのものである。三つのクラス:Book, Book2, Proo7_1は全て「名前なし」のパッケージ内にある。Bookはpublicでないが、Book2はpublicである。これらは別々にコンパイルされる。
Bookについて:
このクラスは修飾子なし」である。
displayはpublic、Bookコンストラクタは「修飾子なし」である。
これらはProo7_1クラスから呼ばれ、正常に動作している。同じパッケージのあるクラスから別の「修飾子なし」クラスへのアクセスは正常である。
BooK2について:
これはpublicクラスである。
display2はpublic、Book2コンストラクタは「修飾子なし」である。
これらもProo7_1クラスから呼ばれ、正常に動作している。同じパッケージの別のpublicクラスへのアクセスは正常である。
上記はメソッドだけについて、チェックしたが、フィールドに関しても同じことが言えると考える。
以上、同じパッケージ内の別クラスへのアクセスについてチェックしたが、「修飾子なし」Bookとprivate Book2のフィールドは全てprivateとして保護した。そのうえで、メソッドを「修飾子なし」とpublicでチェックし、すべて正常に動作した。アクセス不可に関しては、チェックができていないが、private メソッドは別クラスからは動かない、またはコンパイル時にエラーとなる。
同じパッケージ内の別クラスからのアクセス制御はカプセル化の考え方でOKであると考える。つまり、フィールドはprivateとして、メソッドはpublicまたは「修飾子なし」としてよいが、
できるだけprivateとして保護するという考え方で問題ないと考える。
JAVA PROGRAMMING 入門 TOP へ
以下に三つのソースを示す。
class Book { private String title; private int page; private void set_Book(String title,int page){ this.title=title;this.page=page; } private void display(){ System.out.println("title="+title+", page="+page); } public Book(String title, int page){ set_Book(title,page); } } public class Book2 { private String title; private int page; private void set_Book2(String title,int page){ this.title=title;this.page=page; } public void display2(){ System.out.println("title="+title+", page="+page); } Book2(String title, int page){ set_Book2(title,page); } } /*アクセス制限 同じnameless package 内のアクセス*/ class Proo7_1{ public static void main(String[] args){ Book a=new Book("Introduction to Java",500); a.display(); Book2 a2 = new Book2("Introduction to C++",400); a2.display2(); } } /* title=Introduction to Java, page=500 title=Introduction to C++, page=400 */