Java面向对象:内部类
内部类
内部类是指在一个类的内部定义的类,名称不需要和文件名相同。(顶级的外部类不但要求类名和文件名相同,而且只能使用public和default。)
内部类是一个编译时的概念,一旦编译成功会有和外部类完全不同的两个类。(编译成功会出现两个class文件,外部类.class和外部类&内部类.class)
内部类和外部类没有继承关系。
内部类分类
非静态成员内部类
非静态内部类不能调用静态的属性和方法,非静态内部类不能包含静态的属性和方法。
内部类调用外部类的属性和方法
不重名:直接使用
重名:外部类.this.属性/方法
外部类调内部类的属性和方法
创建内部类对象:外部类.内部类 对象名 = new 外部类().new 内部类();
别的类来调用内部类的属性和方法
创建内部类对象:外部类.内部类 对象名 = new 外部类().new 内部类();
就近访问原则
静态成员内部类
最外部类不能为静态。
内部类调用外部类的属性和方法
只能调用static修饰的属性和方法
外部类调用内部类的属性和方法
创建内部类对象,在内部类下面,无需再创建外部类实例:外部类.内部类 对象名 = new 外部类.内部类();
别的类调用内部类的属性和方法
创建内部类对象:外部类.内部类 对象名 = new 外部类.内部类();
局部内部类
不可以加访问修饰符,不可以加静态修饰符,作用域仅限于局部内部类所在的方法,不能在方法以外使用。
局部内部类调用外部的属性和方法
直接使用
局部内部类所在的方法调用局部内部类的属性和方法
创建局部内部类的对象
局部内部类调用内部类所在的方法的局部变量
需要给所在方法的局部变量加final修饰
局部变量是随着方法的调用而调用,随着调用完毕而消失。而堆内存中的内容并不会立即消失,所以加final修饰,变量变成常量,即使变量随着方法调用完毕消失,变量的数据还存储在内存中,局部内部类可以继续使用。
jdk1.8版本可以不加final,访问局部变量相当默认final,如果给局部变量改变了值或引用,那就无法默认为final了,此时会报错。
匿名内部类
没有名字的内部类,在定义类时同时创建仅能使用一次的实例。
前提
必须继承一个类或者实现接口。(类可以是具体类也可以是抽象类。)
格式
new 类或者接口(){重写方法;}
调用
一个方法:new 类或者接口(){重写方法}.方法名;
多个方法:类 对象 = new 类或者接口(){重写方法};
对象.方法;
对象.方法2;
本质
是一个继承了类或者实现了接口的子类匿名对象。
注意
匿名内部类中不能有静态的成员。
随着类实例的创建,该类定义会立即消失,匿名内部类不能重复使用。(只使用一次。)