内部类

  1. 内部类是定义在类中的类

     

  2. 使用内部类的好处

  • 增强封装,把内部类隐藏在外部类当中,不允许其他类访问这个类

  • 增加了代码的可维护性

  • 内部类可以直接访问外部类当中的成员

     

内部类可以分四种

  • 实例内部类:直接定义在类当中的一个类

  • 静态内部类:在内部类前面加上static

  • 局部内部类:定义在方法中的内部类

  • 匿名内部类:属于局部内部类的一种特殊情况

     

实例内部类

  • 与其他实例成员一样属于对象而不是类,通过外部类对象来调用

  • 在实例内部类中不能有静态成员

  • 通过外部类对象来使用像调用其他成员一样

  • 可以访问外部类成员

  • class OutClass{  int a = 1;  class InClass{    int a = 2;    void test(){      int a = 3;      System.out.println(a);//当前方法的,3      System.out.println(this.a);//当前类对象的,2      System.out.println(OutClass.this.a);//OutClass类当前对象的,1  }}class Main{  pubic static void main(String[] args){    OutClass out = new OutClass();    OutClass.InClass in = out.new InClass();//用外部类对象来调用来创建对象  }}

 

静态内部类

  • 由于是静态所以是属于类不需要外部对象来引用

  • class OutClass{  static class InClass{  }}
    OutClass.InClass in = new OutClass.InClass();//由于是静态所以不需要外部类对象来引,直接用类调用即可
  • 由于内部类定义为静态,所以它只能直接访问外部类的静态成员,对于外部类普通变量可以通过创建该类的对象再引用变量

  • class OutClass{  int a = 1  static int b = 2;  static class InClass{    int x = new OutClass().a;//外部类普通的变量需要创建对象引用,就像外面的类去引用一样    int y = b;//对于外部类的静态变量就可以直接使用  }}
  • 静态内部类当中可以定义静态成员,也可以定义非静态成员

局部内部类

  • 由于已经在方法中所以它不必要也不能使用访问修饰

  • 只能在方法范围内使用

  • 不能有静态变量

匿名内部类

  • 没有名字的局部内部类因为没有名字所以它也没有构造方法需要用父类的构造器或者实现的接口来创建对象(创建时写的哪个类的构造器,或者哪个接口那么它的父类就是它),相当于是一次性使用的

  • new 父类的构造器 或 接口() {  内部写的代码(在new时候就会自动执行)}
  • class Animal{  void move(){    System.out.println("移动了");  }}class Dog extends Animal{  void move(){    System.out.println("跑走了");  }}class bird extends Animal{  void move(){    System.out.println("飞走了");  }}class Body{  void sport(Animal animal){    animal.move();  }}
    Animal dog = new Dog();Animal bird = new Bird();Body body = new Body();body.sport(dog);body.sport(bird);//我们可以实实在在的建一个类像dog,bird这样放进去body.sport(new Animal(){//还可以使用匿名内部类,用父类构造器创建对象,一次性的类  System.out.println("飞走了");});

 

枚举

  1. 什么是枚举

  • 表示一个事件固定状态。例如:季节有春夏秋冬四个,性别有男和女,星期有周一到周日

  • java枚举是一个特殊的类,多个常量的集合。

  • [修饰符] enum 定义的名称{  常量1,常量2,常量3,······}
  • enum Season{  SPRING,SUMMER,AUTUMN,WINTER}
  • 通过反编译后,它实际上是继承了Enum的一个常数类。它父类Enum的构造器两个参数一个是表示类名的字符串,一个相当于是位置的角标。通过创建对象的形式创建了四个静态常量在静态代码块中初始化,和一个储存常量的数组

  • final class Season extends Enum //定义一个类继承Enum{
      public static final Season SPRING;  public static final Season SUMMER;  public static final Season AUTUMN;  public static final Season WINTER;  private static final Season ENUM$VALUES[]; //定义了四个静态常量,和一个存储所有常量的数组
      private Season(String s, int i) //私有化了构造器所以外面不能再创建对象,只能用此类已经定义的常量{    super(s, i);  }
      public static Season[] values() //通过values可以获取数据当中的所有的常量  {    Season aseason[];    int i;    Season aseason1[];    System.arraycopy(aseason = ENUM$VALUES, 0, aseason1 = new Season[i = aseason.length], 0, i);    return aseason1;  }
      public static Season valueOf(String s) //把字符串转成枚举类型,然后储存{    return (Season)Enum.valueOf(first/Season, s);  }
      static   {    SPRING = new Season("SPRING", 0); // 初始化常量,最后都放到数组    SUMMER = new Season("SUMMER", 1);    AUTUMN = new Season("AUTUMN", 2);    WINTER = new Season("WINTER", 3);    ENUM$VALUES = (new Season[] {      SPRING, SUMMER, AUTUMN, WINTER    });  }}