2016-07-18 3 views
-1

メソッドで宣言されたローカルクラスがあり、そのフィールドはプライベートとして宣言されています。しかし、私は引き続き封筒法の本体から直接それらにアクセスすることができます - これはなぜですか?ローカルクラスのアクセス制御修飾子 - なぜ機能しないのですか?

私は匿名クラスのすべてのフィールドを非公開として宣言しましたが、実際にこれを行う際に何らかの利点がありますか?何かそれらにアクセスできますか?

編集:それはネストされたクラスと同様にアクセスされるので、それがアクセスされた理由コードの例

public void myMethod() { 

    class myException extends SomeOtherException{ 
     private boolean Bool; 

     public Boolean getBool() { return this.Bool; } 

     public myException() { //constructor stuff } 
    } 

    try { 
     Thing.setHandler(new HandlingClass() { 
      private String myString; //What is the point in making these private? 

      ... other methods in anonymous class ... 
     } 
    ... more code ... 
    } catch (myException e) { 
     ... e.Bool //Can be accessed. Why? 
    } 
} 
+0

コードを追加してください。 – Fildor

+0

'myString' **をプライベートにする目的はありません**;反射動作はわずかに異なります(SecurityManagerがインストールされている場合)。あなたが '新しいHandlingClass(){...} .myString' –

答えて

0

理由があります。あなたのメソッドによると、ローカルクラスの属性は表示されますが、それがNestedクラスの場合は同じでした。エンクロージングクラスの

へのアクセスメンバー

ローカルクラスは、その外側のクラスのメンバーへのアクセスを持っています。ここ

ローカルクラスのJavaドキュメントからの断片です。

さらに、ローカルクラスはローカル変数にアクセスできます。ただし、 ローカルクラスは、final宣言されたローカル変数にしかアクセスできません。 ローカルクラスが、ブロックを囲む のローカル変数またはパラメータにアクセスすると、その変数またはパラメータを取得します。たとえば、 PhoneNumberコンストラクタはローカル変数numberLength にアクセスできます。これはfinal宣言されているためです。 numberLengthはキャプチャされた変数です。

しかし、Java SE 8以降では、ローカルクラスはローカルの 変数にアクセスし、囲みブロックのパラメータと最終的には を有効にすることができます。値が決して である変数またはパラメータが、初期化された後に変更された場合、実質的に最終的です。

https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html

関連する問題