天天看點

内部類 枚舉(enum)基本屬性和使用詳解

☆☆☆内部類和枚舉的使用解析 枚舉建立于調用

一、内部類

概念:

一個類中又定義了一個完整的類結構。

被包含的類 稱為 内部類
類體中包含其他類的類 稱為 外部類

其他的類 稱為 外部其他類
           

1、分類

(一)成員内部類

    特點:
          1.可以加通路修飾符

          2.作用範圍比較大,外部類和外部其他類都能通路到
    分類
        <1>普通成員内部類

            1.外部類的成員和内部類的成員同名,預設遵循就近原則,
              如果想通路外部類的成員,可以通過Outer.this.成員通路

            2.不允許有靜态成員的

            3.互訪原則:
                  外部類通路内部類,通過建立對象,使用對象名通路

                  外部其他類通路内部類,通過建立對象,使用對象名通路
        <2>靜态内部類

            1.外部類的成員和内部類的成員同名,預設遵循就 近原則,
              如果想通路外部類的成員,可以通過Outer.成員通路

            2.裡面不能直接通路外部類的非靜态成員

            3.互訪原則:
                外部類通路内部類,通過建立對象,使用對象名通路
                外部其他類通路内部類,通過建立對象,使用對象名通路

(二)局部内部類
    特點:
        1.不可以加通路修飾符

        2.作用範圍比較小,外部類其他方法和外部其他類不能通路

        3.不能通路 外部類的非 final的局部變量
    分類
        局部内部類
            有名稱,可以多次使用

        匿名内部類
            沒有名稱,隻能使用一次

            作為類的子類或 接口的實作類

            應用場景
                1.充當抽象類或接口 類型 的實參時
                2.開啟線程
                3.設定監聽器
           

2、格式如下:

class Outer{//外部類

    class Inner{//内部類

    }
}
class Other{//外部其他類

}
           

3、好處

内部類 可以直接通路外部類中的所有成員(包含私有的!!)

4按定義位置不同分為以下幾類:

成員内部類:
          普通成員内部類(沒有static修飾)
          靜态内部類(有static修飾)

局部内部類:
          局部内部類(有類名)
          匿名内部類(沒類名)
           

5代碼執行個體如下:

(一)、成員内部類的特點

1.可以加 任意通路修飾符

2.外部類的成員和内部類成員重名時,預設遵循就近原則,

如果想通路外部類成員,需要使用 :外部類名.this.成員名 通路

<2>.互訪原則

1》 内部類如何通路外部類的成員?

直接通路

2》外部類如何通路内部類的成員?

通過内部類的對象名通路

文法:Inner inner =new Inner();

通路 inner.成員

3》外部其他類如何通路内部類的成員?

文法: Outer.Inner inner = new Outer().new Inner();
    inner.method();
           

exa:

public class TestInnerDemo1 {
public static void main(String[] args) {
    OuterOther oo = new OuterOther();
    oo.other1();
}
}
           

//外部其他類

class OuterOther{
public void other1(){
    Outer.Inner inner = new Outer().new Inner();
    inner.method();

//System.out.println(inner.height);

}
}
class Outer{

protected String name="john";
int age=10;


public void test1(){

    Inner i =new Inner();

    System.out.println(i.height);
}

public class Inner{

    String name="helloworld";

    double height=100;
    public void method(){

        //如何通路 外部類的成員?
        System.out.println(name);//通路的是  helloworld

        //如何外部類的成員和内部類的成員名稱一樣,如何通路外部類的成員
        System.out.println(Outer.this.name);//通路的是 john

    }
}
} 
           

(二)是靜态内部類的特點

1.可以加通路修飾符
2.隻能通路 外部類的靜态成員

3.外部類和内部類的成員名稱一樣, 預設通路的是内部類成員,遵循就近原則。 
  如果想通路外部類的成員,直接通過 :類名.成員
           

<2>.互訪原則

1 内部類如何通路外部類成員?

隻能直接通路外部類的靜态成員
           

2》外部類如何通路内部類成員?

Inner inner  = new Inner();
System.out.println(inner.height);
           

3》外部其他類如何通路内部類成員?

Outer .Inner inner = new  Outer.Inner();

    System.out.println(inner.height);
           

exa:

public class TestInnerDemo2 {
public static void main(String[] args) {
}
}
//外部其他類
class OuterOther{

public void other1(){

    //建立對象 ,通過對象通路

    Outer .Inner inner = new  Outer.Inner();

    System.out.println(inner.height);
}
}
//外部類
class Outer{

protected String name="john";
static int age=10;


public static  void test1(){
    Inner i = new Inner();
    System.out.println(i.height);
}
//内部類
protected static class Inner{

    int age=100;
    String name="helloworld";

    double height=100;
    public void method(){

        System.out.println(Outer.age);

        test1();
    }
}
           

}

(三)局部内部類

1.局部内部類不可以加修飾符

2.局部内部類可以直接通路外部類的成員,如果通路外部類的局部  

  變量,此局部變量必須是final修飾的
           

3.互訪原則

1》内部類如何通路外部類

直接通路

2》

外部類如何通路内部類隻能在定義此内部類的方法内通路,而且遵循前向引用

不能内置 其他外部類的地方通路
           

3》外部其他類如何通路内部類

無法通路

exa:

public class TestInnerDemo3 {

}

//外部類

class Outer{

String name=”john”;

public void method2(){
}
public void method(){

    final int count=10;//局部變量

    //局部内部類
     class Inner{

         public void test1(){
             System.out.println(count);
         }
    }
     Inner i = new Inner();
}
           

}

二、枚舉

(1)如何自定義枚舉類 √

實作步驟:

1、構造方法私有化 √

2、本類建立好固定的幾個對象 √

修飾符 :public static final

class Season{

    private String name;//季節名
    private String desc;//季節描述


    //構造方法私有化
    private Season(String name,String desc){
        this.name=name;
        this.desc=desc;

    }

    public static final Season SPRING=new Season("春天","春暖花開的季節");
    public static final Season SUMMER=new Season("夏天","生如夏花");
    public static final Season AUTUMN=new Season("秋天","花兒都謝了");
    public static final Season WINTER=new Season("冬天","花兒都凍壞了!!");
    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }


    @Override
    public String toString() {
        return name+"\t"+desc;
    }
}
           

(2)如何使用enum定義枚舉類 ★

enum Season2{
    SPRING("春天","春暖花開的季節"),
    SUMMER("夏天","生如夏花"),
    AUTUMN("秋天","花兒都謝了"),
    WINTER("冬天","花兒都凍壞了!!");
    private Season2(String name,String desc){
        this.name=name;
        this.desc=desc;
    }

    private String name;
    private String desc;
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }

    public void show(){
        System.out.println("這是一個季節");
    }
    @Override
    public String toString() {
        return name+"\t"+desc;
    }

}
           

(3)枚舉類的主要方法

//方法一:valueOf ,傳回指定對象名  對應對象

    Season3 s = Season3.valueOf("SPRING");

    System.out.println(s);

    //方法二: toString ,傳回該枚舉對象的字元串形式

    Season3  s1 =Season3.SPRING;
    System.out.println(s1);


    //方法三:ordinal ,傳回枚舉對象在類中定義的索引

    int ordinal = Season3.WINTER.ordinal();
    System.out.println(ordinal);


    //方法四:values ,傳回該枚舉類中所有的對象

    Season3[] values = Season3.values();
    for (int i = 0; i < values.length; i++) {
        System.out.println(values[i]);
    }
           

(4)實作接口的枚舉類 √

enum A implements 接口{

}