Java – protected修飾のアクセス範囲はどこまであるのか解説
Javaにおけるprotected
修飾子は、アクセス範囲が以下の通りです。
同じパッケージ内のすべてのクラスからアクセス可能であり、さらに異なるパッケージに属するサブクラスからもアクセス可能です。
ただし、異なるパッケージの非サブクラスからはアクセスできません。
これにより、パッケージ内での共有と継承関係における利用が可能になります。
protected修飾子のアクセス範囲
Javaにおけるprotected
修飾子は、クラスのメンバー(フィールドやメソッド)に対するアクセス制御を行うための修飾子です。
protected
修飾子を使用することで、以下のようなアクセス範囲が設定されます。
- 同じパッケージ内のクラスからのアクセス
- サブクラス(異なるパッケージに存在する場合も含む)からのアクセス
このため、protected
修飾子は、クラスのメンバーを外部から隠蔽しつつ、特定のクラスやそのサブクラスに対してはアクセスを許可することができます。
アクセス範囲の具体例
以下に、protected
修飾子を使用したサンプルコードを示します。
// App.java
package example; // 同じパッケージ内のクラス
public class Parent {
protected String protectedField = "protectedフィールド"; // protected修飾子のフィールド
protected void protectedMethod() { // protected修飾子のメソッド
System.out.println("protectedメソッドが呼ばれました");
}
}
class SamePackageClass { // 同じパッケージ内のクラス
public void accessParent() {
Parent parent = new Parent();
System.out.println(parent.protectedField); // アクセス可能
parent.protectedMethod(); // アクセス可能
}
}
class SubClass extends Parent { // Parentクラスのサブクラス
public void accessParent() {
System.out.println(protectedField); // アクセス可能
protectedMethod(); // アクセス可能
}
}
public class App {
public static void main(String[] args) {
SamePackageClass samePackage = new SamePackageClass();
samePackage.accessParent(); // 同じパッケージ内のクラスからのアクセス
SubClass subClass = new SubClass();
subClass.accessParent(); // サブクラスからのアクセス
}
}
protectedフィールド
protectedメソッドが呼ばれました
protectedフィールド
protectedメソッドが呼ばれました
このコードでは、Parent
クラスにprotected
修飾子を持つフィールドとメソッドがあります。
SamePackageClass
は同じパッケージ内にあるため、protected
メンバーにアクセスできます。
また、SubClass
はParent
のサブクラスであるため、異なるパッケージにいてもprotected
メンバーにアクセス可能です。
protected修飾子の具体的な使用例
protected
修飾子は、クラスのメンバーに対するアクセス制御を行うために非常に便利です。
以下に、protected
修飾子を使用した具体的な使用例を示します。
この例では、protected
メンバーを持つ親クラスと、そのサブクラス、さらに異なるパッケージからのアクセスを示します。
// Parent.java
package parentPackage; // 親クラスのパッケージ
public class Parent {
protected String protectedField = "protectedフィールド"; // protected修飾子のフィールド
protected void protectedMethod() { // protected修飾子のメソッド
System.out.println("protectedメソッドが呼ばれました");
}
}
// SubClass.java
package childPackage; // サブクラスのパッケージ
import parentPackage.Parent; // 親クラスをインポート
public class SubClass extends Parent { // Parentクラスのサブクラス
public void accessProtectedMembers() {
System.out.println(protectedField); // protectedフィールドにアクセス
protectedMethod(); // protectedメソッドにアクセス
}
}
// App.java
package mainPackage; // メインクラスのパッケージ
import childPackage.SubClass; // サブクラスをインポート
public class App {
public static void main(String[] args) {
SubClass subClass = new SubClass();
subClass.accessProtectedMembers(); // サブクラスからprotectedメンバーにアクセス
}
}
protectedフィールド
protectedメソッドが呼ばれました
この例では、Parent
クラスがprotected
修飾子を持つフィールドとメソッドを定義しています。
SubClass
はParent
を継承しており、protected
メンバーにアクセスできます。
App
クラスは異なるパッケージにありますが、SubClass
を通じてprotected
メンバーにアクセスすることができます。
このように、protected
修飾子を使用することで、クラスのメンバーを特定のクラスやそのサブクラスに対してのみ公開し、他のクラスからは隠蔽することが可能です。
これにより、クラスの設計がより柔軟かつ安全になります。
protected修飾子を使用する際の注意点
protected
修飾子は、クラスのメンバーに対するアクセス制御を行うための強力なツールですが、使用する際にはいくつかの注意点があります。
以下に、protected
修飾子を使用する際の主な注意点を示します。
注意点一覧
注意点 | 説明 |
---|---|
パッケージの制約 | 同じパッケージ内のクラスからはアクセス可能ですが、異なるパッケージの非サブクラスからはアクセスできません。 |
サブクラスの設計 | サブクラスでprotected メンバーを使用する場合、サブクラスの設計が親クラスに依存するため、設計の柔軟性が制限されることがあります。 |
アクセスの意図 | protected メンバーはサブクラスからアクセス可能ですが、意図しないアクセスを防ぐために、必要な場合にのみ使用することが重要です。 |
継承の影響 | protected メンバーを持つクラスを継承する際、サブクラスでの変更が親クラスの設計に影響を与える可能性があります。 |
カプセル化の観点 | protected メンバーは外部からのアクセスを制限しますが、サブクラスからはアクセス可能なため、カプセル化の観点から注意が必要です。 |
具体的な例
以下に、protected
修飾子を使用する際の注意点を示すサンプルコードを示します。
// Parent.java
package example; // 親クラスのパッケージ
public class Parent {
protected String protectedField = "protectedフィールド"; // protectedフィールド
protected void protectedMethod() { // protectedメソッド
System.out.println("protectedメソッドが呼ばれました");
}
}
// NonSubClass.java
package anotherPackage; // 異なるパッケージ
import example.Parent; // 親クラスをインポート
public class NonSubClass { // Parentクラスのサブクラスではない
public void accessParent() {
Parent parent = new Parent();
// 以下の行はコンパイルエラーになります
// System.out.println(parent.protectedField); // protectedフィールドにアクセスできない
// parent.protectedMethod(); // protectedメソッドにアクセスできない
}
}
この例では、Parent
クラスにprotected
修飾子を持つフィールドとメソッドがあります。
NonSubClass
はParent
のサブクラスではないため、protected
メンバーにアクセスできません。
このように、protected
修飾子を使用する際には、アクセス制限の影響を理解しておくことが重要です。
また、protected
メンバーを多用すると、クラス間の依存関係が強くなり、設計が複雑になる可能性があります。
したがって、protected
修飾子は必要な場合にのみ使用し、クラスの設計をシンプルに保つことが推奨されます。
protected修飾子の活用シーン
protected
修飾子は、特定のシナリオにおいて非常に有用です。
以下に、protected
修飾子を活用する具体的なシーンをいくつか示します。
活用シーン一覧
シーン | 説明 |
---|---|
継承を利用したクラス設計 | サブクラスに特定の機能を持たせるために、親クラスのメンバーをprotected にすることで、サブクラスからアクセス可能にする。 |
フレームワークの拡張 | フレームワークやライブラリを拡張する際に、protected メンバーを利用して、既存の機能をオーバーライドする。 |
テストクラスの作成 | テストクラスがサブクラスとして親クラスを拡張し、protected メンバーにアクセスしてテストを行う。 |
モジュール間の連携 | 同じパッケージ内のクラス間での連携を強化するために、protected メンバーを使用して、特定の機能を共有する。 |
具体的な活用例
以下に、protected
修飾子を活用したサンプルコードを示します。
// BaseClass.java
package example; // 基底クラスのパッケージ
public class BaseClass {
protected void displayMessage() { // protectedメソッド
System.out.println("BaseClassのメッセージ");
}
}
// DerivedClass.java
package example; // 同じパッケージ内
public class DerivedClass extends BaseClass { // BaseClassを継承
public void showMessage() {
displayMessage(); // BaseClassのprotectedメソッドにアクセス
}
}
// App.java
package main; // メインクラスのパッケージ
import example.DerivedClass; // DerivedClassをインポート
public class App {
public static void main(String[] args) {
DerivedClass derived = new DerivedClass();
derived.showMessage(); // DerivedClassからBaseClassのメッセージを表示
}
}
BaseClassのメッセージ
この例では、BaseClass
にprotected
メソッドdisplayMessage
があります。
DerivedClass
はBaseClass
を継承し、protected
メソッドにアクセスしてメッセージを表示します。
App
クラスからはDerivedClass
を通じてBaseClass
の機能を利用しています。
このように、protected
修飾子は、クラスの継承を利用した設計や、フレームワークの拡張、テストの実施など、さまざまなシーンで活用されます。
特に、クラス間の関係を明確にしつつ、必要な機能をサブクラスに提供するための重要な手段となります。
まとめ
この記事では、Javaにおけるprotected
修飾子のアクセス範囲や具体的な使用例、注意点、活用シーンについて詳しく解説しました。
protected
修飾子は、クラスのメンバーに対するアクセス制御を行うための重要な手段であり、特に継承を利用したクラス設計やフレームワークの拡張において非常に役立ちます。
今後は、protected
修飾子を適切に活用し、クラス設計をより効果的に行うことを検討してみてください。