Java笔记整理:内部类

内部类:将一个类的定义放在另一个类的定义内部
把一些逻辑相关的类组织在一起,并控制内部类的可视性
内部类与组合是完全不同的概念


创建内部类

从外部类的非静态方法之外的任意位置创建某个内部类的对象,必须具体指明对象的类型:OuterClassName.InnerClassName


链接到外部类

内部类对象能访问其外围对象的所有成员,不需要任何条件
当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用,用这个引用来访问外围类的成员


.this和 .new

如果内部类需要得到对应外部类对象的引用,使用外部类名 + .this
手动创建内部类对象时,由于需要外部类对象为前提,所以在new表达式中要提供外部类对象的引用
必须使用外部类对象来创建内部类对象
在拥有外部类对象之前是不可能创建内部类对象的
如果内部类是嵌套类(静态内部类),则不需要外部类对象的前提


内部类和向上转型

当内部类是实现了某个接口,然后将一个对象向上转型为接口类型,就可以很好地隐藏内部类的细节
private内部类甚至不能访问其名字,通过这种方式可以完全阻止任何依赖于类型的编码,并且完全隐藏了实现的细节


方法和作用域内的内部类

可以在一个方法里面或者在任意的作用域内定义内部类
理由:

  1. 快速实现某个接口并返回其引用
  2. 需要一个辅助的类,但又不希望它是公共可用的

在方法作用域内定义的类称作局部内部类
局部内部类的定义不会造成命名冲突
局部内部类在编译时已经被编译了,因此其定义与作用域无关,而是在该作用域外不可用


匿名内部类

使用匿名内部类可以快速返回一个基类或接口的实现
return new 基类/接口名(参数列表) {实现}

如果定义一个匿名内部类,需要使用一个在定义外部的对象,那么这个对象的引用必须是final的
匿名内部类没有名字,因此没有构造器,如果需要进行一些初始化,可以使用实例初始化
匿名内部类可以继承类,也可以实现接口,但是只能选一个,而且只能实现一个接口


嵌套类

静态的内部类即嵌套类
创建嵌套类的对象,不需要外围类的对象
不能用嵌套类的对象访问非静态的外围类对象
普通内部类不能有静态数据和静态字段,而嵌套类可以有

接口内部

接口内部可以放置嵌套类(由于放置在接口中的类都自动是public和static的)
可以在内部类中实现其外围接口
在一个接口中预置多种实现,可以使用嵌套类进行实现

内部类可以访问所有它嵌入的外围类的所有成员

为什么需要内部类

由于内部类可以访问外围类的成员,所以内部类提供某种访问外围类的窗口
每个内部类都可以独立得继承一个接口的实现,对外围类来说相当于某种意义上的多重继承
内部类的其他特性:

  1. 内部类可以有多个实例,内部类的状态都是相互独立的
  2. 在一个外围类内可以让多个内部类以不同形式实现一个接口
  3. 内部类是一个独立的实体

闭包和回调

闭包是一个可调用的对象,它记录了一些信息,这些信息来自创建它的作用域
内部类是面向对象的闭包
JAVA通过闭包提供了回调机制,可以在运行时动态地决定调用什么方法


内部类的继承

由于内部类的实例化需要外围类的对象,所以内部类的导出类,其构造器必须要有那个外围类对象的引用,然后再构造器中调用super(),才能编译通过


内部类的覆盖

基类和导出类中的两个同名内部类是相互独立的,各自在自己的命名空间中

局部内部类不能有访问说明符,因为它不是外围类的成员


内部类标识符

内部类的类文件名为:外围类名字 + $ + 内部类名字
如果内部类是匿名的,会产生一个数字作为标识符

如果一个内部类是嵌套在别的内部类中,直接将其名字放在外围类标识符和$后面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,内部类可以直接访问外部类的成员(包括方法和字段),即使它们是私有的。你可以通过以下几种方式在内部类中调用外部类的方法: 1. 在内部类的方法中使用外部类的实例:如果内部类是非静态的,你可以通过创建外部类的实例来调用外部类的方法。例如: ```java public class OuterClass { private void outerMethod() { System.out.println("Outer method"); } public class InnerClass { public void innerMethod() { outerMethod(); // 调用外部类的方法 } } } ``` 在上面的例子中,内部类InnerClass可以直接调用外部类OuterClass的方法outerMethod()。 2. 在静态内部类中使用外部类的方法:如果内部类是静态的,它不能直接访问外部类的实例方法,但可以通过创建外部类的实例或使用外部类的类名来调用外部类的静态方法。例如: ```java public class OuterClass { private static void outerStaticMethod() { System.out.println("Outer static method"); } public static class InnerClass { public void innerMethod() { OuterClass.outerStaticMethod(); // 通过外部类的类名调用外部类的静态方法 } } } ``` 在上面的例子中,内部类InnerClass可以通过OuterClass.outerStaticMethod()来调用外部类OuterClass的静态方法。 请注意,如果内部类是私有的,它只能在外部类的内部访问。如果你需要在外部类外部访问内部类的方法,你可以提供一个公共的方法在外部类中调用内部类的方法。 希望这个回答能够解决你的问题。如果还有其他疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值