java内部クラスの総括問題:内部類、静的内部類の区別、使用シーン?

18362 ワード

問題:内部類、静的内部類の区別、使用シーン?
1.静的な内部クラスは、静的な内部クラスではなく、静的なメンバー(方法、属性)を持つことができます。2.静的な内部クラスは外部クラスの静的なメンバーにしかアクセスできません。静的な内部クラスではなく、外部クラスのすべてのメンバー(方法、属性)にアクセスできます。3.実装方法が異なります。(1)実装メンバー内部クラス「」は外部クラスのオブジェクトを介してOutClass Test Co 1=new OutClass Test()を作成します。OutClass Test.Inner Class no_static.inner=co 1.new Inneraclass()(2)静的な内部クラスを具体化する:OutClass Test.Innerantic Class inner=new OutClass Test.Innenerantic Class()
3.内部クラスにアクセスするメンバーの属性は違っています。(1)外部クラスは内部クラスの属性と方法にアクセスします。外部クラスは内部クラスの引用によって間接的に内部クラスの要素にアクセスできます。new IN().inMessage(2)外部クラスは静的な内部クラスにアクセスします。内部静的なタイプのメソッドや静的変数を呼び出し、類名を通じて直接OutClass Test.Innenearstic Class Class Class.Innese Class Class Class.static ClavalueOutClass Test.Innerstatic Class.get Message()6.なぜ内部クラスを使うのですか?
  • 内部クラスは、プライベート属性を含む外部クラスの全メンバーにアクセスすることができる。
  • は、論理関係があるクラスを一緒に組織し、外部に隠すことができる。
  • は、外部クラスがあるインターフェースを継承しているかどうかにかかわらず、それぞれの内部クラスが独立して一つのインターフェースを継承することができる。したがって、内部クラスは多重継承の解決策をより完全にする。
  • 一、内部類は何ですか?(一般)
    クラスOutの内部でクラスinを定義します。このクラスは内部クラスです。Outは外部クラスになります。
    二、内部類と外部類の連絡
    1、内部クラスはコンパイル時の概念で、外部クラスと内部クラスをコンパイルすると独立したクラスファイルが二つ生成されます。OuterClass.classとOuterClass$Inners Class.class
    2、内部クラスは直接外部の要素にアクセスできますが、外部類は直接内部の要素にアクセスできません。
    3、外部類は内部の引用によって間接的に内部の要素にアクセスできます。
    4、静的な内部クラスに対しては、静的な内部クラスは外部クラスに依存しない、すなわち外部クラスのオブジェクトを作成しない場合に内部クラスのオブジェクトを作成することができる。なお、静的内部類は、外部類の対象に向けた参照を持たないものである。
    三、内部類の分類
    メンバー内部クラス、ローカル内部クラス、匿名内部クラス、静的内部クラス。
    1、メンバー内部クラス
    メンバーの内部クラスは普通の内部クラスです。内部クラスはpublic、protected、prvateなどのアクセス制限を宣言できます。abstractのために他の内部クラスまたは外部類の継承と拡張を提供すると宣言できます。あるいはstatic、finalと宣言しても、特定のインターフェースを実現できます。
    メンバーの内部類がprvateで修飾すれば、外部類の内部訪問しかできません。publicで修飾すれば、どこでも訪問できます。protectedで修飾すると、同じパッケージの下か、または外部クラスを継承する場合のみ訪問することができます。デフォルトのアクセス権限であれば、同じパッケージでしかアクセスできません。この点は外部のものとはちょっと違っています。外部のものはpublicとパッケージにしかアクセスできません。
    外部クラスは従来のクラスのアクセス方式で内部クラスを使用していますが、唯一の違いは外部クラスが内部クラスにアクセスできるすべての方法と属性です。
    内部クラスのthisは他のクラスと同じように自分自身を指します。内部クラスのオブジェクトを作成すると、その周辺オブジェクトを作成することと何らかの関連があり、そのために周辺クラスのすべてのメンバーにアクセスすることができます。外部クラスで内部クラスのオブジェクトを作成すると、この部類のオブジェクトは外部クラスへの参照を秘密に捕獲しますので、この引用によって周辺クラスのメンバーにアクセスすることができます。
    2、局部内部類
    局所内部クラスは、1つの方法または1つの作用領域に定義されるクラスであり、それとメンバー内部クラスの違いは、ローカル内部クラスへのアクセスが、方法内またはその作用領域内に限定されることである。
    3、匿名内部クラス
    匿名の内部クラスとは、名前のない方法の内部クラスであるため、メソッド内部クラスのすべての制約に適合しています。
    匿名の内部クラスにはアクセラレータがありません。匿名の内部クラスは、クラス名がないので、抽象的なクラスを継承しなければならない、または、匿名のインターフェースの内部クラス内に任意の静的なメンバまたは方法の匿名の内部クラスが存在してはならない。
    匿名の内部クラスを使用する一般的なシーンは、継承または実装されるインターフェースは抽象的な方法だけである。
        [https://www.cnblogs.com/CodingAndRiding/p/7441438.html][1]
     public class Test {
        public static void main(String[] args) {
            //4.     
            //                         
            Student stu=new Student();
            System.out.println(stu.getClass());//class com.aowin.noname.Student
            //4.1.              
            //              
            Person p=new Person(){
                public void eat(){
                    System.out.println("     ");
                }
            };
            p.eat();
            System.out.println(p.getClass());//class com.aowin.noname.Test$1//         Test$1
            
            Dog dog=new Dog();
            dog.bark();
            //4.2.              
            //                 ,               
            Animal an=new Animal(){
                public void bark(){
                    System.out.println("   ...");
                }
            };
            an.bark();
            //         
            System.out.println(an.getClass());//class com.aowin.noname.Test$2
            
            //4.3.             
            //                 ,              
            Sportable s=new Sportable(){
                public void sport(){
                    System.out.println("   ");
                }
            };
            s.sport();
            System.out.println(s.getClass());//class com.aowin.noname.Test$3
            
        }
    }
    //   
    class Person{
        public void eat(){
            System.out.println("  ");
        }
    }
    class Student extends Person{
        public void eat(){
            System.out.println("     ");
        }
    }
    //   
    abstract class Animal{
        public abstract void bark();
    }
    class Dog extends Animal{
        public void bark() {
            System.out.println("  ...");
        }
    }
    //  
    interface Sportable{
        public abstract void sport();
    }
    4、静的内部類
    キーワードstaticはメンバー変数、方法、コードブロックを修飾することができます。実は内部の種類も修飾できます。staticを使って修飾された内部の種類を静的な内部の種類と呼びます。
    静的な内部クラスと非静的な内部クラスの間には最大の違いがあり、非静的な内部クラスはコンパイルが完了した後に暗黙的に参照が保存されることを知っています。
    しかし、静的な内部クラスはありません。
    この引用がないということは、
    静的な内部クラスの作成は、外周に依存する必要はなく、静的な内部クラスを直接作成することができます。任意の外周類の非staticメンバー変数と方法を使用することはできません。
        private static String outerName;
        public  int age;
    
        static class InnerClass1{
            /*                 */
            public static String _innerName = "static variable";
            public void display(){
                /*
                 *                       
                 *                   
                 */
                System.out.println("OutClass name :" + outerName);
            }
        }
        class InnerClass2{
            /*                 */
            public String _innerName = "no static variable";
            /*                    ,             */
            public void display(){
                System.out.println("OuterClass name:" + outerName);
                System.out.println("OuterClass age:" + age);
            }
        }
        public void display(){
            /*                   */
            System.out.println(InnerClass1._innerName);
            /*                        */
            new InnerClass1().display();
            /*                  */
            OuterClass.InnerClass2 inner2 = new OuterClass().new InnerClass2();
            /*                          */
            System.out.println(inner2._innerName);
            inner2.display();
        }
    
        public static void main(String[] args) {
            OuterClass outer = new OuterClass();
            outer.display();
        }
    }
    四、内部類と外部類の相互訪問
    1、内部クラスは外部クラスのメンバーにアクセスします。
    メンバー内部クラスが外部クラスと同名のメンバー変数やメソッドを持っていると、隠し現象が発生します。つまりデフォルトではメンバー内部クラスのメンバーにアクセスします。外部クラスの同名のメンバーにアクセスするには、以下のような形でアクセスする必要があります。
    外部クラス.this.メンバー変数 
    外部クラス.this.メンバー方法
    2、外部類は内部類メンバーの外部類にアクセスします。内部類の引用によって間接的に内部種類の要素にアクセスできます。
    外部クラスでメンバーの内部クラスのメンバーにアクセスするには、まずメンバーの内部クラスのオブジェクトを作成し、このオブジェクトに向けた参照によってアクセスしなければなりません。
    new In().inMessage();  //           ,   
    
        class In{     //   
            public void inMessage() {
                System.out.println("     ");  //    private  
            }
        }  
    3、静的内部類と外部類のアクセス(入れ子類に相当)
    (1)静的な内部クラスは外部クラスにアクセスする: 
    外部クラスの静的メンバーにしかアクセスできません。非静的メンバーにはアクセスできません。
    (2)外部クラスから静的内部クラスへのアクセス:直接アクセス可能、内部クラス名・属性(方法)
    北京大学の青い鳥 HD 09455