java學習第七天

內部類
       在類的內部也能夠定義另外一個類ide


------------------------------------------------------------
//類嵌套類,類中帶有類
//內部類跟方法同樣,可使用所有的訪問權限修飾符,用法是同樣的this

接口 InterInner
public interface InterInner {
 public void method();
}對象


實現接口 InterInnerImpl繼承

public class InterInnerImpl implements InterInner {接口

 @Override
 public void method() {
 }string

}編譯

 

普通類  Outerclass

public class Outer{
      private int intField;變量

       //第一種:成員內部類,跟成員屬性(方法同級),能夠類比成員屬性權限

       class Inner1{}     //Innerl、Inner二、Inner3都是成員內部類
      
       class Inner2{}

       class Inner3{}

      //編譯後的表現格式:Outer$2Inner4.class
      public void method1(){
         int a = 0;
          //第二種:局部內類
      //跟局部變量同級,用法類別局部變量,不能使用修飾符

        class Inner4{}
                      //Inner四、Inner5都是局部內 類
        class Inner5{}
}
       //第三種: 靜態內部類  能夠類比  靜態屬性
        static class Inner6{}

      //第四種: 匿名內部類
       //由於InterInner interinner = new InterInner() 編譯不能經過
      //抽象類 不能實例化
    //因此
      InterInner interinner = new InterInner(){

      @Override
       public void  method(){}  };


    public static void main(String[] args){
       //第一種:成員內部類  建立 對象的 格式
       Outer outer = new Outer();
       Outer.Inner inner1 = outer.new Inner();
       Outer.Inner2 inner2 = new Outer().new Inner2();

       //第二種:局部內部類
      //沒法經過普通new進行建立,能夠經過繼承/實現接口的方式進行


     //第三種:靜態內部類
      Outer.Inner5 inner5 = new Outer.Inner5();
    
     //第四種:匿名內部類

     InterInner interImp1 = new InterInnerImp1();
   
    //匿名內部類建立對象方式:等價於 InterInner interImp1 = new InterInnerImp1();

   //不同的地方是:沒有類名

   //一、繼承某一個類
   //二、實現某一個接口
    

}

}

----------------------------------------------------------------
普通類 InnerFather

public class InnerFather {

}


接口  InnerInterface

public interface InnerInterface {

}

 

普通類 MemberOuter

public class MemberOuter{
    private int privateField = 1;
    public static int staticField = 3;
    public int a = 1;

  //內部類跟普通類是同樣的,普通類能幹什麼,內部類就能夠幹什麼
  //好比:繼承  實現接口
  //能夠幫助外部類實現多繼承的功能
  //成員內部類運用場景:
  //一、經過內部類能夠實現類的多繼承
  //二、若是外部類是一個 邏輯很是複雜的一個類,須要操做不少屬性
  //或方法 這個時候,能夠對功能進行拆分讓某個或多個內部類,幫忙處理

   class Inner extend InnerFather implements InnerInterface{

      public Inner(){}

      public int a=2;

/*Outer 對象 --》Inner 對象 --》內部成員

  外部類 --》Inner 類 --》靜態成員
    Inner 類 靜態成員 --》常量


   由於訪問成員內部類中屬性 須要經過外部類的對象,進行內部類對象的建立
而後經過內部類的對象進行訪問。若是 在內部類中聲明 靜態屬性 那麼只能
經過內部類的 類名進行訪問 此時 若是內部類是成員內部類時 那麼外部類
不能經過 外部類名.內部類名 訪問內部類靜態成員屬性 因此 要麼把內部類變成
靜態內部類 要麼把 靜態成員 屬性變成 常量(常量表達式)

 

//成員內部類中 不能定義靜態的屬性
public static final int innerStaticField = 1; //常量表達式
public static final String stringInnerStaticField = "aaa";


//同名屬性的狀況下訪問
public void method(){
int a = 3;
//若是沒有特殊指定:this 或Outer.this
//那麼訪問順序跟子類屬性訪問規則一致
//先局部(內部類) -- 成員(內部類) -- 外部
//就近原則

System.out.println("a:" + a);
System.out.println("a:" + this.a);
//內部類訪問外部類屬性的方法Outer.this.屬性
System.out.println("a:" + MemberOuter.this.a);
}
 
//外部類訪問控制
public void method2(){
//能夠訪問外部類的私有屬性
System.out.println("outer 私有屬性" + privateField);
//能夠訪問外部類的靜態屬性

System.out.println("outer 私有屬性" + staticField);
}

//普通方法
public void method(){
Inner inner = new Inner();
inner.method();
}

public static void method2(){

//外部類靜態方法中不能使用成員內部類,若是要調用 就把成員內部類定義成
靜態
//能夠類比靜態方法調用非靜態屬性
//Inner inner = new Inner();
}

public static void main(String[] args){
MemberOuter.Inner inner = new MemberOuter().new Inner();
  //inner.method();
  //inner.method2();
  
  
  MemberOuter outer = new  MemberOuter();
  
  outer.method();
 }
 
}

-------------------------------------------------------------------public class StaticOuter {  private static int staticField = 1; public int intField = 2;  static class Inner{  public int innerField = 1;  public static int  innerStaticField = 2;  //能夠定義非靜態方法  //靜態內部類:  //非靜態方法,能夠訪問內部中靜態/非靜態成員,能夠訪問外部類的靜態成員,沒法訪問,外部類非靜態成員  //緣由:StaticOuter.Inner inner = new StaticOuter.Inner();  //建立靜態內部類對象時候,沒有建立外部的對象,  //此時,不是經過外部類對象訪問非靜態屬性,因此不能訪問  public void method(){   //非靜態方法中能夠訪問外部類靜態屬性,但不能非靜態屬性   //Cannot make a static reference to the non-static field intField   ///System.out.println("outer 非靜態屬性:" + intField);   System.out.println("outer 靜態屬性:" + staticField);      //能夠訪問內部類定義的靜態屬性 ,也能夠訪問非靜態屬性   System.out.println("inner 靜態屬性:" + innerStaticField);   System.out.println("inner 非靜態屬性:" + innerField);  }    //靜態方法  //靜態內部類:  //靜態方法只能訪問靜態屬性或方法,不能訪問非靜態方法或/屬性,無論是外部仍是內類  public static void  method2(){   //Cannot make a static reference to the non-static field intField   //System.out.println("outer 非靜態屬性:" + intField);   System.out.println("outer 靜態屬性:" + staticField);   //能夠訪問內部類定義的靜態屬性 ,也能夠訪問非靜態屬性   System.out.println("inner 靜態屬性:" + innerStaticField);   //Cannot make a static reference to the non-static field innerField   //System.out.println("inner 非靜態屬性:" + innerField);  } } public static void main(String[] args) {  //成員內部類  //MemberOuter.Inner inner = new MemberOuter().new Inner();  //靜態內部類  StaticOuter.Inner inner = new StaticOuter.Inner();  inner.method();     }} 

相關文章
相關標籤/搜索