内部类Iner class
最大特点:可以直接访问私有属性
分类:
1 局部内部类 (有类名,外部类局部位置)【局部内部类中变量与方法中局部变量(是final的)重名无法区分】(反射?)
定义在方法或代码块中 【可以是抽象类】
作用域:此方法或代码块
局部内部类还是类可以被继承,但是final修饰就不行了
可以访问外部类所有成员,包括私有
不能添加访问修饰符,地位相对于局部变量,所以可以用final(局部变量也可以用final)
内部类访问外部类:直接访问,重名默认就近原则 区分用外部类名称点.this.成员
外部类访问内部类:创建对象,再访问(必须要在作用域中才能访问)【构造器中也能访问】
外部其他类:不能访问局部内部类,因为其地位是一个局部变量
2 匿名内部类 (无类名,外部类局部位置)【重点】【用的地方特别多】 【匿名内部类中变量与方法中变量重名无法区分】
new 类或接口(参数列表){ 【不能是抽象类,因为其逻辑上是要创建对象的,写法也没法是抽象类】
}
本质是类,内部类,同时是一个对象(运行类型)
该类没有名字(其实系统分配了名字,但是与你无瓜) 怎么看:一般命名是 外部类名称$int值 用getClass就能看到
匿名内部类只能使用一次(类加载一次返回对象就无了),注意是类只能使用一次,但是返回的对象可以不断 点
非抽象类也可以使用其匿名内部类(加一个大括号就完全不一样了)
jvm创建一个匿名内部类继承了这个非抽象类,不过是用一次,创建一个对象返回 就销毁
匿名内部类只能使用一次,所以其内部不能有构造器/构造方法
(和父类构造器一样?但其不是父类了,和getClass得到的一样?不行,jvm的我们用不了)
继承/实现+新写类+创建实例+(一次性销毁)
同 局部内部类
定义在方法或代码块中
作用域:此方法或代码块
可以访问外部类所有成员,包括私有
不能添加访问修饰符,地位相对于局部变量,所以可以用final(局部变量也可以用final)
内部类访问外部类:直接访问,重名默认就近原则 区分用外部类名称点.this.成员(就是调用此方法的对象)
外部类访问内部类:不能访问【构造器中也不能访问】
外部其他类:不能访问局部内部类
匿名内部类最佳实践/用途:将匿名内部类当作 实参 传递 (软编码)(改一下,只会影响当前)
(用硬编码:写类实现,改一下就会影响所有)
3 成员内部类 (无static,外部类成员位置)【可以是抽象类】
可以访问外部类所有成员,包括私有
可以添加访问修饰符,因为地位就是成员变量
作用域与其他成员一样
内部类访问外部类:直接访问,重名默认就近原则 区分用外部类名称点.this.成员(就是调用此方法的对象)
外部类访问内部类:创建对象,再访问(必须要在作用域中才能访问)【构造器中也能访问】
外部其他类:
1 new 外部类.内部类() 相对于将内部类看作成员
2 在外部类中,写一个方法,返回内部类对象 相对于getter方法
3 new 外部类().new内部类()
4 静态内部类 (有static,外部类成员位置)【不能是抽象类】
可以访问外部类所有static成员,包括私有,但是不能访问非静态
可以添加访问修饰符,因为地位就是成员变量
作用域与其他成员一样
内部类访问外部类:直接访问,重名默认就近原则 区分用外部类名称点.成员(不要加this了)(就是调用此方法的对象)
外部类访问内部类:创建对象,再访问(必须要在作用域中才能访问)【构造器中也能访问】
外部其他类:
1 new 外部类.内部类() 注意要满足访问权限
2 外部类中,写一个方法,返回内部类对象
枚举
特殊类,有 有限个特定的对象
只读,不修改
实现
自定义类实现枚举
1 构造器私有化
2 setter方法去掉,可以有getter方法
3 在类内部创建固定的对象,用public static,这样直接用类名点就可以拿到(对象名要有标识性,枚举对象名通常全部大写)
4 可以再加上final(底层好像没有作用,类还是要加载的)
enum关键字实现枚举
1 使用enum替代class
2 常量对象名(实参列表),有多个用逗号间隔 ; 如果使用无参构造器创建枚举对象,那么实参列表与小括号都可以省略
3 enum实现枚举,要求常量对象写在最前面
使用关键字,底层是final默认继承Enum类 javap工具证明
是隐式继承,因为Java是单继承,所以使用这个关键字就不能再继承其他类了,
但是是可以实现其他接口的
Enum类
注意:Enum的toString方法已经重写过了 ,返回的就是常量对象名name
getName方法 返回是常量对象名,子类不能重写
ordinal方法 返回当前对象的位置号,默认从0开始
values方法 返回当前枚举类包含所有对象的 一个数组(源码看不到。隐藏了,反编译能看到)
valueOf方法 将字符串转换为枚举对象,要求字符串必须是已有的枚举对象名,否则抛异常
comparaTo 比较2个枚举常量,比较的是位置号,返回2编号相减