当前位置:网站首页 > 技术博客 > 正文

java内部类有哪些



本文将通过WHATWHYHOW三个方面来展开Java内部类的相关知识。

可以将一个类的定义放在里另一个类的内部,这就是内部类。广义上我们将内部类分为四种:成员内部类、静态内部类、局部(方法)内部类、匿名内部类。

 

使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。——《Think in java》

也就是说内部类拥有类的基本特征。(eg:可以继承父类,实现接口。)在实际问题中我们会遇到一些接口无法解决或难以解决的问题,此时我们可以使用内部类继承某个具体的或抽象的类,间接解决类无法多继承引起的一系列问题。(注:内部类可以嵌套内部类,但是这极大的破坏了代码的结构,这里不推荐使用。)

 

除了上面的优点之外还有如下四点:

1、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。
2、内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。
3、内部类提供了更好的封装,除了该外围类,其他类都不能访问。
4、创建内部类对象的时刻并不依赖于外围类对象的创建。

具体来说,内部类信息(属性、方法)可以和外部类重名;内部类是具有类的基本特征的独立实体;可以利用访问修饰符隐藏内部类的实施细节,提供了更好的封装;静态内部类使用时可直接使用,不需先创造外部类。

简单的总结如下(暂时不太理解也没有关系,我们下面会通过例子依此演示):
Java新生代内部类概述
我们通过一些demo来理解如何使用内部类

(一)成员内部类

1、外部类、内部类
 
2、其他类使用成员内部类
 
3、运行结果(和innerShow()方法对照):

在这里插入图片描述

4、小结:【成员内部类当成Outer的成员信息存在 】
  1. 可以是任何的访问修饰符。
  2. 内部类的内部不能有静态信息。
  3. 内部类也是类,该继承继承,该重写重写,该重载重载,this和super随便用。
  4. 外部类如何访问内部类信息,必须new之后打点访问。
  5. 内部类可以直接使用外部类的任何信息,如果属性或者方法发生冲突,调用外部类.this.属性或者方法。
  6. 其它类如何访问内部类:
 

(二)静态内部类

1、外部类、内部类
 
2、其他类使用成员内部类
 
3、运行结果(注意加载顺序)

在这里插入图片描述

4、小结【和成员内部类对比理解(区别异同)】
  1. 内部可以包含任意的信息。
  2. 静态内部类的方法只能访问外部类的static关联的信息。
  3. 利用 外部类.内部类 引用=new 外部类.内部类(); 然后利用引用.成员信息(属性、方法)调用。
  4. 访问内部类的静态信息,直接外部类.内部类.静态信息就可以了。
  5. 静态内部类可以独立存在,不依赖于其他外围类。

(三)局部内部类

1、外部类、内部类
 
2、运行结果

运行结果三

3、小结【局部内有很多局限,应注意作用域】
  1. 类前不能有访问修饰符。
  2. 仅在此方法内使用。
  3. 无法创造静态信息。
  4. 可以直接访问方法内的局部变量和参数(有限制,下面详谈),但是不能更改。
  5. 可以随意的访问外部类的任何信息。
4、局部内部类访问局部变量的限制

Variable ‘xxx’ is accessed from within inner class, needs to be final or effectively final

它的意思是:变量’xxx’从内部类中访问,需要final或有效的final

具体限制如下:

  1. 直接被final修饰的变量。
  2. 已被赋值且始终未改变的变量(有且仅有赋值一次),引用指向不能改变。JDK8以前(不包括8)只能访问被final修饰的变量。eg:
    示例1
    就会产生如下错误:传入局部内部类所在方法的参数同理,如果一直不变则可使用,反之则会报错。
    在这里插入图片描述

(四)匿名内部类

1、定义接口
 
2、匿名内部类使用
 
3、结果

小狗汪汪汪!

4、小结【匿名内部类常常被用来重写某个或某些方法】
  1. 匿名内部类是没有访问修饰符的。
  2. 使用匿名内部类时,这个new之后的类首先是要存在的,其次我们要重写new后的类的某个或某些方法。
  3. 匿名内部类访问方法参数时也有和局部内部类同样的限制。
  4. 匿名内部类没有构造方法。

版权声明


相关文章:

  • html表单数据如何提交到本页2025-01-14 13:00:59
  • hashcode equals2025-01-14 13:00:59
  • xml转化为json格式2025-01-14 13:00:59
  • dmi linux2025-01-14 13:00:59
  • jvm调优实战简书2025-01-14 13:00:59
  • 单例模式的8种写法2025-01-14 13:00:59
  • vue渲染页面流程2025-01-14 13:00:59
  • modbus crc16校验源码2025-01-14 13:00:59
  • 防抖技术2025-01-14 13:00:59
  • linux fdisk -l命令2025-01-14 13:00:59