Ⅰ概述
在Java中,可以将一个类的定义到另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。
Ⅱ分类
内部类可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类。
Ⅲ定义
class outClass{
//...//外部类成员变量
class innerClass1{
//成员内部类成员
}
public void method(){
class innerClass2{
//局部内部类成员
}
}
static class innerClass3{
//静态内部类成员
}
}
Ⅳ成员内部类
创建
成员内部类依赖于外部类的实例,它的创建方式:外部类实例.new 内部类()
outClass out=new outClass();
outClass.innerClass1 inner1=out.new innerClass1();
注意点
①成员内部类可以访问外部类所有的变量和方法,包括静态和非静态,私有和公有。
②成员内部类不能定义静态成员。
③成员内部类的创建依赖于外部类实例。
Ⅴ静态内部类
创建
静态内部类不依赖于外部类,它的创建方式:new 内部类()
outClass.innerClass3 inner3=new innerClass3();
注意点
①静态内部类只可以访问外部类的静态变量和方法。
②静态内部类不能与外部类同名。
③静态内部类的创建不依赖于外部类实例。
Ⅵ局部内部类
创建
局部内部类定义在方法内,它的创建方式:new 内部类()
public static void testStaticFunctionClass(){
class Inner {
}
Inner inner = new Inner();
}
注意点
①局部内部类只可以访问方法中final修饰的局部变量。
②局部内部类不能被public\protected\private\static修饰。
Ⅶ匿名内部类
定义
public class Outer {
private void test(final int i) {//final修饰
new Service() {
public void method() {
System.out.println("匿名内部类"+i);//参数只能是final修饰的
}
}.method();
}
}
//匿名内部类必须继承或实现一个已有的接口
interface Service{
void method();
}
创建
匿名内部类必须继承或实现一个已有的接口 ,它的创建方式:
new 类/接口{
//匿名内部类实现部分
}
注意点
①匿名内部类必须继承一个抽象类或者实现一个接口。
②匿名内部类不能有构造函数。
③匿名内部类不能定义任何静态成员。
④匿名内部类只能创建一个实例。
⑤匿名内部类不能被public\protected\private\static修饰。
⑥匿名内部类只可以访问方法中final修饰的局部变量。
Ⅷ内部类的优点
①一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据!
②内部类不为同一包的其他类所见,具有很好的封装性;
③内部类有效实现了“多重继承”,优化 java 单继承的缺陷。
Ⅸ内部类应用场景
①一些多算法场合
②解决一些非面向对象的语句块。
③适当使用内部类,使得代码更加灵活和富有扩展性。
④当某个类除了它的外部类,不再被其他的类使用时。