复用类

组合类

组合语法

组合语法的意思: 在新的类中,是由现有的类组合形成的。
继承: 在现有的类的基础上增添内容。

  1. 用定义处初始化
  2. 在构造器中进行初始化
  3. 在方法中,快使用这个成员变量之前进行初始化操作。
  4. 用创建实例对象进行初始化。

    继承语法

    这一内容里面讲述了基本的extends的基本语法, 可是主要字数是去描述, main函数作为类的入口, java 类名的时候会自动运行, 且平时没注意的static 参数对main方法也有效,会变成静态的, 使得即使是包访问限制也是可以进行静态调用的。
    • 初始化基类
      意思是说,继承后,导出类会包含基类, 基类会被包含在导出类的内部。而你如果用组合的方法进行,也就是基类用new的方式进行, 它则是在导出类的外部-》因为创建对象,是在堆中进行创建, 组合的导出类中,只会用基类的引用。
      构建类的过程是从基类向外扩散的,就是说基类先于导出类初始化。所以也就不存在导出类访问基类不存在的问题。
      没有默认的基类构造器(基类的无参构造器),因为子类构造器,jvm会自动调用父类的默认基类构造器,如果没有我们就得显式地用super进行调用

代理

代理具有控制性, 代理是中设计模式。而继承地方式, 当有些方法不适合暴露给用户的时候,继承就不太合适了。

组合使用组合和继承

在生命周期内必须清理资源的要求, 常用finally进行必须的清理, 比如关流的时候, 关闭数据库连接的时候

  • 名称的屏蔽
    是指c++重写的时候会屏蔽父类的方法,这样做的好处是不会在改变实现,而方法签名,和返回值相同的情况下-》重载进行混淆。而Java抛弃这种机制,允许基类的重载,-》 如果重写用override进行覆盖

在组合与继承之间选择

在文中,作者对于组合和继承的选择,源自于,is-a和has-a的判断. 中文去理解就是a是b的一种, has-a则是a是b中众多部分的一部分。 换作数学理解就是, 当a中有B中所需要的很多功能的时候用继承, 反之则用组合。

protected关键字

我们用private进行都细节的封装, 但有些功能需要让子类进行访问就可以用protected, 但相对于子类还是有些方法限制其访问(为了安全), 所以private大多时候还是得相辅相成才行。

向上转型

  • 向上转型, 就是某一方法要求参数父类,但可以接受子类的引用, 且在方法中调用父类方法的时候变成调用子类的方法。
    从中我们该认识到, 子类对象也是一种父类对象
  • 向上转型名字的由来:
    是由于传统类继承图是将根置于顶端, 然后随着继承关系逐渐向下的。所以将子类的转型成父类称为向上转型。

final关键字

  • final常用于:
    不希望运行时候被初始化的值,但又不希望客户端程序员对他进行改变。
    或者一开始就是一个不用改变的常量

+final加在非基本数据类型的引用前面则会让引用无法指向其他对象, 但这不意味着该引用一成不变,毕竟改变不了引用, 但是我们可以改变对象。

  • final在定义的时候不赋值, 但编译器会确保在调用前赋值,不然无法进行编译。这个例子就是:给final修饰的数加随机数, 对象地址不变, 这是一种不变的特性, 但是数值确实改变的。
  • final在参数后面加的时候, 你可以读它,使用它但是不能改变它。
  • final方法, 又两种好处, 防止继承的子类修改这个方法, 第二种是, 效率问题, 编译器会将调用这个方法的所有调用改变为内嵌调用, 这样速度很快。
    private 修饰方法, 那么将不能调用种方法, final修饰方法是为了不能修改, 那么private修饰的方法都不能调用了, 还能修改吗?

初始化及类的加载

  • c语言中的加载顺序是:
    程序作为启动的一部分立即加载,然后初始化,运行
    Java语言中加载是通过类去加载的, 所以只会在第一次创建对象的时候加载
    访问顺序是通过判断是否有extends, 因为有, 所以要先递归加载基类,然后再从最上层的基类开始加载static的成员变量进行初始化,初始化由基类到导出类, 类加载完后,对象可以被创建了, 首先所有默认类型被设为默认值,引用被设为null---通过将内存设为二进制0值而一举生成的。然后是调用构造器, 也是从基类开始调用,然后是最后的导出类。
总结

组合是当作底层实现来用, 而继承则是复用基类的接口。
继承可以向上转型为基类, 这对多态至关重要。

相关推荐