Thinking in Java 系列:接口和内部类

接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。

接口

1.什么是抽象类?
包含抽象方法的类叫做抽象类,如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。
abstract void f();
如果从一个抽象类继承,并想创建该新类的对象,那么必须为基类中的所有抽象方法提供方法定义。如果不这样做(可以选择不做),那么导出类也是抽象的,且编译器将会强制我们用abstract关键字限定这个类。
2.什么是接口?
Interface关键字使抽象的概念更向前迈进了一步。abstract关键字允许人们在类中创建一个或多个没有任何定义的方法–提供了接口部分,但没有提供任何相应但具体实现,这些实现是由此类的继承者创建的。Interface关键字产生一个完全抽象的类,它根本就没有提供任何具体实现。
Interface不仅仅是一个极度抽象的类,它允许人们通过创建一个能够被向上转型为多种基类的类型,来实现某种类似多重继承变种的特性。
3.接口的一些特性
接口可以包含域,但是这些域隐式是static和final的。
可以在接口中显式地将方法声明为public的,但即使你不这么做,他们也是public的。
4.接口的完全解耦
如果一个方法操作的是类,那么你就只能使用这个类及其子类,而无法操作不在此继承结构中的其他类。
但如果一个方法操作的是接口,可以在很大程度上放松这种限制,只需要被操作的类实现这个接口即可。
5.策略设计模式
创建一个能够根据所传递的参数对象的不同而具有不同行为的方法,被称为策略设计模式。这类方法包含所要执行的算法中的固定不变的部分,而“策略“包含变化的部分。策略就是传递进去的参数对象,它包含要执行的代码。
6.java中的多重继承
导出类可以implements多个接口,可以继承任意多个接口,并可以向上转型为每个接口,因为每一个接口都是一个独立类型。

内部类

可以将一个类的定义放在另一个类的定义内部,这就是内部类。
内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。
1.内部类链接到外部类
内部类自动拥有对其外围类所有成员的访问权。当某个外围类的对象创建一个内部类的对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用。然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。
非static内部类对象只能在与其外围类的对象相关联的情况下才能被创建。构建内部类对象时,需要一个指向其外围类对象的引用,如果编译器访问不到这个引用就会报错。
2.使用.this与.new
如果你需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟.this。这样产生的引用自动地具有正确的类型。
要想直接创建内部类的对象,必须使用外部类的对象后接.new表达式。
在拥有外部类对象之前是不可能创建内部类对象的,这是因为内部类对象会暗暗地链接到创建它的外部类对象上。但是,如果你创建的是嵌套类(static内部类),那么它就不需要对外部类对象的引用。

匿名内部类

匿名内部类即在返回一个接口引用时,临时创建一个接口实现,并返回该实现类的引用。
如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final类型的。
这就是在lambda表达式中,所使用的外部对象不能做修改,必须为final类型。因为lambda表达式其本质是创建一个匿名内部类。

嵌套类(static内部类)

如果不需要内部类对象与其外围类对象之前有联系,那么可以将内部类声明为static。这通常称为嵌套类。
要创建嵌套类的对象,并不需要其外围类的对象。
不能从嵌套类的对象中访问非静态的外围类对象。

内部类的优势

内部类是面向对象的闭包,因为它不仅包含外围类对象的信息,还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员。
Iterator迭代器其实就是利用了内部类来实现的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值