Javaの内部クラスのメンバー内部クラス

6961 ワード

コンテンツの取り出しhttp://www.cnblogs.com/yasepix/p/5776425.html
Java内部クラスの役割
推薦一、定義
1つのクラスの内部に置かれているクラスを内部クラスと呼びます.二、作用1.内部クラスは一般的な非内部クラスをよく隠すことができ、privateとprotectedの権限を持つことは許されないが、内部クラスは2.内部クラスは周辺クラスのすべての要素のアクセス権限を持つことができる3.しかし多重継承を実現する4.インタフェースを修正することを避けることができ、同じクラスの2つの同名メソッドの呼び出しを実現することができる.
三、例
1.非表示の実装
通常、私たちのクラスへのアクセス権限は、クラスの前のアクセス修飾子によって制限されています.一般的な非内部クラスではprivateとprotectedの権限は許されませんが、内部クラスではできます.だから、内部クラスで私たちの情報を隠すことができます.次の例を見ることができます
インタフェース
package insidecategory;
public interface Incrementable
{
voidincrement();
}


   

package insidecategory;
public class Example {
            privateclass InsideClass implements InterfaceTest
             {
                          publicvoid test()
                           {
                                  System.out.println("      ");
                           }
             }
              publicInterfaceTest getIn()
             {
                     returnnew InsideClass();
             }
}


上に太くなった部分は内部クラス、アクセス修飾子はprivate
クライアントプログラム
package insidecategory;

public class TestExample {
               public staticvoid main(String args[])
               {
                     Examplea=new Example();
                     InterfaceTest a1=a.getIn();
                     a1.test();
               }
}


太くなった部分はクライアントが呼び出したコードで、このコードからExampleのgetIn()メソッドがInterfaceTestインスタンスを返すことができることを知っていますが、私はこのインスタンスがこのように実現されていることを知りません.また、InsideClassはprivateなので、コードを見ないとこの具体的なクラスの名前が全然見えないので、隠すことができます.
2.周辺クラスのすべての要素に無条件にアクセスできる
package insidecategory;
  public class TagBean {
      private Stringname="liutao";
          private classInTest
           {
                   publicInTest()
                   {
                       System.out.println(name);
                   }
           }
           public voidtest()
           {
                      newInTest();
           }
           public staticvoid main(String args[])
           {
                  TagBeanbb=new TagBean();
                  bb.test();
           }
}


上の太字部分を見ると、nameという変数はTagBeanで定義されているプライベート変数です.この変数は内部クラスでSystem.out.println(name)に無条件にアクセスできる.
3.多重継承が可能
この特徴は非常に重要であり,個人的には内部クラスが存在する最大の理由の一つであると考えられる.彼の存在こそJavaの継承メカニズムをより完備させた.Javaは1つのクラスしか継承できないことはよく知られていますが、その多重継承は私たちが内部クラスを学ぶ前にインタフェースで実現されています.しかし、インタフェースを使うには不便な点が多いことがあります.例えば、インタフェースを実現するには、その中のすべての方法を実現しなければなりません.内部クラスがあると違いますこれにより、クラスは複数の特定のクラスまたは抽象クラスを継承できます.次の例を見てみましょう.
  

packageinsidecategory;
public class Example1 {
           public Stringname()
           {
                  return"liutao";
           }
}

  

package insidecategory;
public class Example2 {
          public intage()
          {
             return25;
          }
}


  


packageinsidecategory;
public class MainExample
{
            private classtest1 extends Example1
            {
                   publicString name()
                   {
                       returnsuper.name();
                   }
            }
            privateclass test2 extends Example2
             {
                   publicint age()
                   {
                        returnsuper.age();
                   }
             }
            public Stringname()
             {
                  return newtest1().name();
             }
             public intage()
             {
                   returnnew test2().age();
             }
             public staticvoid main(String args[])
             {
                   MainExample mi=new MainExample();
                   System.out.println("  :"+mi.name());
                   System.out.println("  :"+mi.age());
            }
}


クラス3を見てください.中にはそれぞれ2つの内部クラスtest 1とtest 2が実現され、test 1クラスはExample 1を継承し、test 2はExample 2を継承しています.これにより、私たちのクラス3 MainExampleはExample 1とExample 2の方法と属性を持ち、間接的にマルチ継承を実現しました.
四、インタフェースの変更を回避し、同じクラスの2つの同名メソッドの呼び出しを実現する.
もし、あなたのクラスがクラスを継承し、インタフェースを実現しなければならないとしたら、あなたが継承したクラスとインタフェースに同名の方法が2つあることに気づいたらどうしますか?どうやって区別しますか?これは私たちの内部クラスが必要です.次のコードを見て
  

packageinsidecategory;
public interface Incrementable
{
             voidincrement();
}
 MyIncrement

packageinsidecategory;
 public class MyIncrement {
        public voidincrement()
        {
             System.out.println("Other increment()");
        }
       static voidf(MyIncrement f)
        {
              f.increment();
        }
}


上に黒い部分を見て、両方の方法は同じです.次のクラスを見て、この2つのクラスを継承します.内部クラスを使用しない場合は
package insidecategory;

public class Callee2 extends MyIncrement implementsIncrementable
{
             public void increment()
{
//  
}
}

皆さんにincrement()この方法はMyIncrementのここをカバーする方法ですか?やはりIncrementableここの方法です.どうしてMyIncrementに異動できるの?明らかにこれは区別しにくい.内部クラスを使えばこの問題を解決することができます次のコードを見てください
package insidecategory;
public class Callee2 extends MyIncrement
{
    private inti=0;
    private voidincrement()
     {
                 i++;
                 System.out.println(i);
     }
    private classClosure implements Incrementable
    {
                 publicvoid increment()
                 {
                      System.out.println(“    increment()  ”);
                 }
    }
    IncrementablegetCallbackReference()
     {
                 return newClosure();
     }
}

インタフェースは内部クラスで実装できます.これにより、周辺クラスのメソッドと競合しません.次に、メンバー内部クラスのインスタンス化方法について説明します.
//    MemberInner 
package com.qf.demo9;
public class MemeberInner {

    private String name ="   ";
    private int age = 300;
    
    public void sleep(){
        System.out.println("    ");
    }
    //      
    //               
       class Inner{
        //                      
         //          final static       
        public final static String sex = "  ";
        private double money;
        
        public  void eat(){
            //                          
            System.out.println(age);
            sleep();
            System.out.println(name);
            System.out.println(" ");
        }   
    }   
}

Mainメソッド
package com.qf.demo9;

import com.qf.demo9.MemeberInner2.Inner;

//import com.qf.demo9.MemeberInner.Inner;

/**
 *    :              ,            
 *                ,   
 * 
 *     :                
 * 
 *       :
 *           :                     
 *           
 *           
 *           
 *  
 */
public class Test {

    public static void main(String[] args) {
        //        
        MemeberInner memeberInner = new MemeberInner();
        //                            
        //       .new     ();
        MemeberInner.Inner inner = memeberInner.new Inner();
        inner.eat();        
        MemeberInner2 memeberInner2 = new MemeberInner2();
        Inner inner2 = memeberInner2.new  Inner();
        inner2.sleep();
        
    }
}