内部类:
成员内部类:可以访问外部类的所有成员(包括被static和private修饰的成员)
外部类要访问内部的成员,要创建内部类对象。
非静态的内部类中不能创建静态的成员
创建成员内部类对象的格式:
外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
思维拓展:如果想访问父类中被private修饰的成员,除了让父类自己调用外,
还可以在父类中的创建成员内部类通过这个内部类来访问。
静态内部类:被static修饰的成员内部类,就被称为静态内部类。
静态内部类只能访问外部类的静态成员。
而静态内部类的所有成员都可以被所在的外部类访问。
创建静态内部类对象的格式:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
记忆法:创建对象,就是调用构造函数的过程。由于成员内部类不是静态的所以不能用外部类名
直接调用,而静态内部类可以用外部类名直接调用。
局部内部类(方法内部类):
方法中定义的类。
注意:
局部内部类访问局部变量,该变量必须被final修饰。
(面试题:
因为局部变量在栈内存中随着方法的调用结束而消失,而局部内部类存在于堆内存中
如果该内部类中还有地方使用着局部变量,那么该变量就必须还存在,所以必须用final修饰)
如果父类或者父接口出现的地方,完全可以用子类对象替代。
匿名内部类的使用:(没有名字的局部内部类)
前提:
必须存在一个类,抽象类或者接口。
格式:
new 类名或者接口名()
{
重写类或者接口中的方法。
也可以自己定义新的方法。
};
理解:是一个继承了类或者实现了接口的匿名的子类对象。
什么时候使用匿名内部类呢?
一般来说,当接口或者抽象类中的方法在3个以下的时候,考虑使用匿名内部类。
在看到有一个方法接收的形式参数是一个抽象类或者接口的时候,
就可以考虑采用匿名内部类实现。 |