JAVA プログラミング 入門

JAVAのプログラミングについて初歩から解説します。まずは、mainメソッド、変数、演算、if文、for文、while文、メソッド、配列など。続いて、メソッドを複数構成して、プログラムを作成(非オブジェクト指向プログラミング)、しばらく後になると思いますが、オブジェクト指向プログラミングを解説します。 クラスの構成、コンストラクター、継承、・・・、など、本格的OOP(Object Oriented Programming)を解説します。

Java: アクセス制御

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でないとアクセスできない。

f:id:Kurokawa_Tomio:20190701144315p:plain
図Proo7_1_ACCESS1
図Proo7_1_ACCESS2は同じパッケージ内でのクラス間のアクセスである。メンバーがpublic又は「指定なし」であれば、クラスはpublicでも「指定なし」でもよい。
f:id:Kurokawa_Tomio:20190701144408p:plain
図Proo7_1_ACCESS2
クラス内でのアクセスは常に可能である。

図Book_no_modi、図Book2_public,図Proo7_1_srcはソースプログラムである。これらは同じパッケージ内でのアクセス制御を説明するためのものである。三つのクラス:Book, Book2, Proo7_1は全て「名前なし」のパッケージ内にある。Bookはpublicでないが、Book2はpublicである。これらは別々にコンパイルされる。

f:id:Kurokawa_Tomio:20190701144518p:plain
図Book_no_modi
f:id:Kurokawa_Tomio:20190701144605p:plain
図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
*/