匿名内部类 可以访问外部类_Java内部类详解

a9a34b739de66371a3d0542f718f63cb.png

内部类的定义

将一个类定义在另一个类里面或者方法里面,这样的类就被称为内部类。
内部类可以分为四种:成员内部类、局部内部类、匿名内部类、静态内部类,下面我们逐一介绍这四种内部类。


成员内部类

他定义在另一个类中。一般定义格式如下

0eee2a3e6c20fe7da7294c90e4c9421a.png

因为类C相对于类D在外面,我们且称类C为外部类。成员内部类可以无条件访问外部类的属性和方法,但是外部类想要访问内部类属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法

成员内部类无条件访问外部类的属性和方法

6b0898eb68f5cdcca791cbeeccbe16f0.png

外部类访问内部类属性和方法

846d520f274a3fe9cb3c99dbf23f1f55.png

外部类属性或方法隐藏

如果成员内部类的属性或者方法与外部类的同名,将导致外部类的这些属性与方法在内部类被隐藏,也可按照该格式调用,外部类.this.属性/方法。

d327f1d19be7ed518651fe3cf9740593.png

创建内部类对象

显然成员内部类是寄生于外部类,创建内部类对象就必须先创造外部类对象。之后创建内部类有两种方式。

98e050f8d9be9dc6e2cc81eed467f20d.png

成员内部类的访问权限

成员内部类前可加上四种访问修饰符。private:仅外部类可访问。protected:同包下或继承类可访问。default:同包下可访问。public:所有类可访问。


局部内部类

局部内部类存在于方法中。
他和成员内部类的区别在于局部内部类的访问权限仅限于方法或作用域内。

14d12f4c4f4eaa30bfe3ffdd86b7bf3c.png

注意事项

  • 局部内部类就像局部变量一样,定义在方法内部,作用范围也在方法内;

  • 和局部成员使用规则一样,局部内部类不能使用任何访问修饰符,不能使用static修饰;

补充:在java8中,可以不使用final,如果局部变量被内部类访问,那么该局部变量相当于自动使用了final修饰。


匿名内部类

下面我们先通过一段代码初步了解一下匿名内部类。

8bdbb8a5438905ea929b3e374af121d8.png

分析以上代码知道静态方法driveCar需要一个Car对象,我们通过实现接口创建一个匿名类对象传递过去。事实上还可以通过继承类来创建一个匿名内部类对象。注意事项:匿名内部类没有构造方法。也是唯一没有构造方法的内部类。

匿名内部类和局部内部类只能访问外部类的final变量。

静态内部类

静态内部类和成员内部类相比多了一个static修饰符。它与类的静态成员变量一般,是不依赖于外部类的。同时静态内部类也有它的特殊性。因为外部类加载时只会加载静态域,所以静态内部类不能使用外部类的非静态变量与方法。同时可以知道成员内部类里面是不能含静态属性或方法的。

f82ab867232cf520be9d32cfe967b018.png

内部类的好处

  1. 完善了Java多继承机制,由于每一个内部类都可以独立的继承接口或类,所以无论外部类是否继承或实现了某个类或接口,对于内部类没有影响。

  2. 方便写事件驱动程序。

总结

97a158615ea1b14bc50a1e5efa1b09b3.png

静态内部类对象的创建一般是外部类.内部类 类名 = new 外部类.内部类();成员内部类对象的创建一般是外部类.内部类 类名 = 外部类对象名.new 内部类();


版权声明:本文为weixin_33573857原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。