写出创建静态内部类对象的基本语法格式_愉快地学Java语言:第十三章 内部类...

导读

本文适合Java入门,不太适合Java中高级软件工程师。本文以《Java程序设计基础篇》第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述。本篇文章只是这个系列中的一篇,如果你喜欢这种讲解方式,或者觉得从中能学到知识,可以关注我,以便查阅本系列其他文章。

让我们开始愉快地学习Java语言吧!

ca9a0ea09ff03dfd54ebd0867966e55e.png

1什么是内部类

定义在另一个类中的类就是内部类。

为什么要使用内部类?

因为它具有一些独特的性质,所以用起来方便,并且对数据进一步封装,私密性更好,它具体有哪些优点呢,看看下面的阐述吧。

2内部类语法

基本概念

表示外围类的引用:OwterClass.this

使用内部类构造器构造对象:outerObject.new InnerClass(construction parameters)或new InnerClass(construction parameters)。

在外围类之外引用内部类:OuterClass.InnerClass

非静态内部类不能有static方法。

内部类中声明的所有静态域都必须是final,这是为啥呢?

因为每个外部类对象都有一个内部类实例,如果静态域不是final,那么这个静态域就不唯一,而我们希望所有外部类对象都持有一个共同的静态域,即保持静态域的唯一性。

Java API中的用例

让我们看看Java API中的一个例子:ArrayList。

下面是ArrayList定义的一个内部类Itr,这样只能在ArrayList内访问。并且它还提供了构造器,未指明访问性修饰符,那么默认是public

a1c2b699dedfb0b73f32ad4370c03a44.png

让我们再看下Java API中的另一个例子:HashMap。

在HashMap中定义了一个内部类KeySet,并将其声明为final,表明他不能被继承。

在第916和923行,引用了外围类:HashMap.this,其中在916行调用外围类方法HashMap.this.clear()。

65664d58efbb7e0d0b4dcb5b2964217d.png

那么是怎么使用内部类KeySet的呢?

看下面的代码,第908行,实例化一个新的KeySet将其赋给变量ks,使用的是new InnerClass(construction parameters)这种形式。

db78aec2e16c5f6349536b02856f4ed4.png

3局部内部类

定义在方法内的内部类,我们称之为局部内部类。

局部类不能用public或private修饰符进行声明。它的作用域被限定在声明这个局部类的块中。

局部类有一个优势, 即对外部世界可以完全地隐藏起来。

然而似乎将内部类用private修饰也可以保证隐藏起来,这有啥区别呢?

局部类的隐藏性是天生的,且从代码的组织行式上来讲,就将自己与其他类隔离开,明确其归属性。

4匿名内部类

基本概念

创建局部内部类时可以省略类名,这样的类被称为匿名内部类。

语法格式为:

new SuperType ( construction parameters )

{

inner class methods and data

}

匿名类不能有构造器。

Java API中的用例

让我们看下ArrayList这个类中如何使用局部内部类的。

ArrayList里边定义了SubList这个内部类,然后在SubList中定义了匿名内部类ListIterator。listIterator这个方法是SubList内定义的,其返回值就是ListIterator。

总结一下,这个用法,在类ArrayList中定义了内部类SubList,在内部类SubList中定义了匿名内部类,似乎很繁琐。但如果这些内部类仅供ArrayList自己使用,其他类根本不会使用的话,那么这种用法就相当取,体现了面向对象设计原则:封装。

a9c65a8964b3873393aa5f49c9cd41aa.png
c9b6abb9e2501227f02e8d6baca58792.png

5静态内部类

基本概念

使用static修饰符修饰的内部类称之为静态内部类,也有人称静态内部类为嵌套类。

如果声明内部类时不使用任何修饰符,那么默认是public static。

静态内部类可以有静态域和静态方法。

声明在接口中的内部类,默认是public static。

在内部类不需要访问外部类对象的时候,应该使用静态内部类。

Java API中的用例

Java API中使用了大量的静态内部类,尤其是数据结构这一块。

大家还记得吗,static可以修饰内部类,非内部类不能被它修饰。

前面讲到非静态内部类不能有static方法,那么让我们看看静态内部类。还是以HashMap为例,内部类TreeNode有一个静态方法moveRootToFront。

44da35a1c62ee2dc9b91b18a0eb809ab.png

AbstractMap中定义了SimpleEntry类,且有一个静态域serialVersionUID,使用final修饰。

377623d8651994651b00397ce64a0a82.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值