《JAVA编程思想》第四版学习 需要我记住的something –接口

一.接口和抽象类提供了一种将接口与实现分开的更加Structured(结构化?)的方法。
      C++只是间接支持;而Java有关键字interface和abstract,提供直接支持。

 

二.抽象类和方法
      抽象类位于普通类和接口之间的一个中间层次,是构建具有某些未实现的类的一种重要而又必须的方法,因为不可能总是用纯接口。

      抽象方法(abstract method) :仅有声明,没有方法体,关键字abstract。如abstract void f();(类似于C++的纯虚函数)。
      抽象基类abstract base class,抽象类abstract class :为继承类创建一个通用接口,表示所有继承类的共同部分,而不同的子类用不同的方式表示该接口,目的是通过这个通用接口操纵一系列类(继承类)。

 

      抽象类可以包含抽象方法,也可以没有抽象方法 。当一个类有一个或多个抽象方法时,它必须为抽象的,否则编译器报错。
      抽象类不能创建对象(编译器会报错);抽象类的继承类,如需创建其对象,必须实现所有抽象方法(提供定义);否则,继承类也是抽象类,编译器强制用abstract关键字。

      抽象类使类的抽象性更明确;抽象类也是一种很有用的重构工具 ,因为它使得我们可以很容易的将公共方法沿着继承层次结构向上移动。

 

三.接口(interface):完全抽象的类,只是确定方法签名和返回类型,不提供任何具体实现,用来建立类之间的协议。
      接口可以用来实现变种的多重继承 (一个类实现多个接口,该类可以upcast为任一个接口)。
      关键字implements。 实现接口与继承类类似。实现的方法也为override?可以加@Override。
      接口方法自动public(只能用public修饰,或者没有限定符),实现时也必须定义为public;可以有field,隐式static final。

 

四.完全解耦(decoupling)
      如果方法操作类而非接口,就只能用该类及其子类,而不能用其它继承自该类的类。接口放宽了这种限制,因此可以编写可复用性更好的代码。
      策略设计模式:方法根据传递对象参数不同而具有不同行为。 方法本身包含算法固定不变的部分,而传递的对象参数-策略(包含要执行的代码)包含变化的部分。如果策略是类,那么方法与该类的强耦合关系,使其不能复用于具有相同接口元素但不是继承自该类的其它类。使用接口可以实现解耦 ,该方法可以应用于实现了该接口的任意类。

 

      复用代码两种方式:
      1. 客户端程序员遵循接口编写类
      2. 当不能修改想要使用的类时,可以使用适配器(Adapter)设计模式。适配器的代码接受所拥有类的接口,产生所需要的接口(方法用到的)(代理)。


五.多重继承
      接口没有任何具体实现,也就没有与之相关的存储空间,因此可以没有限制的进行多个接口的组合。C++的多重继承包袱重,每个基类都有自己的实现。Java的多重继承,只能继承一个类,可以组合任意多个接口(implements后接接口列表)。继承时,类必须在最前面,否则编译报错,即extends T implements I1, I2, I3, ...。

      使用接口两个理由:
      1. 为了能够向上转型为多个基类型,以及获取由此而带来的灵活性;
      2. 与抽象类相同,阻止创建该类的对象,确保仅仅是建立一个接口。

 

      使用接口or使用抽象类?
      如果要创建不带任何方法定义和成员变量的基类,选择接口。(多重继承,自然也要选择接口);
      但不应该总是选择接口而不是具体的类。因为这种额外级别的间接性,带来额外的复杂性。抽象性是应真正的需求而生的,必需时,才应该重构接口。恰当的原则是优先选择类而不是接口 ,从类开始,如果接口的必需性变得非常明确,再进行重构。

      C++中多重继承的钻石问题 :C++中的多重继承,可能形成一种菱形继承体系,在末端的类对象的两个基类中,可能存在对于他们共同基类的方法的不同实现,当用末端类对象调用该方法时,就会无法解析;派生类调用父类的构造函数时也存在冲突(多个父类)?参见另一篇文章《钻石问题》。Java可以避免这种问题 (习题13),因为接口没有任何实现。

 

六.扩展接口
      通过继承,在新接口添加新的方法声明来扩展接口;
      通过继承多个接口,将这些接口组合为一个新的接口。

      继承接口-extends。注意,只有接口可以extends多个接口(extends后接接口列表),其它情况,extends只能用于但一类。

 

七.实现多个接口时的命名冲突问题:接口中的方法完全一样时不会出问题;当方法区别仅为返回值不同时就会冲突。
      在打算组合的不同接口中使用相同的方法名会造成代码可读性的混乱,应尽量避免。

 

八.接口的常见用法-策略设计模式。如Java SE5之后的Scanner类,用到Readable接口。
      对于未实现接口的已有类,可以采用适配器模式 ,该适配类可以通过继承已有类和实现所需接口来创建。正是这种方式,使得可以再任何现有类之上添加新的接口,也就让任何类都可以对以接口为参数的方法进行适配。这正是接口的强大之处。

 

九.接口中的fields:自动public static final。 SE5之前用接口的这个特性来创建类似于枚举的类型,SE5之后不需要。
      接口中的fields不能是空白final,但是可以被非常量表达式初始化,初始化发生在域第一次被访问时。fields并不是接口的一部分,值存储在该接口的静态存储区域内。
对于实现了接口的类,可以把该接口的fields当做自己的static final fields。

 

十.嵌套接口
      接口可以嵌套在其它类和接口内,由此接口可以为private。注意,private接口既可以实现为private内部类,也可以实现为public内部类;但该public类只能作为自己来用,不能向上转型为接口。 即private接口是一种强制该接口中的方法定义不添加任何类型信息(不允许向上转型)的方式。private接口不能在定义它的类之外实现。
      接口之间也可嵌套。但接口中的接口自动为public,不能为private。实现某个接口时,并不需要实现嵌套在其内部的任意接口。


十一. 接口与工厂:工厂方法(factory method)设计模式是生成遵循某个接口的对象的典型方式。
      在工厂对象上调用创建方法,生成接口的某个实现的对象;这种方式,可以使代码与接口实现完全分离,因而可以透明的替换各种实现。采用工厂方法常见的原因就是创建框架。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值