クラスを として定義できないのはなぜprotected
ですか?
できないことはわかっていますが、なぜですか?何か特別な理由があるはずです。
意味がないからです。
保護されたクラス メンバー (メソッドまたは変数) は、サブクラスからもアクセスできることを除いて、package-private (デフォルトの可視性) と同じです。
Java には「サブパッケージ」や「パッケージの継承」などの概念がないため、class protected または package-private を宣言することは同じことです。
ただし、ネストされた内部クラスを保護またはプライベートとして宣言することはできます。
ご存知のように、default はパッケージ レベルのアクセス用であり、protected はパッケージ レベルと非パッケージ クラス用ですが、このクラスを拡張します (ここで注意すべき点は、クラスが表示されている場合にのみクラスを拡張できるということです!)。このように言いましょう:
このクラスが少数のクラスのみによってサブクラス化されることを制限する方法がないため (パッケージ内/パッケージ外のすべての利用可能なクラスのうち少数のクラスのみによって継承されるクラスを制限することはできません)、保護されたアクセス指定子は使用されません。トップレベルクラス向け。したがって、許可されていません。
public class A
{
protected class B
{
}
}
フィールド protected を定義すると、そのフィールドはパッケージ内だけでなくパッケージ外からも継承のみでアクセスできるようになります (子クラス内のみ)。
したがって、クラスを保護することが許可されている場合、パッケージ内で非常に簡単にアクセスできますが、パッケージ外でそのクラスにアクセスするには、最初に、このクラスが定義されているそのパッケージであるエンティティを拡張する必要があります。
また、パッケージは拡張できない (インポートできる) ため、保護されたクラスを定義すると、再びパッケージ プライベートになります。したがって、クラスをプライベートに定義するメリットはありません。それは、物事があいまいになるだけです。
Protected は public とは異なります。保護されたパッケージレベルのアクセスと、継承によってのみパッケージの外部にアクセスできるクラスの両方があります。クラスがパッケージの外部でAと言う場合、他のパッケージからクラスを継承します(INHERITANCEを使用して保護されたメソッドを使用)、このクラスBのメソッドにアクセスできますには保護されたメソッドがありますが、このクラスから派生したサブクラスがあります。つまり、A は保護されたメソッドにアクセスできません。パブリックでは逆のことが起こります。
例:
package 2;
class B
{
protected void method1()
{
}
}
package 1;
import 2.B;
class A extends B
{
//can access protected method
}
class C extends A
{
//can't access the protected method
}
「保護」の動作 = 「デフォルト」の動作 + 「任意のパッケージの任意のサブクラスで使用する」。
とにかく、クラスのデフォルトのアクセス修飾子がありますが、保護されたアクセス修飾子から得られる唯一の利点は、サブクラス化を通じて任意のパッケージで使用することです。ただし、サブクラスの場合、親の「保護された」クラスの可視性は非公開になります。そのため、アクセスできません。基本的に、保護された最上位クラスがある場合、外部クラスはそれをサブクラス化することによってアクセスできません。したがって、最上位クラスの保護は無意味です。