ネスティドレベルwienerClass+ramです.


  • ランダを理解するには、NestidクラスとInnerクラス
  • について説明します.
  • 実は匿名クラスしか知らない...
  • いわゆるネストクラス

  • クラスで定義されたクラス.
    class Outer{ // 외부 클래스
        class Nested{ ... } // 네스티드 클래스
    }

    Nestidクラスは静的および非静的に分類される。

    // static이 붙은 네스티드 클래스
    class OuterClass{
        static class StaticNestedClass{ ... }
    }
    
    // static이 붙지 않은 네스티드 클래스 (이너 클래스)
    class OuterClass{
        class InnerNestedClass{ ... }
    }
  • 四種類のNested類

  • 静的ネストクラス
  • メンバークラス(Inner)
  • ローカルクラス(Inner)
  • 匿名クラス(Inner)
  • 静的ネストクラス

  • クラス
  • 、静的特性を反映
  • は外部レベルとは別に考えることができる.
  • しかし、外部クラスのプライベート宣言の変数にアクセスできます!
  • class Outer{
        private static int num=0;
        
        static class Nested1{
            // 외부 클래스의 private 변수 num에 직접 접근이 가능하다.
            void add(int n) { num += n; }
        }
        static class Nested2{
            vod get() { return num; }
        }
    }
    class StaticNested{
        public static void main(String[] args) {
            Outer.Nested1 nst1 = new Outer.Nested1(); // static 네스티드 클래스의 접근
            nst1.add(5);
            
            Outer.Nested2 nst2 = new Outer.Nested2();
            System.out.println(nst2.get());
        }
    }

    メンバークラス

  • インスタンス変数、インスタンスメソッドと同じ位置で定義されたクラス
  • 外部クラスに属するインスタンスから.
  • 外部クラスに基づいてアクセスできます.
  • [クラスの定義を非表示にする必要がある場合に使用可能]
  • class Outer{
        class MemberInner{ ... }
    }
    interface Printable{
        void print();
    }
    class Papers{
        private String con;
        public Papers(String s) { con = s;}
        
        public Printable getPrinter(){
            return new Printer();
        }
        
        private class Printer implements Printable{
            public void print(){
                System.out.println(con);
            }
        }
    }
    
    public static void main(String[] args) {
        Papers p = new Papers("서류 내용 : 행복합니다.");
        Printable prn = p.getPrinter();
        prn.print();
        /** main함수에서는 Printer 클래스의 존재를 모르지만, 사용하고 있다. **/
    }

    ローカルクラス

  • メソッドに定義された
  • メンバークラスと比較して、より多くのクラス定義を非表示にする場合に使用できます.
  • class Outer{
        void method(){
            class LocalInner{ ... }
        }
    }
    interface Printable{
        void print();
    }
    class Papers{
        private String con;
        public Papers(String s) { con = s;}
        
        public Printable getPrinter(){
            /** 메소드 안으로 감추었다. **/
            class Printer implements Printable{ // 클래스 이름이 불필요하다. -> 익명 클래스 등장
                public void print(){
                    System.out.println(con);
                }
            }
            return new Printer();
        }
    }
    
    public static void main(String[] args) {
        Papers p = new Papers("서류 내용 : 행복합니다.");
        Printable prn = p.getPrinter();
        prn.print();
        /** main함수에서는 Printer 클래스의 존재를 모르지만, 사용하고 있다. **/
    }

    匿名クラス

  • ローカルクラスでクラス名を省略するには、
  • を実行します.
  • インタフェースを返し、インタフェースの抽象メソッドを定義します.
  • interface Printable{
        void print();
    }
    class Papers{
        private String con;
        public Papers(String s) { con = s;}
        
        public Printable getPrinter(){
            /** 익명 클래스 **/
            return new Printable(){
                public void print(){
                    System.out.println(con);
                }
            };
        }
    }
    
    public static void main(String[] args) {
        Papers p = new Papers("서류 내용 : 행복합니다.");
        Printable prn = p.getPrinter();
        prn.print();
    }

    ランダ

  • の匿名クラスに基づいてコードを記述する場合は...
  • クラスの定義プロセスは省略できます.
  • 匿名クラスのコードの使用(Ramdaを使用しない)

    interface Printable {
        void print(String s);
    }
    
    class Lambda2 {
        public static void main(String[] args) {
            Printable prn = new Printable() {
                @Override
                public void print(String s) {
                    System.out.println(s);
                }
            }
        }
    }

    以上のコードにはランダのコードが使用されています

    interface Printable {
        void print(String s);
    }
    class Lambda3{
        public static void main(String[] args) {
            Printable prn = (s) -> { System.out.println(s); };
            prn.print("What is Lambda?");
        }
    }

    ???

  • (s)はどのように印刷方法を知っていますか?
    -抽象的な方法は一つしかないから->できる.
    ##[解釈コード]
  • (s)を受信するPrintableインタフェースを作成し、
  • インターフェース(抽象的な方法)を実装するコンテンツはシステムである.out.printlnです.
  • ランダの登場過程


    1.一般クラスの使用

    interface Printable {
        void print(String s);
    }
    
    class Printer implements Printable {
        @Override
        public void print(String s) {
            System.out.println(s);
        }
    }
    class Lambda1{
        public static void main(String[] args) {
            Printable prn = new Printer();
            prn.print("Understand Lambda 1");
        }
    }
  • 通常クラスはPrintableインタフェースを実現した.
  • main関数を使用して実装されたPrinterオブジェクトを生成し、使用します.
  • 2.匿名クラスの使用

    interface Printable {
        void print(String s);
    }
    
    class Lambda2 {
        public static void main(String[] args) { 
            Printable prn = new Printable() {
                @Override
                public void print(String s) {
                    System.out.println(s);
                }
            }
        };
        prn.print("Understand Lambda 2");
    }

    3.匿名クラスで不要な部分は省略

  • クラス名生成部(共通void print)
  • 抽象メソッドの名前で定義された部分(public void print(Strings)である
  • 抽象メソッドのみ
    interface Printable {
        void print(String s);
    }
    class Lambda3{
        public static void main(String[] args) {
            Printable prn = (s) -> { System.out.println(s); };
            prn.print("What is Lambda?");
        }
    }
    [ソース]
  • 尹聖祐熱血Java講の