內部類 枚舉(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 接口{

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章