Javaの内部クラス--どのくらい知っていますか.


私はこの文章を書く前に、Java内部クラスについてもよく知らず、簡単な応用しか知らなかった.先日、Javaの内部クラスをどう理解するかと聞かれた友達がいましたが、私は少し馬鹿でした.長いこと考えても言えませんでした.もし皆さんにこの質問に答えてもらったら、どう答えたらいいと思いますか.答えられない人や、答えが不完全な人がいると思います.私はわざわざ調べて、自分でまた総括して、ここでみんなに分かち合います.話す前に、いくつかの質問をリストします.
1.外部クラス(非プライマリクラス)はどのように内部クラスにアクセスしますか?
2.内部クラスはプライマリクラスのプライベート属性にアクセスできません.なぜですか.
3.内部クラスは他のクラスとインタフェースを継承できますか?
4.内部クラスはstaticですか?
5.マスタークラスのメソッドで内部クラスを定義できますか?
6.主クラスを初期化するときも内部クラスを初期化したのではないでしょうか.どうして?
7.匿名の内部クラスをどのように書きますか?
私が今考えているのはこれだけです.私が皆さんに陳述する前に、よく考えてから下を見てください.
最初の質問:外部クラスはどのように内部クラスを参照しますか?この問題は、こう書く人もいるかもしれないと思います.
これは内部クラスです.InnerClassです.
public class MainClass { 
    public class InnerClass{ 
         public String name = "name"; 

         public String getName() { 
             return name; 
         } 

         public void setName(String name) {
             this.name = name;
         }
     }
 } 
 
以下は参照です.
public class CheckClass {
     public static void main(String[] args) {
         InnerClass innerClass = new InnerClass();
         System.out.println(innerClass.getName());
     }
 }

   
    このように書くと、コンパイルエラーが報告されます.では、なぜ間違えたのでしょうか.Javaのデザインでは、クラスの内部クラスにアクセスするには、ホストクラスを通じてそれを取りに行かなければなりません.そして、それを操作しなければなりません.Javaはこのように内部クラスを閉鎖したいと思っています.はい、正しい書き方は、私が貼っておきます.
以下は内部クラスの書き方です.
public class MainClass { 
     public InnerClass getInnerClass() { 
         return new InnerClass(); 
     } 
  
     public class InnerClass { 
         public String name = "name"; 
  
         public String getName() {
             return name;
         }
 
         public void setName(String name) {
             this.name = name;
         }
     }
 }

  
    Java内部クラスにアクセスするには、まずホストクラスを取得する必要があります.これにより、内部クラスを操作できます.
public class CheckClass {
     public static void main(String[] args) {
         MainClass mainClass = new MainClass();
         System.out.println(mainClass.getInnerClass().getName());
     }
 }

   これで、コンパイルはエラーを報告しません.
では、2つ目の質問に答えます.内部クラスは宿主クラスのプライベート属性にアクセスできますか?答えはいいです.JVMのソースコードを見ると、内部クラスをコンパイルしてプライマリクラスのプライベート変数を呼び出すと、特殊なシンボルに変換され、JVMはこのシンボルを共有に解析し、内部クラスを呼び出します.コードは簡単ですから、貼らないでください.
次に3番目と4番目の質問に答えます.内部クラスは他のクラスとインタフェースを継承できますか.内部クラスはstaticですか?なぜできないのか、もちろんできます.これらには制約はありません.自分でやってみてください.
この5つ目の問題は、プライマリクラスのメソッドで内部クラスを定義できますか?実は、この質問、私が最初の質問に答えたとき、すでに答えを皆さんに教えました.getInnerClass()メソッドの中で、newの内部クラスではないでしょうか.
6つ目の質問:メインクラスを初期化するときも内部クラスを初期化したのではないでしょうか.どうして?これは、逆に言えば正しいです.もし、内部クラスを呼び出したいなら、その主クラスを初期化しなければなりません.そのため、内部クラスを初期化するときに主クラスを初期化しました.しかし、主クラスを初期化し、表示されていない場合は、内部クラスを初期化することはできません.内部クラスは主クラスの中にありますが.もし、時間があれば、コンパイルされたプライマリクラスファイルに行ってみてください.
最後の質問は、匿名の内部クラスをどのように書くかです.Java SwingやAndroidの開発をしたことがあるなら、この問題は簡単です.勝手なイベントで匿名の内部クラスを定義し、その方法を実現することができますから.しかし、より多くの人に理解してもらうために、コードを貼り付けました.以下は私のコードです.
これは実現するインタフェースです.
public interface SuperInterface {
     public void print();
 }  


次は、プライマリクラスのコードです.
public class MainClass { 
      
     public SuperInterface print(){ 
          
         return new SuperInterface(){ 
  
             public void print() { 
                 System.out.println("Hello Anonymity Interface"); 
             }};
     }
 } 

 
実は上のコードは匿名の内部クラスですが、なぜ匿名の内部クラスと呼ばれていますか?なぜなら、あなたはその内部クラスに名前をつけず、そのインタフェースを直接実現しているので、匿名の内部クラスと呼ばれています.
はい、私は書くことも少なくありませんが、私はまた漏れたところがあるかもしれません.みんなが参加して共同討論に参加することを望んでいます.