1.内部类相关
匿名内部类特征:
- 没有类名
- 没有构造函数
- 只能使用一次
- 必须继承一个父类或者实现一个接口
为什么匿名内部类中访问方法形参要设置成final## 标题
原因:因为内部类和外部类会编译成不同的class文件,访问形参时,内部类对属性的修改,并不会影响到外部的形参,所以为了保证数据一致性,需要定义成final类型,防止内部类修改
内部类分类:
- 内部类对象不仅指向该内部类,还指向实例化该内部类的外部类对象 的内存。
- 内部类和普通类一样可以重写Object类的方法,如toString方法;并 且有构造函数,执行顺序依旧是先初始化属性,再执行构造函数
- 在编译完之后,会出现(外部类.class)和(外部类$内部类.class) 两个类文件名。
- 内部类可以被修饰为private,只能被外部类所访问。事实上一般也都 是如此书写。
- 内部类可以被写在外部类的任意位置,如成员位置,方法内
成员内部类
该内部类相当于位于外部类的成员的位置。该内部类可以
访问外部类的所有成员和方法,即使是private
public class Outer {
public class Inner {
public void print(String str) {
System.out.println(str);
}
}
}
创建内部类对象方式
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
静态内部类
该类被修饰为static。同时作为静态内部类,他不能访问外部类非静态 的成员或方法。
public class Outer {
public static void outer(){
}
public void outer1(){
}
static class Inner {
public void inner() {
outer();
outer1();//会报错,不能直接访问
}
}
}
创建内部类对象方式:
Inner inner=new Outer.Inner();
方法内部类
- 可以访问外部类中的成员
- 不能被static private 修饰,因为他不再是成员位置,只有成员才能被
修饰为static… - 因此内部类不能有静态成员
- 内部类要访问外部方法中的局部变量时,该局部变量需要被修饰成
nal。
public class Outer {
private int a=0;
public static void outer(){
}
public void outer1(){
final int a=0;
class Inner{
public void inner(){
outer1();
outer();
System.out.println(a);
}
}
}
}
内部类的访问
- 静态时,静态内部类只能访问外部类静态成员;非静态内部类都可以直 接访问。(原因是:内部类有一个外部类名.this的指引)当访问外部 类静态成员出现重名时,通过(外部类名.静态成员变量名)访问。如,
Out.show(); - 重名情况下,非静态时,内部类访问自己内部类通过this.变量名。访
问外部类通过(外部类名.this.变量名)访问 。如 Out.this.show(); - 在没有重名的情况下,无论静态非静态,内部类直接通过变量名访问
Out outer = new Out();
Out.In inner = outer.new In(); //第一个Out是为了说 明该内部类到底属于哪个外部类
外部成员变量。
外部类的访问
- 内部类为非静态时,外部类访问内部类,必须建立内部类对象。建立 对象方法,如前所述。
- 内部类为静态时, 外部类访问非静态成员,通过(外部类对象名.内 部类名.方法名)访问,如new Out().In.function();
- 内部类为静态时,外部类访问静态成员时,直接通过(外部类名.内部 类名.方法名) ,如 Out.In.funchtion();