资讯专栏INFORMATION COLUMN

Java 内部类(10)

andong777 / 1540人阅读

摘要:可以将一个类的定义放在另一个类的定义内部,这就是内部类。实际上,它标记的是表达式的结束,只不过这个表达式正巧包含了匿名内部类罢了。如果内部类是嵌套在别的内部类之中,只需直接将它们的名字加在其外围类标识符与的后面

可以将一个类的定义放在另一个类的定义内部,这就是内部类。

内部类允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性.

1.创建内部类

创建:把类的定义置于外围类的里面.

更典型的情况是,外部类将有一个方法,该方法返回一个只想内部类的引用.

如果想从外部类的非静态方法之外的位置创建某个内部类的对象,那么必须知名这个对象的类型:OuterClassName.InnerClassName.

2.链接到外部类

当生成一个内部类的对象时,此对象能够访问其外围对象的所有成员,而不需要任何特殊条件.

内部类还拥有其外围类的所有元素的访问权.

内部类的对象只能在与其外围类对象的相关联的情况下才能被创建(在内部类是非static类时).

3.使用.this与.new

如果你需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟圆点和this.

必须使用外部类的对象来创建内部类对象,使用.new语法:外部类对象的引用.new 内部类().

如果创建嵌套类(静态内部类),那么就不需要对外部类对象的引用.

4.内部类与向上转型

将内部类向上转型为其基类/接口,得到的只是只想基类或接口的引用,所以能够很方便地隐藏实现细节.

5.在方法和作用域内的内部类

可以在一个方法里面或者在任意的作用域内定义内部类(理由:1.实现了某类型的接口,可以创建并返回对其的引用;2.要解决一个复杂的问题,想创建一个类来辅助解决方案,又不希望这个类是公共可用的).

局部内部类:在方法的作用域内(而不是在其他类的作用域内)创建一个完整的类。

局部内部类不会出现命名冲突.

在任意的作用域内定义内部类,并不是说该类的创建时有条件的,它其实与别的类一起编译过了.然而,在定义内部类的作用域之外,它是不可用的,除此之外,它与普通的类一样.

6.匿名内部类

方法将返回值的生成与表示这个返回值的类的定义结合在一起,且这个类是匿名的.

如果匿名内部类的基类需要一个有参数的构造器,只需简单地传递合适的参数给基类的构造器即可.

在匿名内部类末尾的分号,并不是用来标记此内部类结束的。实际上,它标记的是表达式的结束,只不过这个表达式正巧包含了匿名内部类罢了。因此,这与别的地方使用分号是一致的.

如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的.

在匿名类中不可能有命名构造器(因为它根本没有名字),但通过实例初始化,就能够达到为匿名内部类创建一个构造器的效果.

实例初始化的实际效果就是构造器,但是不能重载实例初始化方法,所以仅有一个这样的构造器.

匿名内部类既可以扩展类,也可以实现接口,但是不能两者兼备.而且如果是实现接口,也只能实现一个接口.

使用匿名内部类结合工厂方法模式.

7.嵌套类

如果不需要内部类对象于其外围对象之间有联系,那么可以将内部类声明为static,这通常称为嵌套类.

普通的内部类对象隐式地保存了一个引用,指向创建它的外围对象。然而,当内部类是static的时候,就不是这样了.

1.要创建嵌套类的对象,并不需要其外围类的对象;2.不能从嵌套类的对象中访问非静态的外围类对象.

普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类。但是嵌套类可以包含所有这些东西.

在一个普通的(非static)内部类中,通过一个特殊的this引用可以链接到其外围类对象,嵌套类就没有这个特殊的this引用,这使得它类似于一个static方法.

正常情况下,不能再接口内部防止任何代码,但嵌套类可以作为接口的一部分,甚至可以在内部类中实现其外围接口.

一个内部类被嵌套多少层并不重要,它能透明地访问所有它所嵌入的外围类的所有成员.

8.为什么需要内部类

每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响.

内部类允许继承多个非接口类型.

闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.

通过内部类提供的闭包功能完成回调,比指针更灵活,更安全.

应用程序框架(application framework)就是被设计用以解决某类儿童顶问题的一个类或一组类.

