选用教材:《Java核心技术卷一》
第六章 接口、Lambda表达式与内部类
和Lambda表达式一样,我个人认为书里面列举的例子不是很好懂,所以建议参考这个视频来学习内部类:
https://www.bilibili.com/video/BV18J411W7cE?p=189
一、内部类的基本定义
通俗一点来说,就是在一个类的内部被定义的类。
二、内部类的几种常见形式
1、成员内部类:也就是在外部类方法之外被定义的类;
2、局部内部类:即在外部类方法中被定义的类;
3、静态内部类:被声明为静态的内部类;
4、匿名内部类:没有名字的内部类,它是一种特殊的局部内部类。
三、内部类的语法规则
1、成员内部类
当成员内部类声明为public类型时,通过以下规则来创建一个内部类对象:
Outer.Inner oi=new Outer().new Inner();
注:Outer为外部类名、Inner为内部类名,下文同理。
当成员内部类声明为private类型时,就不能通过上面的方法来创建对象了。
这时要在外部类的一个方法中创建内部类对象,并调用内部类中的方法;然后再在主类创建一个外部类对象,并调用外部类方法。
例:
第一步:在外部类的一个方法中创建内部类对象
public void show(){
Inner in=new Inner();
in.accept();
}
第二步:在主类创建一个外部类对象,并调用外部类方法
public static void main(String...aggs){
Outer ou=new Outer();
ou.show();
}
2、局部内部类
和上面的情况稍微有一点区别,这里的第一部是在内部类中创建内部类对象并调用方法;再在主类中创建外部类对象,并调用外部类方法。
如果没有进行第一步,就直接走到第二步。
那么程序不会报错,但是它只能识别到内部类的代码块,并不能执行内部类里面的方法。
3、静态内部类
一道例题:学校School是外部类,饮水机WaterFountain是静态内部类,饮水机里有水量这个成员变量。
要求:新建一个School对象,并访问饮水机的水量,方法可以自由定义。
代码如下:
package innerClass; class School//外部类学校 { static class WaterFountain//内部类饮水机 { int n = 11;//内部类局部变量 public void f() { System.out.println("水量:"+n);//输出内部类局部变量 } } public void show() { WaterFountain wf = new WaterFountain();//实例化一个内部类对象 wf.f();//调用f方法 } }
package innerClass; public class SchoolTest { public static void main(String[] args) { School school = new School(); school.show(); //顶级类中访问静态类中的成员方法,需要创建静态内部类对象进行访问 School.WaterFountain sw = new School.WaterFountain(); sw.f(); } }
4、匿名内部类
它的本质是一个实现了某个接口或者继承了某个类的对象。
所以当要使用一个类来实现接口的时候,可以考虑使用匿名内部类。
建议直接参考本文顶部推荐的视频中,有关于匿名内部类的示例,通俗易懂。
原文:https://www.cnblogs.com/yizhinailu/p/12616493.html