前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >内部类与枚举

内部类与枚举

作者头像
木瓜煲鸡脚
发布2019-07-22 16:03:09
6470
发布2019-07-22 16:03:09
举报
文章被收录于专栏:Jasper小笔记Jasper小笔记

内部类

  1. 内部类是定义在类中的类
  2. 使用内部类的好处
    • 增强封装,把内部类隐藏在外部类当中,不允许其他类访问这个类
    • 增加了代码的可维护性
    • 内部类可以直接访问外部类当中的成员
  3. 内部类可以分四种
    • 实例内部类:直接定义在类当中的一个类
    • 静态内部类:在内部类前面加上static
    • 局部内部类:定义在方法中的内部类
    • 匿名内部类:属于局部内部类的一种特殊情况
  4. 实例内部类
    • 与其他实例成员一样属于对象而不是类,通过外部类对象来调用
    • 在实例内部类中不能有静态成员
    • 通过外部类对象来使用像调用其他成员一样
    • 可以访问外部类成员
代码语言:javascript
复制
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();//用外部类对象来调用来创建对象
  }
}
  1. 静态内部类
    • 由于是静态所以是属于类不需要外部对象来引用
代码语言:javascript
复制
class OutClass{
  static class InClass{
  }
}

OutClass.InClass in = new OutClass.InClass();//由于是静态所以不需要外部类对象来引,直接用类调用即可
代码语言:javascript
复制
class OutClass{
  int a = 1
  static int b = 2;
  static class InClass{
    int x = new OutClass().a;//外部类普通的变量需要创建对象引用,就像外面的类去引用一样
    int y = b;//对于外部类的静态变量就可以直接使用
  }
}
  1. 局部内部类
    • 由于已经在方法中所以它不必要也不能使用访问修饰
    • 只能在方法范围内使用
    • 不能有静态变量
  2. 匿名内部类
    • 没有名字的局部内部类因为没有名字所以它也没有构造方法需要用父类的构造器或者实现的接口来创建对象(创建时写的哪个类的构造器,或者哪个接口那么它的父类就是它),相当于是一次性使用的
代码语言:javascript
复制
new 父类的构造器 或 接口() {
  内部写的代码(在new时候就会自动执行)
}
代码语言:javascript
复制
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枚举是一个特殊的类,多个常量的集合。
代码语言:javascript
复制
[修饰符] enum 定义的名称{
  常量1,常量2,常量3,······
}
代码语言:javascript
复制
enum Season{
  SPRING,SUMMER,AUTUMN,WINTER
}
代码语言:javascript
复制
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
    });
  }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT那个小笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档