[学习笔记][Java编程思想]第9章:接口

  • 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。
  • 抽象类是普通的类与接口之间的一种中庸之道。

1 抽象类和抽象方法

  • 抽象方法,仅有声明而没有方法体,形如abstract void 方法名()
  • 包含抽象方法的类叫做抽象类。如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。
  • 继承抽象类,必须为基类中的所有抽象方法提供方法定义。如果不这样做,那么导出类便也是抽象类。
  • 可以创建一个没有任何抽象方法的抽象类。
  • The danger of calling a method inside a constructor is when that method depends on a derived initialization. Before the derived-class constructor is called, the object may be in an unexpected state.

2 接口

  • interface这个关键字产生一个完全抽象的类,称作接口。
  • 接口只提供了形式,而未提供任何具体实现。
  • 接口被用来建立类与类之间的协议。
  • interface允许人们创建一个能够被向上转型为多种基类的类型。
  • 接口可以包含域,但是这些域隐式地是static和final的。
  • 类实现某个特定接口,需要使用implements关键字。
  • 一旦实现了某个接口,其实现就变成了一个普通的类。
  • 接口中方法一定是public的,即时不声明,也是public的。(但接口可以不是public的)
  • 当实现接口时,在接口中被定义的方法必须被定义为是public的。
  • 在方法被继承的过程中,其可访问权限被降低是Java编译器所不允许的。
  • The elements of an interface are public but the interface itself is not, until we declare it public for use outside its package.

3 完全解耦

  • 只要一个方法操作的是类而非接口,那么你就只能使用这个类及其子类。
  • 策略设计模式,创建一个能够根据所传递的参数对象的不同而具有不同行为的方法,策略就是传递进去的参数对象。
  • split()方法是String类的一部分,它接受String类型的对象,并以传递进来的参数作为边界,将该String对象分隔开,然后返回一个数组String[]。
  • 当耦合过紧时,如果将基类设计成一个接口,那么这些限制就会变得松动。
  • 适配器设计模式,将接受你所拥有的接口,并产生你所需要的接口。
  • 将接口从具体实现中解耦使得接口可以应用于多种不同的具体实现,因此代码也就更具可复用性。

4 Java中的多重继承

  • 一个导出类只能继承一个非接口的类,可以继承任意多个接口。并可以向上转型为每个接口,因为每个接口都是一个独立类型。
  • 将一个具体类和多个接口组合到一起时,这个具体类必须放在前面,后面跟着的才是接口。
  • 可以扩展接口(extends),但是得到的是只是另一个接口。当想要创建对象时,所有的定义首先必须都存在。
  • 使用接口的原因:为了能够向上转型为多个基类型;防止客户端程序员创建该类的对象。

5 通过继承来扩展接口

  • 可以通过继承在新接口中组合数个接口。
  • extends可以引用多个基类接口。

5.1 组合接口时的名字冲突

  • 多重继承中,相同的方法不会有问题,但签名不同会重载,返回类型不同会报错。
  • 在组合不同接口中使用相同的方法名通常会造成代码可读性的混乱,请尽量避免这种情况。

6 适配接口

  • 允许同一个接口具有多个不同的具体实现。

7 接口中的域

  • 放入接口中的任何域都自动是static和final的。

7.1 初始化接口中的域

  • 在接口中定义的域不能是“空final”,但是可以是被非常量表达式初始化。
  • 这些域不是接口的一部分,它们的值被存储在该接口的静态存储区域。

8 嵌套接口

  • 接口可以嵌套在类或其他接口中。
  • 嵌套接口也可以实现为private。
  • private接口可以强制该接口中的方法定义不要添加任何类型信息(也就是说,不允许向上转型)。
  • 返回private接口的的引用的方法,需要将返回值交给有权使用它的对象。
  • 接口彼此之间也可以嵌套,但作用于接口的各种规则,在此都会被严格执行。
  • 当实现某个接口时,并不需要实现嵌套在其内部的任何接口。
  • private接口不能在定义它的类之外被实现。

9 接口与工厂

  • 工厂方法设计模式,与直接调用构造器不同,在工厂对象上调用的是创建方法,而该工厂对象将生成接口的某个实现的对象。代码将完全与接口的实现分离,使得我们可以透明地将某个实现替换为另一个实现。

10 总结

  • 任何抽象性都应该是应真正的需求而产生的。
  • 恰当的原则应该是优先选择类而不是接口。

疑问和解决

1. 导出类将基类的方法定义为抽象方法,有什么用?

  • 强制继承导出类的类,重写定义为抽象方法的方法。比如定义toString为抽象方法,继承了该抽象类的导出类就必须重写toString,不能使用默认的Object.toString()。

2. 两个方法重载,参数分别是导出类和基类,运行时调用哪个?

  • 优先调用导出类,当找不到导出类时,会自动向上转型,调用基类重载方法。
package test;

class BasePoly { }
class InheritPoly extends BasePoly { }

public class TestPoly
{
    public static void f(BasePoly b)
    {
        System.out.println("BasePloy");
    }

    public static void f(InheritPoly i)
    {
        System.out.println("InheritPoly");
    }

    public static void main(String[] args)
    {
        f(new InheritPoly());
    }
}

你可能感兴趣的:(java,java)