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中有自己编译器
这个注解的使用由程序员来使用,用在任意需要标记为“已过时”的元素上面,可能是方法,可能是类,
“已过时”的东西,不建议程序继续使用的,如果使用可能有问题