Java 内部类详解|成员内部类、静态内部类、局部内部类、匿名内部类

一、内部类概念

a) 核心概念

内部类:在一个类的内部,定义了一个完整的类。

代码结构演示:


//外部类 class Outer{ //内部类 class Inner(){ } }

b) 编译文件特点

内部类编译之后会生成独立的.class文件,命名规则:

外部类的类名$内部类的类名.class

c) 访问特点

内部类可以直接访问外部类的成员;通常将内部类作为外部类的组件构成。

d) 内部类四大分类

成员内部类、静态内部类、局部内部类、匿名内部类


二、成员内部类(类比:实例变量)

a) 定义位置

定义在类以内、方法以外

b) 对象创建方式

成员内部类对象依赖于外部类对象创建,不能单独创建。


//1.先创建外部类对象 Outer o = new Outer(); //2.通过外部类对象创建成员内部类对象 Outer.Inner i = o.new Inner();

c) 访问权限

成员内部类可以直接访问外部类的属性和方法(私有的方法和属性也可以访问)。

d) 外部类精准调用语法

外部类类名.this:代表当前外部类的对象

  • 外部类类名.this.属性:访问外部类的属性

  • 外部类类名.this.成员方法(实参):访问外部类的成员方法

e) 语法限制

成员内部类不能定义静态成员(静态属性、静态的方法、静态代码块)。


三、静态内部类(类比:静态变量)【了解】

a) 定义位置

定义在类以内,方法以外,同时被 static 修饰。

b) 对象创建方式

静态内部类的对象,只需要依赖于外部类的类名即可,无需创建外部类对象。


Outer.Inner i = new Outer.Inner();

c) 静态成员访问方式

访问静态内部类的静态成员时,可以直接通过 外部类类名.静态内部类类名 进行访问。

  • 外部类类名.静态内部类类名.静态属性

  • 外部类类名.静态内部类类名.静态方法名(实参);

d) 访问限制

静态内部类只能访问外部类的静态成员(静态属性和静态的方法),无法访问外部类实例成员。


四、局部内部类(类比:局部变量)

a) 定义位置

定义在方法内部

b) 对象创建规则

局部内部类对象的创建,必须在定义它的方法内部创建,并且在类的定义位置后面完成对象的创建。

c) 局部变量访问规则

局部内部类的方法中可以访问定义它的方法内部的局部变量,但是要求局部变量必须被 final 修饰。

重点注意(JDK8新特性语法糖)

JDK8.0及以上版本,编译器编译时,如果监测到局部变量被局部内部类方法访问,则默认为此局部变量添加final 修饰,无需手动书写,这种技术被称为语法糖。


五、匿名内部类(特殊的局部内部类)

匿名内部类是一个特殊的局部内部类,日常开发使用频率最高。

a) 定义前提

匿名内部类的定义必须继承一个类或是实现一个接口

b) 核心特点

基于一个匿名内部类只能创建该类的一个对象,并且匿名内部类的定义和对象的创建同步完成

标准语法(接口场景最常用):


接口名 引用名 = new 接口名(){ //重写接口中所有抽象方法 };

c) 匿名内部类优缺点

优点:

减小代码量,让编程思路连贯,无需单独定义实现类。

缺点:

没有类名,代码可读性较低,不适合复杂逻辑开发。


总结

  1. 内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类,四类特性各不相同;

  2. 成员内部类依赖外部对象、不能定义静态成员;静态内部类依托类名、仅能访问静态资源;

  3. 局部内部类位于方法内,JDK8 自动隐式 final 语法糖;

  4. 匿名内部类简化代码,是开发中最常用的内部类形式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值