内部类:把类定义在其他类的内部,这个类就被称为内部类。
内部类访问特点:
内部类可以直接访问外部类的成员,包括私有。
外部类要访问内部类的成员,必须创建对象。
内部类的位置:
成员位置:成员内部类
成员内部类是非静态的访问方式:
外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
eg:Outer.Inner oi = new Outer().new Inner();
常见修饰符:
1.一般内部类是不让外界直接访问的,所以用private,保证了数据的安全性。
2.static为了让数据访问更方便。内部类用静态修饰是因为内部类可以看作是外部类的成员。(所以static可以修饰内部类,不能修饰类)
被静态修饰的成员内部类只能访问外部类的静态成员(静态只能访问静态)
成员内部类被静态修饰后,是不能被对象访问的,只能被类访问。它下面的方法可以是静态可以是非静态。
成员内部类是静态的访问方式:
外部类名.内部类名 对象名=new 外部类名.内部类名();
eg:Outer.Inner oi = new Outer.Inner();
oi.静态方法(); oi.非静态方法();
静态内部类的静态方法还可以用:Outer.Inner.静态方法名();
局部位置:局部内部类
可以直接访问外部类的成员
在局部位置可以创建内部类对象,通过对象调用内部类方法来使用局部内部类的功能
局部内部类访问局部变量的注意事项:
局部内部类访问的局部变量必须用final修饰。(因为局部变量是随着方法的调用而调用,随着调用完毕而消失,而堆内存的内容不会立即消失(如果不是final修饰的话,就会矛盾报错),所以加final修饰,使变为常量,即使消失了,也有数据在使用)
匿名内部类:就是内部类的简化写法。
前提:存在一个类或者接口。(这里的类可以是具体类也可以是抽象类)
格式: new 类名或者接口名(){
重写方法;
}
本质:就是具体类的子类或者抽象类的具体实现类或者接口的实现类的匿名****对象****。
因为本质是一个对象,所以后面可以跟调用方法。
new 类名或者接口名(){
重写方法;
}.方法名();
当有多个方法要重写时,只能调一次方法,因为这是个匿名对象。所以改进:在前面赋值给父接口或者父类、父抽象类,这就是多态。(实际上就是在{}中补了很多代码,其他格式不变),最后再通过多态的对象调用方法。
匿名内部类在开发中的使用:在android中常见,在ee中不常见。因为匿名内部类用完就会被回收不占内存。匿名内部类只能用一次。
类名调用方法,该方法就必须是静态类方法,否则应该是对象调用方法。
注意:内部类和外部类没有继承关系。
可以通过外部类名来限定this对象:new Outer().num 等价于 Outer.this.num(Outer.this其实是一个对象)