>> Java入門トップに戻る
Javaのアクセス修飾子について説明していきます。
アクセス修飾子はクラス自身やクラスのフィールド、メソッドなどに指定し、その名の通りアクセス制限のために使うもので、利用可能な範囲を指定出来ます。
利用可能な範囲の区分として、自クラス、サブクラス、同一パッケージ、その他全て、があります。
サブクラスというのは「あるクラスを継承したクラス」のことです。
これについては後ほど詳しく説明しますが、継承すると基のクラスのフィールドやメソッドを新しいクラスに引き継ぐことができます。
同一パッケージについてはそのままです。
「パッケージ、クラスの作成、mainメソッド」でパッケージの説明はしたと思いますが、同じパッケージに属している他のクラスからのアクセスを意味します。
その他全て、とはその他の全てのクラスからアクセスを意味します。
それでは以下の表を見てください。
一番左の列がアクセス修飾子を表しています。
「デフォルト修飾子」とは「アクセス修飾子を何も書かない場合の修飾子」になります。
クラスやメソッドを作成する場合は「public class」や「private void test(){}」のようにpublicやprivate等のアクセス修飾子を書きますが、このアクセス修飾子を何も書かなかった場合に設定されるデフォルトの修飾子です。
この「デフォルト修飾子」が指定されたクラス/フィールド/メソッドは自クラスか同一パッケージからであればアクセス可能になります。
その他の「private,protected,public」は書いてあるとおりです。
「private」は自クラス内からでしかアクセスすることは出来ません。
「protected」は継承先のサブクラスからだけでなく「同一パッケージ」からもアクセス可能であることに注意してください。
それではアクセス修飾子をいくつか使ったクラスを見て下さい。
AAAというクラスはアクセス修飾子を指定してないので、「デフォルト修飾子」が設定されています。
なので同一パッケージ内からはアクセス可能です。
というわけで、同一パッケージ内のクラス「Default」のmain関数内でnewでインスタンスが生成出来ます(9行目)
クラスAAAのprivateフィールド「value」はprivateなので自クラス内からしかアクセスできません。
なので12行目に書いてる通り、クラス「Default」内からはアクセスできません。
クラスAAAのpublic修飾子が指定されたフィールド「value2」とメソッド「setValue」は、15行目と18行目にあるように「public」なのでアクセス可能です。
このような感じでクラス自身やフィールド、メソッドにアクセス制限をかけることが出来ます。
なぜアクセス制限をする必要があるのか?と疑問に思う人がいるかもしれませんが、複数人で開発することを想定してみて下さい。
すべて「public」で定義してしまった場合、18行目のように簡単に他人に値が書き換えられてしまう可能性があります。
自分が作ったクラスであれば、「このフィールドは初期化後は絶対に触らないフィールドだ」と思っていても、知らない人がうっかり触ってしまうことが考えられます。
そんな時のためにアクセス修飾子を付けて、クラス、フィールド、メソッドを隠蔽するのです。
このことを「カプセル化」と言います。
今はまだあまり理解できないかもしれませんが、そのうち慣れてくると思いますので、少しでも意識してプログラミングしてみてください。
>> 【コンストラクタの作成、オーバーロード】に進む
>> Java入門トップに戻る
クラス、フィールド、メソッドのアクセス修飾子
アクセス修飾子はクラス自身やクラスのフィールド、メソッドなどに指定し、その名の通りアクセス制限のために使うもので、利用可能な範囲を指定出来ます。
利用可能な範囲の区分として、自クラス、サブクラス、同一パッケージ、その他全て、があります。
サブクラスというのは「あるクラスを継承したクラス」のことです。
これについては後ほど詳しく説明しますが、継承すると基のクラスのフィールドやメソッドを新しいクラスに引き継ぐことができます。
同一パッケージについてはそのままです。
「パッケージ、クラスの作成、mainメソッド」でパッケージの説明はしたと思いますが、同じパッケージに属している他のクラスからのアクセスを意味します。
その他全て、とはその他の全てのクラスからアクセスを意味します。
それでは以下の表を見てください。
アクセス修飾子 | 自クラス | サブクラス | 同一パッケージ | その他全て |
---|---|---|---|---|
private | ○ | ☓ | ☓ | ☓ |
デフォルト修飾子 | ○ | ☓ | ○ | ☓ |
protected | ○ | ○ | ○ | ☓ |
public | ○ | ○ | ○ | ○ |
「デフォルト修飾子」とは「アクセス修飾子を何も書かない場合の修飾子」になります。
クラスやメソッドを作成する場合は「public class」や「private void test(){}」のようにpublicやprivate等のアクセス修飾子を書きますが、このアクセス修飾子を何も書かなかった場合に設定されるデフォルトの修飾子です。
この「デフォルト修飾子」が指定されたクラス/フィールド/メソッドは自クラスか同一パッケージからであればアクセス可能になります。
その他の「private,protected,public」は書いてあるとおりです。
「private」は自クラス内からでしかアクセスすることは出来ません。
「protected」は継承先のサブクラスからだけでなく「同一パッケージ」からもアクセス可能であることに注意してください。
それではアクセス修飾子をいくつか使ったクラスを見て下さい。
package base; public class Default { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ //デフォルト修飾子なので同一パッケージ内からインスタンス生成可 AAA obj = new AAA(); //privateのフィールドなのでアクセス不可 //obj.value = 1; //publicのメソッドなので呼び出し可 obj.setValue(10); //publicのフィールドなのでアクセス可 obj.value2 = 5; } } //デフォルト修飾子でクラスを作成 class AAA{ //private private int value; //public public int value2; //public public void setValue(int tmp){ value = tmp; } }では簡単に説明していきます。
AAAというクラスはアクセス修飾子を指定してないので、「デフォルト修飾子」が設定されています。
なので同一パッケージ内からはアクセス可能です。
というわけで、同一パッケージ内のクラス「Default」のmain関数内でnewでインスタンスが生成出来ます(9行目)
クラスAAAのprivateフィールド「value」はprivateなので自クラス内からしかアクセスできません。
なので12行目に書いてる通り、クラス「Default」内からはアクセスできません。
クラスAAAのpublic修飾子が指定されたフィールド「value2」とメソッド「setValue」は、15行目と18行目にあるように「public」なのでアクセス可能です。
このような感じでクラス自身やフィールド、メソッドにアクセス制限をかけることが出来ます。
なぜアクセス制限をする必要があるのか?と疑問に思う人がいるかもしれませんが、複数人で開発することを想定してみて下さい。
すべて「public」で定義してしまった場合、18行目のように簡単に他人に値が書き換えられてしまう可能性があります。
自分が作ったクラスであれば、「このフィールドは初期化後は絶対に触らないフィールドだ」と思っていても、知らない人がうっかり触ってしまうことが考えられます。
そんな時のためにアクセス修飾子を付けて、クラス、フィールド、メソッドを隠蔽するのです。
このことを「カプセル化」と言います。
今はまだあまり理解できないかもしれませんが、そのうち慣れてくると思いますので、少しでも意識してプログラミングしてみてください。
>> 【コンストラクタの作成、オーバーロード】に進む
>> Java入門トップに戻る