2016-06-19 11 views
2

だが、私はこのようなクラスがあるとしましょうあります:内部クラスがプライベートであることから、上記のコードでプライベート内部クラスにアクセス修飾子を宣言する必要が

public class OuterClass { 
    //... 
    private class InnerClass { 
    private int x; // This variable makes sense 
    public int y; // Is there any use for this? 
    } 
} 

を、唯一の外側のクラスは、アクセス権を持っていますすべての変数、さらにはプライベート変数にも適用されます。内部クラス自体は他のクラスからは見えませんが、外部クラスを囲んでいます。

したがって、変数yは公開されていますが、外部クラス以外の他のクラスではアクセスできません。

プライベート内部クラスのすべてのアクセス修飾子がデフォルトでプライベートであるように見えますか?

それで、内部クラスのメンバーのいずれかに対してアクセス修飾子をまったく宣言する理由はありますか?

+1

'public class InnerClass2 extends InnerClass {}'(これはお勧めしませんが) – fabian

+0

@fabianとは何ですか? InnerClass2はまだ 'InnerClass'のpublicとprivateフィールドの全てにアクセスすることができます。 – Kingamere

+1

このようにして、スーパークラスの 'public'メンバーへのアクセスを提供する' InnerClass'の 'public'サブクラスのインスタンスを作成することができます。しかし、実際のユースケースを考えることはできません... – fabian

答えて

0

アクセス修飾子が重要な場合は、スーパークラスメソッド(たとえばtoString()など)をオーバーライドするメソッドの場合です。オーバーライドされたメソッドの表示を減らすことはできません。クラスをコンパイルするには、toString()を常にpublicとして宣言する必要があります。

外部クラスがプライベートメンバーにアクセスすると、コンパイラは合成メソッドを作成します。この合成メソッドは、ネストされたクラスの.classファイルでのみ表示されます。

アクセス修飾子のスコープが、内部クラス自体がプライベートではない場合に問題になるもう1つのケース。

関連する問題