内部类允许控制框架的完整实现是由单个的类创建的,从而使得实现的细节被封装了起来.

9.内部类的继承

继承自内部类,当要生成一个构造器时,默认的构造器并不算好,而且不能只是传递一个指向外围类对象的引用。此外,必须在构造器内使用:enclosingClassReference.super(),这样才提供了必要的引用.

10.内部类可以被覆盖吗

当继承了某个外围类的时候,内部类并没有发生什么特别神奇的变化,这个两个内部类是完全独立的两个个体,各自在自己的命名空间内.

可以明确的继承某个内部类.

11.局部内部类

局部内部类可以重载构造器,而匿名内部类只能用于实例初始化.

使用局部内部类的而不适用匿名内部类的另一个理由:需要不知一个该内部类的对象.

12.内部类标识符

每个类都会产生一个.class文件,其中包含了如何创建该类星星的对象的全部信息.内部类也必须生成一个.class文件以包含它们的Class对象信息.

规则:外围类的名字,加上"$",再加上内部类的名字.

如果内部类是匿名的,编译器会简单地产生一个数字作为其标识符。如果内部类是嵌套在别的内部类之中,只需直接将它们的名字加在其外围类标识符与"$"的后面.

END

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71594.html

相关文章

  • (Thinking in Java)第10内部

    摘要:内部类中也可以取得这个外部类对象引用。创建成员内部类对象的时候需要外部类对象。另外在方法中的内部类不能加等权限修饰符,只能加和修饰符。可以在接口内部定义内部类,而且他们即使没有修饰,也会自动变成的。 Thinking in Java捞干货,写笔记 一、成员内部类 1.最基本使用 public class Demo { class Contents{ privat...

    Brenner 评论0 收藏0
  • JAVA学习之路 (六) 面向对象之封装、继承、多态

    摘要:面向对象之封装继承多态封装将类中的信息进行隐藏在类的内部,不允许外部程序信息直接访问,而是只能通过该类的提供的方法来实现对隐藏信息的提供和访问。与之对应,包含内部类的类被称为外部类。 面向对象之封装、继承、多态 封装 将类中的信息进行隐藏在类的内部,不允许外部程序信息直接访问,而是只能通过该类的提供的方法来实现对隐藏信息的提供和访问。 好处 只能隐藏规定的方法和数据 隐藏类的实现细节,...

    wenhai.he 评论0 收藏0
  • Java编程思想》笔记10.内部

    摘要:但远不止如此,内部类了解外部类,并能与之通信。内部类还拥有其外围类的所有元素的访问权。普通内部类内不能有域和方法。特点普通内部类对象隐式的保存了外部类对象,但嵌套类并非如此。局部内部类可以访问当前代码块内的常量,以及此外围类的成员。 点击进入我的博客 可以把一个类的定义放在另一个类的定义内部,这就是内部类。Java最晦涩的部分之一。内部类看起来就像是一种代码隐藏机制,将类只与其他类的...

    wslongchen 评论0 收藏0
  • Java编程基础11——面向对象_包&权限修饰符&匿名内部

    摘要:外部类要访问内部类的成员,必须创建对象。前提存在一个类或者接口这里的类可以是具体类也可以是抽象类。 1.package关键字的概述及作用(了解) A:为什么要有包 将字节码(.class)进行分类存放 包其实就是文件夹 B:包的概述 举例: 学生:增加,删除,修改,查询 老师:增加,删除,修改,查询 ... 方案1:按照功能分 com.heima.add ...

    Bryan 评论0 收藏0
  • Java程序设计笔记

    摘要:对象的自动清除对象回收是由垃圾回收线程负责方法可以要求系统进行垃圾回收,仅仅是建议系统没有析构方法,但的有类似方法系统在回收时会自动调用对象的方法子类的方法可以在里面释放系统资源,一般来说,子类的方法中应该调用父类的方法。 对象的自动清除 对象回收是由垃圾回收线程负责 System.gc()方法可以要求系统进行垃圾回收,仅仅是建议系统 java没有析构方法,但Object的final...

    microcosm1994 评论0 收藏0

发表评论

0条评论

andong777

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<