初识内部类

1、成员内部类

内部类:在一个类的内部定义一个内部类。

特点:

1、 内部类可以使用 private 修饰,表示私有。 只能在外部类当中去使用。

2、 内部类不会单独生成一个 java 文件

内部类编译后生成一个 class 文件:例如 FirstOuterClass$FirstInnerClass.class

命名规则:外部类名+ $ +内部类名称.class

为什么叫成员内部类: 内部类定义的位置处于外部类成员的位置,所以叫成员内部类。

1.1、构建内部类对象

两种方法:

1、 在外部类的非静态方法中去 new 一个内部类对象。

2、 通过外部类对象去构造一个内部类对象。

语法:外部类对象.new 内部类名();

内部类的好处:

1、隐藏内部类的细节。

2、内部类没有单独的 java 文件,省去维护大量的 java 文件。

2、局部内部类

2.1、特点:局部内部类和成员内部类区别是所处的位置不同。 局部内部类相当于一个局部变量,在一个方法中或局部代码块中定义一个类,叫作局部内部类。

1、 局部内部类只能在其作用域之中被实例化。不能使用外部类对象去实例化一个局部内部类对象。

2、 局部内部类不能去使用 public、private ,因为局部内部类不是外部类的成员。

3、 局部内部类可以访问外部类对象的成员,拥有外部类对象的引用。

4、 局部内部类只允许使用它之外的 final 常量。

2.2、final 常量的问题

 Local variable a defined in an enclosing scope must be final or effectively final 在封闭范围内(局部内部类)如果要使用它之外的局部变量,只能 final 常量。

注意:在局部内部类中可以去定义一个局部变量!!!!如果要使用它之外的局部变量,此时编译器按 final 处理。

为什么有这个限制?

局部变量和局部内部类生命周期不同,由于它们的生命周期不同所以编译器统一要求,如果局部内部类使用了它之外的局部变量, 此时编译器按 final 处理。

如果出现这种情况,在 jdk7 中强制要求局部变量定义为 final。jdk8 自动将局部变量按 final 处理。

 3、匿名内部类

匿名内部类是一种特殊的局部内部类,它没有名字,所以叫匿名内部类。

定义匿名内部类格式:  

new 父类或接口(){

//写类的成员

//重写父类或接口中的方法..

};

匿名内部类特点:

1、 匿名内部类没有名字

2、 匿名内部类是一个特殊的局部内部类,不能使用 public、private 等权限修饰。

3、 匿名内部类由于没有名字,不能定义构造方法。 使用构造代码块实现构造方法的功能。

4、 无法通过外部类对象进行实例化,可以访问外部类对象的引用。

5、 匿名内部类要么继承一个父类,要么实现一个接口,两者不能兼备!!

6、 匿名内部类可以访问外部类对象的成员

7、 匿名内部类只允许使用它之外的 final 常量。

 

 4、静态内部类

成员内部类使用 static 修饰,它就是静态内部类:

1、 静态内部类不能访问外部类的非静态成员。只能访问静态成员。

2、 静态内部类不依赖外部类对象而存在,无法拥有外部类对象的引用,构造一个静态内部类无需 使用外部类对象的。

3、 静态内部类可以有静态成员,成员内部类不能有静态成员。

创建一个静态内部类对象语法:new 外部类名.静态内部类名();

Guess you like

Origin blog.csdn.net/qq_33371766/article/details/118873360