java匿名内部类详解-java 类加载详解
众所周知,外部顶级类的类名需要和类文件名相同,只能使用public和default。 内部类是指在外部类内部定义另一个类,类名不需要和文件名相同。 内部类可以是静态的,也可以修改为public、default(包限制)、protected和private。
内部类:
概念:
我们所说的内部类,官方称之为嵌套类(Nested Classes)。 嵌套类包括静态内部类(Static Nested Classes)和内部类(Inner Classes)。 内部类分为成员内部类、局部内部类(Local Classes)和匿名内部类(Anonymous Classes)。
图片.png
内部类是编译的一个概念。 一旦编译成功,就会变成两个完全不同的类,分别是outer.class和outer$inner.class。 所以内部类的成员变量/方法名可以和外部类的一样。
内部类是做什么的?
1.内部类可以很好的隐藏
一般非内部类不允许有private和protected权限,但是内部类可以
2.内部类可以访问外部类的所有元素(私有修饰也可以访问)
3.但要实现多重继承(让多个内部类继承多个其他类,使外部类可以同时获取多个其他类的属性)
4、可以避免修改接口,实现同一个类中两个同名方法的调用。 (外部类继承java匿名内部类详解,让内部类实现接口)
静态内部类:
形状像:
公共类外部类{
私有字符串名称;
静态类 StaticInerCls{
私有字符串名称;
}
}
静态内部类除了比外部类多了访问修饰符外,与外部类没有区别,只不过静态内部类在代码中组织在外部类中。
创建一个静态内部类:以Class.Iner的形式
OuterClass.StaticInerCls staticInerCls = new OuterClass.StaticInerCls();
非静态内部类:
非静态内部类可以访问外部类的所有成员,包括私有成员。 外部类虽然不能直接访问内部类的成员java匿名内部类详解,但是可以通过内部类的实例访问内部类的私有成员。
成员内部类:
形状像:
公共类 OuterCls {
私有字符串名称;
公共字符串 getName(){
返回名称;
}
类 InerCls{
私有字符串名称;
公共字符串 getName(){
返回名称;
}
}
}
成员内部类可以直接使用外部类的所有成员和方法,即使是private修饰的。 外部类要访问内部类的所有成员变量和方法,需要通过内部类的对象来获取。 (谁说是真儿子?) 需要注意的是,成员内部类不能包含静态变量和方法。 因为成员内部类需要创建外部类才能创建自己的。
创建一个内部类对象方法,形式为object.new Iner:
OuterCls outerCls = new OuterCls();
外部Cls。 InerCls inerCls = outerCls。 新的 InerCls();
成员内部类不能有static修饰的成员,但允许定义常量。
公共类外部类{
私有字符串名称;
静态类 StaticInerCls{
私有字符串名称;
}
类 InerCls{
私有字符串名称;
私有静态 int id; //不允许,会报错
private static final int TYPE = 0; //允许
}
}
局部内部类:
意思是内部类定义在方法体中,只能在方法或条件的范围内使用,退出写入范围后不能再引用。
公共类 OuterCls {
私有字符串名称;
公共字符串 getName(){
返回名称;
}
公共无效 getInerCls(){
类 InerCls{
私有字符串名称;
公共字符串 getName(){
返回名称;
}
}
}
}
作为非静态内部类的一种特殊形式,非静态内部类的所有限制同样适用于局部类。 局部类不仅可以访问外部类的所有成员,还可以访问方法体的局部变量,但必须是final修饰的局部变量。
为什么局部类访问局部变量,变量必须finalize?
场景:
public static void main(String[] args){
外层=新外层();
对象 obj = out. 方法();
}
对象方法(){
本地变量 = 0;
类内{
void println(){
System.out.println("本地变量" + 本地变量);
}
}
对象 in = new Inner();
返回;
}
}
这里的localVariable会变成红色,说明最后的修改需要添加到localVariable变量中。
分析:这是范围的问题。 method方法执行后局部变量值失效,new Inner()生成的in对象仍然有obj的引用,所以对象访问了一个不存在的变量,这是不允许的。 iner仍然存在,当外部和后续调用局部变量时,这个局部变量可能已经失效。 但是为什么加final就可以保证访问呢? 在这里,Java采用了一种复制局部变量的方法。 定义为 final 的变量将被复制并存储在本地内部类中。 后续使用会在生命周期内继续维护这个对象,所以可以继续访问。
注意:final可以修饰的范围包括类、方法和属性。 修饰类,不可继承; 修改后的方法,不能被子类覆盖; modified 变量,其值不能被修改。
匿名内部类:
为了避免必须命名内部类,或者只想使用一次,可以选择使用匿名内部类。
公共无效倒计时(){
新线程(){
@覆盖
公共无效运行(){
}
}。开始();
}