回答:
デフォルトの可視性は「package-private」と呼ばれます(これを明示的に使用することはできません)。これは、クラスが属する同じパッケージ内からフィールドにアクセスできることを意味します。
mdmaが指摘したように、デフォルトは「public」であるインターフェースメンバーには当てはまりません。
Javaのアクセス指定子を参照してください
デフォルトの指定子はコンテキストによって異なります。
クラスおよびインターフェース宣言の場合、デフォルトはパッケージプライベートです。これは保護とプライベートの中間にあり、同じパッケージ内のクラスのみにアクセスを許可します。(protectedはこのようなものですが、パッケージ外のサブクラスへのアクセスも許可します。)
class MyClass // package private
{
int field; // package private field
void calc() { // package private method
}
}
インターフェースメンバー(フィールドとメソッド)の場合、デフォルトのアクセスはパブリックです。ただし、インターフェイス宣言自体のデフォルトはプライベートパッケージであることに注意してください。
interface MyInterface // package private
{
int field1; // static final public
void method1(); // public abstract
}
宣言があれば
public interface MyInterface2 extends MyInterface
{
}
MyInterface2を使用するクラスは、MyInterface自体の宣言を見ることができない場合でもパブリックであるため、スーパーインターフェイスからfield1とmethod1を見ることができます。
/* pp */
)は、デフォルトアクセスの便利な名前にすぎません。JLS名ではありません。
アクセス指定子が指定されていない場合は、クラスおよびクラスメンバーに対するパッケージレベルのアクセス(これに対する明示的な指定子はありません)です。インターフェイスメソッドは暗黙的にパブリックです。
それは物事によって異なります。
最上位の型(つまり、クラス、列挙型、インターフェース、および別の型の内部で宣言されていない注釈型)は、デフォルトでパッケージプライベートです。(JLS§6.6.1)
クラスでは、すべてのメンバー(フィールド、メソッド、ネストされた型宣言を意味します)とコンストラクターは、デフォルトでパッケージプライベートです。(JLS§6.6.1)
列挙型では、コンストラクタはデフォルトでプライベートです。実際、列挙型コントラクターはプライベートである必要があり、それらをパブリックまたは保護対象として指定するとエラーになります。列挙型定数は常にpublicであり、アクセス指定子を許可しません。enumの他のメンバーは、デフォルトでpackage-privateです。(JLS§8.9)
インターフェースと注釈型では、すべてのメンバー(つまり、フィールド、メソッド、およびネストされた型宣言)がデフォルトでパブリックです。実際、インターフェースと注釈型のメンバーはパブリックである必要があり、それらをプライベートまたは保護として指定するとエラーになります。(JLS§9.3から9.5)
ローカルクラスは、メソッド、コンストラクター、または初期化子ブロック内で宣言された名前付きクラスです。それらは、それらが宣言されている{
.. }
ブロックをスコープとし、アクセス指定子を許可しません。(JLS§14.3)リフレクションを使用すると、他の場所からローカルクラスをインスタンス化でき、それらはpackage-privateですが、その詳細がJLSにあるかどうかはわかりません。
匿名クラスはnew
、クラス本体を式で直接指定して作成されるカスタムクラスです。(JLS§15.9.5)それらの構文はアクセス指定子を許可しません。リフレクションを使用すると、他の場所から匿名クラスをインスタンス化でき、それらとその生成されたコンストラクターは両方ともpackage-privateですが、詳細がJLSにあるかどうかはわかりません。
インスタンスおよび静的初期化子ブロックには言語レベル(JLS§8.6および8.7)でのアクセス指定子はありませんが、静的初期化子ブロックは<clinit>
(JVMS§2.9)という名前のメソッドとして実装されるため、メソッドは内部的にいくつかのアクセス指定子を持つ必要があります。16進エディターを使用してjavacおよびEclipseのコンパイラーによってコンパイルされたクラスを調べたところ、どちらもpackage-privateとしてメソッドを生成していることがわかりました。ただし、メソッド名で<clinit>()
は<
と>
文字が無効であり、リフレクションメソッドはその存在を拒否するように組み込まれているため、言語内で呼び出すことはできません。そのため、アクセス指定子は事実上アクセスできません。このメソッドは、クラスの初期化中にVMによってのみ呼び出すことができます。インスタンス初期化子ブロックは個別のメソッドとしてコンパイルされません。コードは各コンストラクタにコピーされるため、リフレクションによっても個別にアクセスすることはできません。
defaultは、メソッドと変数のアクセス修飾子として使用されるキーワードです。
このアクセス修飾子を使用すると、クラス、変数、メソッド、またはコンストラクターが独自のクラスまたはパッケージからアクセスできるようになります。アクセス修飾子が存在しない場合にも設定されます。
Access Levels
Modifier Class Package Subclass EveryWhere
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N
インターフェースでデフォルトを使用する場合、この例のようなメソッドをそこに実装することができます
public interface Computer {
default void Start() {
throw new UnsupportedOperationException("Error");
}
}
ただし、8 Javaバージョンからのみ機能します
詳細はこちらをご覧ください。デフォルトは、private / public / protectedではなく、完全に異なるアクセス仕様です。これは広く使用されていないため、アクセス定義をより具体的にすることを好みます。
これは、Javaの作成者であるJames Goslingへのインタビューからのパッケージレベルの可視性に関する引用です。
Bill Venners:Javaには4つのアクセスレベルがあります。デフォルトはパッケージです。C ++の人々がすでに知っている3つのキーワードがプライベート、保護、パブリックだったので、パッケージアクセスをデフォルトにすることが便利かどうか、私はいつも疑問に思っていました。または、パッケージへのアクセスをデフォルトにする必要があると感じた特別な理由がある場合。
James Gosling:パッケージは一般的に、一緒に書かれたもののセットです。だから一般的に私は2つのことの1つをすることができました。1つは、常にドメインを与えるキーワードを入力することを強制することでした。または、デフォルト値があったかもしれません。そして問題は、何が賢明なデフォルトになるのか?そして、私は最も危険なことではないものに行きがちです。
したがって、パブリックをデフォルトにすることは本当に悪いことだったでしょう。人々が実際にはそれほど頻繁にプライベートメソッドを書かないからといって、プライベートをデフォルトにすることはおそらく悪いことでしょう。保護されたと同じこと。そして、私が持っているコードの束を見て、私はかなり安全な最も一般的なものはパッケージにあると判断しました。また、C ++にはパッケージの概念がなかったため、そのためのキーワードはありませんでした。
しかし、友人の概念よりも私はそれが好きでした。友人と一緒に、あなたは友人のすべてが誰かを列挙する必要があるからです。そのため、新しいクラスをパッケージに追加すると、通常、すべてのクラスに行く必要がありますそのパッケージ内のクラスとその友達を更新します。私はいつもお尻に完全な痛みを感じていました。
しかし、友達リスト自体は、ある種のバージョン管理の問題を引き起こします。そして、この友好的なクラスの概念がありました。そして、私がそれをデフォルトにしたことの素晴らしいこと-私は問題を解決するので、キーワードはどうあるべきですか?
しばらくの間、実際にはフレンドリーなキーワードがありました。しかし、他のすべては「P」で始まるので、「PH」で「意地悪」になりました。しかし、それはたぶん1日だけそこにありました。
JAVAには「デフォルト」と呼ばれるアクセス修飾子があり、そのパッケージ内でのみ、そのエンティティーの直接インスタンス作成を許可します。
ここに便利なリンクがあります:
まず最初に、Javaには「アクセス指定子」などの用語がないことを1つ言っておきます。すべてを「修飾子」と呼ぶ必要があります。最終的に、静的で、同期された、揮発性のものは修飾子と呼ばれます。パブリック、プライベート、保護された、デフォルトの抽象も修飾子と呼ばれるべきです。デフォルトは、物理的な存在はないがモディファイアが配置されていない場合のモディファイアであり、デフォルトのモディファイアとして扱われる必要があります。
これを正当化するために、1つの例を示します。
public class Simple{
public static void main(String args[]){
System.out.println("Hello Java");
}
}
出力は次のようになります。 Hello Java
ここで、publicをprivateに変更し、どのコンパイラエラーが発生するかを確認します。「ここでは修飾子privateは許可されていません」という結論が出ます。したがって、Javaには用語アクセス指定子がなく、すべてが修飾子であると言えます。