JavaSE:内部类

1、引言

本篇文章与前后文章没有太大的联系,仅仅作为知识点的补充~

2、内部类

2.1 内部类的概念

在Java中,我们可以将一个类定义在另一个类或者一个方法的外部,前者我们成为内部类,后者我们称为外部类。内部类是一种封装的体现。

【注】:内部类也会生成一个单独的字节码文件

2.2 内部类的分类

我们把内部类可以分为一下四种:

1.实例内部类(非静态内部类 )

2.静态内部类

3.匿名内部类

4.局部内部类

2.2.1 实例内部类

在类的内部定义了一个非静态的类,这个类就叫做实例内部类,内部类中可以定义成员变量和成员方法。

2.2.1.1 实例内部类对象的实例化

那么内部类对象该如何实例化呢?

实例化内部类对象,我们需要通过外部类对象的引用来实例化,也就是说我们需要先实例化出一个外部类对象:

(以下两种方式都是可以的)

1.

2.

2.2.1.2 内部类与外部类成员名称相同时

我们可以看到,在内部类当中,我们可以直接访问外部类的任何成员。

但是,当内部类中出现了和外部类成员变量同名的变量时,可想而知,那一定是先访问内部类自己的(就近原则),可如何访问外部类的那个变量呢?

我们就需要在方法中(非静态方法)通过 外部类类名.this.变量名 来访问了:

这样,我们就可以访问到外部类中那个同名的成员变量了,所以,实例内部类的非静态方法中包含了一个指向外部类对象的引用。

2.2.1.3 实例内部类知识点小结

1. 外部类中的任何成员都可以在实例内部类方法中直接访问

2. 实例内部类所处的位置与外部类成员位置相同(可以当做是外部类的一个普通成员),因此也受public、private等访问限定符的约束

3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问

4. 实例内部类对象必须在先有外部类对象前提下才能创建

5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用

6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。

2.2.2 静态内部类

在一个类中定义了一个使用static修饰的类,那么这个被static修饰的类就叫做静态内部类:

 2.2.2.1 静态内部类中成员的访问

基于上图: 我们可以发现,在静态内部类中,我们无法访问外部类的非静态成员

如果非要访问,那我们只能通过new外部类对象,通过引用来访问外部类成员:

 2.2.2.2 静态内部类对象的实例化

静态内部类是属于外部类的,而不是属于外部类某一对象的,我们不需要再去通过外部类对象的引用来实例化,所以实例化内部类对象不需要再去new外部类对象:

2.2.3 匿名内部类

 匿名内部类的本质就是隐藏了名字的内部类。

有时候,我们需要使用额外的一个类,但是只使用这一次,我们就可以将这个类定义为匿名内部类。

语法:

其实,匿名内部类的内容,只有花括号之中的内容,例如:

而 new 代表实例出了一个这个类的对象

类名或者接口名 代表这个匿名内部类继承了这个类,或者实现了这个接口。

所以,花括号中的内容就是 重写的其父类或者实现的接口里面的方法。

代码演示:

这个匿名内部类是A的子类,在{}中可对继承的方法进行重写,可在{}外通过点号 . 来访问。

也可以通过接口(这个类 实现了 IA 接口 并且同时重写了test2这个方法):

2.2.4 局部内部类

定义在方法体内部的类称为局部内部类,局部内部类只能在方法体内使用,用处很少

如图:

注意:

1. 局部内部类只能在所定义的方法体内部使用

2. 不能被public、static等修饰符修饰

3. 编译器也有自己独立的字节码文件

4. 几乎不会使用

OK~本次博客到这里就结束了,

感谢大家的阅读~欢迎大家在评论区交流问题~

如果博客出现错误可以提在评论区~

创作不易,请大家多多支持~

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值