内部类
一个类包含另一个类。被包含的类叫内部类。(身体和心脏的关系)
分类:
1.成员内部类
2.局部内部类(包含匿名内部类)
1.成员内部类
格式:
修饰符 class 外部类名称 {
修饰符 class 类名称{
//...
}
//...
}
class结构:

注意:内用外,随意访问;外用内,需要内部类对象
内部类的使用:
1.间接方式:在外部类方法中,使用内部类;然后外面调用外部类的方法;
2.直接方式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
同名变量的访问:外部类名称.this.外部类成员变量名

2.局部内部类(定义在一个方法内部,只有当前方法才能使用它)
格式:
修饰符 class 外部类名称 {
修饰符 返回值类型 外部类方法名称(参数列表){
class 局部内部类名称{
//...
}
}
//...
}

局部内部类的final问题:如果访问所在方法的局部变量,那么这个局部变量必须是【有效final的】!!!(备注:从Java 8+开始,只要局部变量事实不变,那么final关键字可省略)
原因:
1.new出来的对象在堆内存中;
2.局部变量跟着方法走的,在栈内存中;
3.方法运行结束后,立即出栈,局部变量就会立刻消失;
4.但new出来的对象在堆中持续存在,知道垃圾回收消失。

3.匿名内部类(重要)
格式:
接口名称 对象名 = new 接口名称(){
//覆盖重写所有抽象方法
};

如上图
对 new 接口名称(){...}解析
1.new代表创建对象的动作;
2.接口名称就是匿名内部类需要实现那个接口;
3.{...}这才是匿名内部类的内容。
注意事项
1.匿名内部类,在创建时只能使用唯一一次,如果希望多次创建内容一样的对象,就需要定义实现类了。
2.匿名内部类是省略了【实现类/子类名称】,但是匿名对象省略了【对象名称】,两者不是一回事!!!
网友评论