day13

三、有名字的局部内部类(很少)(了解)
    1、语法格式
      【修饰符】 class 外部类{
           【修饰符】 返回值类型  方法名(【形参列表】){
                   【修饰符】  class 局部内部类{
                                        }
                           }
                  }
         局部内部类:在方法体、代码块中声明的,和方法的局部变量很多方面是一样
 
    2、局部内部类也是一个类
       (1)有自己的字节码文件
           外部类名$编号局部内部类名
           这里用编号原因,在不同的方法中,局部内部类可能同名
      (2)成员
         A:属性
         B:方法
         C:构造器
         D:代码块
         E:内部类
              不能有静态的成员
              即唯一能声明静态成员的内部类只有一个“静态内部类”,其他内部类统统都不可以有静态成员。
 
    3、使用
     (1)在外部类中使用局部内部类
              只能在声明局部内部类的下面才能使用,即先声明后使用
              并且有作用域的限制。
     (2)在外部类的外面
               肯定不行
       (3)在局部内部类中使用外部类的成员
          局部内部类是否可以使用外部类的非静态的成员,取决于所在方法是否是静态的
       (4)在局部内部类中可以使员工外部类的“局部常量”,即有final修饰
          JDK1.8之前:必须手动加final
          JDK1.8之后,自动加final

四、匿名内部类(重要)
     1、语法格式:
           外部类{
                方法{
                       new 父类(【实参列表】){
                      成员
                      }
                       new 父接口(){
                       成员
                     }
                }           
         }

    2、特点
      (1)没名字
              所以不写构造器
      (2)匿名内部类必须在声明类的同时就要创建对象,也只有唯一的一个对象
      (3)必须指定匿名内部类的父类或父接口
   3、匿名内部类也是类
     (1)有字节码文件
             外部类名$编号.class
    (2)也有成员
             属性、方法、代码块、内部类、构造器都有,不能有静态的,一般不会写这么多。
            一般匿名内部类都是重写父类的方法或实现接口的抽象方法
 
    4、在匿名内部类中要使用外部类的成员的话
       (1)是否可以使用外部类的非静态成员,要看所在的方法是否是静态的
       (2)只能使用外部类的局部常量,必须有final

枚举:也是一个种类型,也是一个类
    1、什么是枚举?
         中文:枚举  的近义词  列举,穷举,罗列
        Java中,枚举,罗列出该类型的所有对象
 
    2、什么情况会用枚举?
         当某个类型它的对象是有限的几个,这个时候就可以使用枚举。
         例如:Week类型,它的对象,我想限定为7个
         Season类型,它的对象,限定为4个
         付款方式Payment,它的对象,限定为:微信付款wechat,支付宝alipay,银行卡card,信用卡creditCard,现金cash
         员工的状态:(OA)系统中,定义为:Busy忙,Free闲,Vocation休假,Left离职
    3、如何声明枚举类

       JDK1.5之后:
        1、枚举类的声明格式
           【修饰符】 enum 枚举类名{
               枚举类的常量对象列表 【;
                       其他成员列表
               】
               }
           说明:
             (1)如果枚举常量对象列表后面要写其他成员,那么需要在常量对象列表后面加;分隔,如果没有其他成员,那么;可写可不写
             (2)构造器一定是私有化的
             (3)枚举类型的默认父类不是Object,而是java.lang.Enum类,当然Enum也是Object的子类
                      枚举类型不能再继承别的类型

          java.lang.Enum类:
            (1)构造器
                protected Enum(String name,int ordinal)
                name是为Enum类中的name属性赋值,自动赋值为常量对象的名称
                ordinal是Enum类中的ordinal属性赋值,自动赋值为常量对象的“序号”,这个序号是从0开始
                他们的get方法没有按照普通类的get方法的命名,而是直接用属性名作为get方法的名称:name(),ordinal()
                因为父类Enum只有唯一的一个有参构造,意味着我们自己写的枚举类的构造器和普通类(默认调用父类的无参构造)不一样,
                默认调用的是父类的有参构造。
            (2)Enum实现了java.lang.Comparable接口
                所有的枚举类型都支持比较大小,因为Enum实现了java.lang.Comparable接口,按照常量对象的顺序比较大小。
                父类中把这个int compareTo()加了final,子类不能重写
            (3)两个API中没有的方法
                static 枚举类型[] values():用来返回枚举类型的所有常量对象
                static 枚举类型  valueOf(字符串类型的常量对象名)
 注解(annotation):它又称为注释,它本质上也是注释,只不过它是代码级别的注释,即它用代码注释代码。
                               因为说注释容易让人误解为单行和多行的普通注释,很多人就故意叫做“注解”, 注解是JDK1.5之后引入。

注解长什么样?  @注解
      一个完整的注解,它应该有三部分组成:
      (1)定义,声明
            可能是程序员自己声明的,也可能是别人声明好的
            开发中,绝大多数都是用别人声明好的。
     (2)注解的使用
            你看到在类上面、方法上面、属性上面....用到了@注解,就是在使用注解
     (3)读取注解
             得有代码去读取这个注解,理解代码的用意,信息...
             读取注解需要用代码去读取,这个代码我们称为“注解处理流程”,大多数情况下,这个代码也是别人写好的,
            一般都是谁定义,谁复制编写读取注解的代码。
             注解在后面的框架中使用最多,它的作用是用来替代xml的配置文件,对代码进行解释。
            因为xml的配置方式,一个是复杂,另一个与所解释的代码是独立的,所以有的地方不用xml,用注解
 
 常见的注解:
       一、系统定义的最基本的三个注解(必须都认识,会写,会用)
         1、@Override:
              这个注解的声明是在JDK的核心类库中声明的,
              这个注解的读取是编译器来读取的,编译器:javac.exe,eclipse中有自己编译器
              这个注解的使用由程序员来使用,用在所有的重写的方法的上面,表示让编译器,按照重写的要求对该方法进行格式检查和编译。
 
         2、@SuppressWarings(xx) 
              这个注解的声明是在JDK的核心类库中声明的,
              这个注解的读取是编译器来读取的,编译器:javac.exe,eclipse中有自己编译器
              这个注解的使用由程序员来使用,用在任意需要抑制警告的地方 
             @SuppressWarnings("all")
             @SuppressWarnings({ "rawtypes", "unused" })
        3、@Deprecated
            这个注解的声明是在JDK的核心类库中声明的,
            这个注解的读取是编译器来读取的,编译器:javac.exe,eclipse中有自己编译器
            这个注解的使用由程序员来使用,用在任意需要标记为“已过时”的元素上面,可能是方法,可能是类,
           “已过时”的东西,不建议程序继续使用的,如果使用可能有问题

posted @ 2019-09-24 19:43  zzz222zzz  阅读(345)  评论(0编辑  收藏  举报