1. 程式人生 > >內部類 列舉(enum)基本屬性和使用詳解

內部類 列舉(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 介面{

}