2022/02/23 Javaの各種機能


複数の内部クラスの定義とタイプ.
内部クラスとは?(inner class)
クラス内でクラスを宣言する場合を内部クラスと呼びます
  • クラスで宣言されたクラスは、通常、クラスを囲む外部クラスと密接に関連しており、他の外部クラスが使用可能な場所がない場合は、内部クラスとして使用されると宣言されています.
  • ネストクラス
  • とも呼ばれる.
  • 内部クラスのタイプ
    インスタンス内部クラス、静的内部クラス、ローカル内部クラス、匿名内部クラス
  • インスタンス内部クラス
  • 内部で使用されるクライスラー宣言(プライベートとして宣言することを推奨し、プライベートとして宣言しない場合は外部で使用できるため、プライベートとすべき).
  • 外部クラス(静的内部クラスとは異なる)を作成した
  • 非プライベート内部クラスは、他の外部クラスにおいて
  • を作成することができる.
    OutClass outClass=new OutClass(	);
    OutClass.InClass inClass=outClass.new InClass();
    サンプルコード
    class OutClass{
        private int num=10;
        private static int sNum=20;
        private InClass inClass;
    
        public OutClass() {
            inClass = new InClass();
        }
    
        private class InClass{
            int iNum = 100;
            void inTest(){
                System.out.println("OutClass num =  "+num+"(외부 클래스 의 인스턴스 변수)");
                System.out.println("OutClass sNum =  "+sNum+"(외부 클래스의 스태틱 변수)");
                System.out.println("InClass inNum = "+iNum+ "(내부 클래스의 인스턴스 변수)");
            }
        }
        public void usingClass(){
            inClass.inTest();
        }
    }
    
    
    
    public class InnerTest {
        public static void main(String[] args) {
            OutClass outClass=new OutClass();
            outClass.usingClass();
        }
    }
    静的内部クラス
  • は、外部クラス
  • を作成するために使用することができる.
  • 静的変数、静的方法
  • を使用
    静的内部クラスの例
    class OutClass{
        private int num=10;
        private static int sNum=20;
        private InClass inClass;
    
        public OutClass() {
            inClass = new InClass();
        }
    
        private class InClass{
            int iNum = 100;
            void inTest(){
                System.out.println("OutClass num =  "+num+"(외부 클래스 의 인스턴스 변수)");
                System.out.println("OutClass sNum =  "+sNum+"(외부 클래스의 스태틱 변수)");
                System.out.println("InClass inNum = "+iNum+ "(내부 클래스의 인스턴스 변수)");
            }
        }
        public void usingClass(){
            inClass.inTest();
        }
    
        static class InStaticClass {
            int iNum=100;
            static int sInNum =200;
    
            void inTest(){
                System.out.println("InClass num =  "+iNum+"(내부 클래스 의 인스턴스 변수)");
                System.out.println("OutClass sNum =  "+sNum+"(외부 클래스의 스태틱 변수)");
                System.out.println("InClass sNum = "+sInNum+ "(내부 클래스의 스태틱 변수)");
            }
    
            static void sTest(){
    
                System.out.println("OutClass sNum =  "+sNum+"(외부 클래스의 스태틱 변수)");
                System.out.println("InClass sNum = "+sInNum+ "(내부 클래스의 스태틱 변수)");
    
            }
        }
    }
    
    
    
    public class InnerTest {
        public static void main(String[] args) {
    //        OutClass outClass=new OutClass();
    //        outClass.usingClass();
    
            OutClass.InStaticClass sInClass=new OutClass.InStaticClass();
            sInClass.inTest();
    
            OutClass.InStaticClass.sTest();
        }
    }
    ローカルクラス
    メソッドで定義および使用されるクラス、例えば
  • 領域変数
  • メソッドの呼び出しが完了すると、メソッドで使用する領域変数の有効性は
  • から消える.
  • メソッドが呼び出された後に使用する必要がある場合があります.したがって、ゾーン内部クラスで使用するメソッドのゾーン変数またはパラメータは、最終的に
  • と宣言されます.
    匿名の内部クラス
  • 名前のないクラス(上記の地域内クラスを実際に呼び出すMyRunnableクラス名がない)
  • クラスの名前をスキップし、主にインタフェースまたは抽象クラスを実装し、
  • を返します.
  • インタフェースまたは抽象クラスデータ型の変数に直接クラスを作成するか、または領域内部クラスのメソッドでクラス
  • を作成して戻すことができる.
  • ウィジェット用の組み込みプロセッサ