Java内部类知识点汇总

1.Java常见内部类及其特征

静态内部类,成员内部类,方法内部类,匿名内部类

静态内部类:

静态内部类是定义在另一个类内部的用static修饰class的类,静态内部类不需要依赖外部类实例,且无法使用其外部类的非static属性或方法。

成员内部类:

成员内部类是定义在外部类中的类,是最普通的内部类,可以看作是外部类的成员,可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员),但是外部类不能直接访问成员内部类的成员属性和成员方法,需要先创建一个外部类对象,通过该对象来访问内部类的成员属性和成员方法。

在内部类中调用属性或方法时,若外部类拥有和内部类同名的成员属性名或者方法名,则会发生隐藏现象(默认访问的是内部类的成员属性和方法,如果需要访问外部类的成员可以使用OutClass.this.xxx形式);

成员内部类可以用private等修饰符修饰;

方法内部类:

方法内部类是定义在方法中的一个类,与成员内部类的区别在于它的访问范围仅限于方法内,类似于一个方法中的局部变量,所以不能用private,public等修饰符对其进行修饰,也不可以在方法外对其进行实例化使用。

匿名内部类:

匿名内部类是一种没有构造器的类,使用范围非常有限,多用于接口回调;

匿名内部类的class前面不能有private等修饰符和static修饰符;

2.静态类与非静态类之间的区别

(1)非静态内部类默认持有外部类的引用,静态内部类不存在该特性。

(2)非静态内部类中不能定义静态成员或者方法,静态内部类中可以随便定义。

(3)非静态内部类可以直接访问外部类的成员变量或者方法,静态内部类只能直接访问外部类的静态成员或者方法(实质是持有外部类名)。

(4)非静态内部类可以定义在外部类的任何位置(方法里外均可,在方法外面定义的内部类的 class 访问类型可以是 public、protected 等,方法里的只能是默认 class,类似局部变量),静态内部类只能定义在外部类中最外层,class 修饰符可以是 public、protected 等。

(5)非静态内部类创建实例时必须先创建外部类实例,静态内部类不依赖外部类实例。

(6)静态方法中定义的内部类是静态内部类(这时不能在类前面加 static 关键字),静态方法中的静态内部类与普通方法中的内部类使用类似,除了可以直接访问外部类的 static 成员变量或者方法外还可以访问静态方法中的局部变量(java 1.8 以前局部变量前必须加 final 修饰符)。

3.内部类的好处

(1)内部类可以很好的实现隐蔽,一般的非内部类,是不允许有 private 与 protected 等权限的,但内部类(除过方法内部类)可以通过这些修饰符来实现隐藏。

(2)内部类拥有外部类的的访问权限(分静态非静态情况),通过这一特性可以比较好的处理类之间的关联性,将一类事物的流程放在一起内部处理。

(3)通过内部类可以实现多重继承,java 默认是单继承,我们可以通过多个内部类继承实现多个父类,接着由于外部类完全可访问内部类,所以就实现了类似多继承的效果。

(4)通过内部类可以避免修改接口而实现同一个类中两种同名方法的调用(譬如你的类 A 中有一个参数为 int 的 func 方法,现在类 A 需要继承实现一个接口 B,而接口 B 中也有一个参数为 int 的 func 方法,此时如果直接继承实现就会出现同名方法矛盾问题,这时候如果不允许修改 A、B 类的 func 方法名则可以通过内部类来实现 B 接口,因为内部类对外部类来说是完全可访问的)。

猜你喜欢

转载自blog.csdn.net/zai_xia/article/details/81812280