天天看点

内部类 枚举(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 接口{

}