javaの読書ノートの15のjavaの中の内部の種類を整理します。


内部クラスとは、外部クラスの内部にもう一つのクラスを定義することです。クラス名はフォルダと同じではありません。
*内部クラスは静的なstaticでもいいし、public、default、protected、prvateでもいいです。外部のトップクラスであるクラス名とファイル名は同じで、publicとdefaultだけを使用することができます。
前言
 JavaはJDK 1.1の時から、内部の概念を導入し始めました。このブログを通じて、Javaの内部に関するいくつかの特性を共有します。
 内部類は何ですか?
 多くの場合、クラスは独立したプログラムユニットとして定義されていますが、あるクラスを別のクラスの内部定義に置くこともあります。この定義は他のクラスの内部のクラスを内部クラスといいます。
文法的に見ると、内部類を定義するのと外部類を定義するのとは大体同じ文法で、内部類は他の種類に定義する必要がある以外に、次の2つの違いがあります。
 1.内部類比外部類は三つの修饰符を多く使う:prvate――protected、static――外部類はこの三つの修饰符を使ってはいけない。
 2.静的でない内部クラスは静的なメンバーを持つことができません。
 以上の2つの点を除いて、他のところは普通のクラスと同じです。よくある内部類の操作を紹介します。
  非静的内部クラス
  内部クラスを定義するのもとても簡単です。一つのクラスを別のクラスの内部に置いて定義すればいいです。方法の内部に置くこともできます。

<span style="font-family:Comic Sans MS;font-size:18px;">package com.test; 
public class Cow 
{ 
  private double weight; 
  //              
  public Cow(){} 
  public Cow(double weight) 
  { 
    this.weight = weight; 
  } 
  //            
  private class CowLeg 
  { 
    //               
    private double length; 
    private String color; 
    //                 
    public CowLeg(){} 
    public CowLeg(double length , String color) 
    { 
      this.length = length; 
      this.color = color; 
    } 
    //     length、color setter getter   
    public void setLength(double length) 
    { 
      this.length = length; 
    } 
    public double getLength() 
    { 
      return this.length; 
    } 
    public void setColor(String color) 
    { 
      this.color = color; 
    } 
    public String getColor() 
    { 
      return this.color; 
    } 
    //             
    public void info() 
    { 
      System.out.println("       :" 
        + color + ",  :" + length); 
      //         private        
      System.out.println("        :" + weight);  //① 
    } 
  } 
  public void test() 
  { 
    CowLeg cl = new CowLeg(1.12 , "    "); 
    cl.info(); 
  } 
  public static void main(String[] args) 
  { 
    Cow cow = new Cow(378.9); 
    cow.test(); 
  } 
} 
</span> 
 上記の非静的内部クラスのメンバーは外部クラスのprvateメンバーにアクセスすることができますが、逆に成立しません。非静的内部クラスのメンバは非静的内部クラスの範囲でのみ分かり、外部クラスに直接使用されてはいけない。外部クラスが非静的な内部クラスのメンバにアクセスする必要がある場合、非静的な内部クラスオブジェクトを明示的に作成して、そのインスタンスメンバーへのアクセスを呼び出す必要があります。

<span style="font-family:Comic Sans MS;font-size:18px;">package com.test; 
public class Outer 
{ 
  private int outProp = 9; 
  class Inner 
  { 
    private int inProp = 5; 
    public void acessOuterProp() 
    { 
      //                 private     
      System.out.println("    outProp :" 
        + outProp); 
    } 
  } 
  public void accessInnerProp() 
  { 
    //                     , 
    //            
    // System.out.println("    inProp :" + inProp); 
    //             ,            
    System.out.println("    inProp :" 
      + new Inner().inProp); 
  } 
  public static void main(String[] args) 
  { 
    //       ,         ,          
    Outer out = new Outer();   //① 
    out.accessInnerProp(); 
  } 
} 
</span> 
 注意:非静的内部クラスでは、静的方法、静的メンバ変数、静的初期化ブロックがあってはならない。
 静的内部クラス
 もしstaticを使って内部クラスを修飾すれば、この内部類は外部類自身に属し、外部類のある対象ではないので、staticを使って修飾する内部類はクラス内部類と呼ばれ、あるところは静的内部類とも言われます。静的な内部クラスは、静的なメンバを含むことができ、非静的なメンバを含むことができる。静的なメンバが非静的なメンバにアクセスできない規則によれば、静的な内部クラスは外部クラスの例示的なメンバにアクセスできず、外部クラスのクラスメンバーにのみアクセスすることができる。

<span style="font-family:Comic Sans MS;font-size:18px;">package com.test; 
public class StaticInnerClassTest 
{ 
  private int prop1 = 5; 
  private static int prop2 = 9; 
  static class StaticInnerClass 
  { 
    //                
    private static int age; 
    public void accessOuterProp() 
    { 
      //         : 
      //                   
      System.out.println(prop1); 
      //        
      System.out.println(prop2); 
    } 
  } 
} 
</span> 
 匿名の内部クラス
 匿名の内部クラスを使用して、一回だけ使用するクラスを作成し、匿名の内部クラスを作成すると、直ちにこのクラスのインスタンスを作成しますが、規則に注意してください。
 1.匿名の内部クラスは、匿名の内部クラスを作成する際に、直ちに匿名の内部クラスのオブジェクトを作成するので、匿名の内部クラスを抽象クラスとして定義することはできません。
 2.匿名の内部クラスはコンストラクタを定義できません。匿名の内部クラスにはクラス名がないため、コンストラクタを定義することができません。 

<span style="font-family:Comic Sans MS;font-size:18px;">package com.test; 
interface Product 
{ 
  public double getPrice(); 
  public String getName(); 
} 
public class AnonymousTest 
{ 
  public void test(Product p) 
  { 
    System.out.println("     " + p.getName() 
      + ",   " + p.getPrice()); 
  } 
  public static void main(String[] args) 
  { 
    AnonymousTest ta = new AnonymousTest(); 
    //   test()   ,      Product  , 
    //               
    ta.test(new Product() 
    { 
      public double getPrice() 
      { 
        return 567.8; 
      } 
      public String getName() 
      { 
        return "AGP  "; 
      } 
    }); 
  } 
} 
</span>
以下の内部の共通編集者をまとめます。
(1)、内部クラスは依然として独立したクラスであり、コンパイル後に内部クラスは独立した.クラスファイルにコンパイルされるが、前に外部クラスの名前と$記号を冠している。
(2)、内部類は普通の方式でアクセスできない。内部のクラスは外部のメンバーですので、内部のクラスは外部のメンバー変数に自由にアクセスできます。
(3)、内部の音が静的であると、外部クラスのメンバー変数に勝手にアクセスできなくなります。この場合、内部のクラスは外部クラスの静的なメンバー変数にしかアクセスできません。