Java编程思想 复用类总结

组合语法
每一个非基本类型的对象都有一个toString()方法 而且当编译器需要一个String而你却只有一个对象时 该方法便会被调用
"source = " + source
将调用toString() 把source转换成为一个String

对象引用会被初始化为null 而且如果你试图为它们调用任何方法 都会得到一个异常——运行时错误 在不抛出异常的情况下仍旧可以打印一个null引用
编译器并不是简单地为每一个引用都创建默认对象 如果想初始化这些引用 可以在代码中的下列位置进行:

  1. 在定义对象的地方 这意味着它们总是能够在构造器被调用之前被初始化
  2. 在类的构造器中
  3. 就在正要使用这些对象之前 这种方式称为惰性初始化 在生成对象不值得及不必每次都生成对象的情况下 这种方式可以减少额外的负担
  4. 使用实例初始化
    在这里插入图片描述
    在这里插入图片描述

继承语法
extends 会自动得到基类中所有的域和方法
super 将调用基类版本的方法

初始化基类
Java会自动在导出类的构造器中插入对基类构造器的调用
在这里插入图片描述
带参数的构造器
如果没有默认的基类构造器 或者想调用一个带参数的基类构造器 就必须用关键字super显式地编写调用基类构造器的语句 并且配以适当的参数列表
在这里插入图片描述
如果不在BoardGame()中调用基类构造器 编译器将 抱怨 无法找到符合Game()形式的构造器 而且 调用基类构造器必须是你在导出类构造器中要做的第一件事(如果你做错了 编译器会提醒你)

代理
在这里插入图片描述
在这里插入图片描述
使用代理时可以拥有更多的控制力 因为我们可以选择只提供在成员对象中的方法的某个子集

结合使用组合和继承

在这里插入图片描述
在这里插入图片描述
确保正确清理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关键字try表示 下面的块(用一组大括号括起来的范围)是所谓的保护区(guarded region) 这以为着它需要被特殊处理 其中一项特殊处理就是无论try块是怎样退出的 保护区后的finally子句中的代码总是要被执行的
在清理方法(dispose())中 还必须注意对基类清理方法和成员对象清理方法的调用顺序 以防某个子对象依赖于另一个子对象情形的发生
首先 执行类的所有特定的清理动作 其顺序同生成顺序相反(通常这就要求基类元素仍旧存活) 然后 就如我们所示范的那样 调用基类的清理方法

名称屏蔽
如果Java的基类拥有某个已被多次重载的方法名称 那么在导出类中重新定义该方法名称并不会屏蔽其在基类中的任何版本
在这里插入图片描述

@Override注解可以防止你在不想重载时而意外地进行了重载

在组合与继承之间选择
组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形
在继承的时候 使用某个现有类 并开发一个它的特殊版本 通常 这意味着你在使用一个通用类 并为了某种特殊需要而将其特殊化
is-a(是一个)的关系是用继承来表达的 而has-a(有一个)的关系则是用组合来表达的

protected关键字
关键字protected指明 就类用户而言 这是private的 但对于任何继承于此类的导出类或其他任何位于同一个包内的类来说 它却是可以访问的(protected也提供了包内访问权限)
尽管可以创建protected域 但是最好的方式还是将域保持为private

向上转型
在这里插入图片描述
这种将Wind引用转换为Instrument引用的动作 我们称之为向上转型

到底是该用组合还是用继承 一个最清晰的判断办法就是问一问自己是否需要从新类向基类进行向上转型 如果必须向上转型 则继承是必要的 但如果不需要 则应当好好考虑自己是否需要继承

final关键字

final数据

  1. 一个永不改变的编译时常量
  2. 一个在运行时被初始化的值 而你不希望它被改变
    对于编译期常量 编译器可以将该常量值带入任何可能用到它的计算式中 可以在编译时执行计算式 减轻了一些运行时的负担 在Java中 这类常量必须是基本数据类型 并且以关键字final表示 在对这个常量进行定义的时候 必须对其进行赋值
    一个既是static又是final的域只占据一段不能改变的存储空间
    对于基本类型 final使数值恒定不变 而对于对象引用 final使引用恒定不变 一旦引用被初始化指向一个对象 就无法再把它改为指向另一个对象 然而 对象其自身却是可以被修改的 Java并未提供使任何对象恒定不变的途径(但可以自己编写类以取得使对象恒定不变的效果) 这一限制同样适用数组 它也是对象

空白final
空白final是指被声明为final但又未给定初值的域
在这里插入图片描述
必须在域的定义处或者每个构造器中用表达式对final进行赋值

final参数
Java允许在参数列表中以声明的方式将参数指明为final 这意味着你无法在方法中更改参数引用所指向的对象
在这里插入图片描述
在这里插入图片描述
方法f()和g()展示了当基本类型的参数被指明为final时所出现的结果:你可以读参数 但却无法修改参数 这一特性主要用来向匿名内部类传递数据

final方法
使用final方法的原因有两个 第一个原因是把方法锁定 以防任何继承类修改它的含义 这是出于设计的考虑:想要确保的继承中使方法行为保持不变 并且不会被覆盖
过去建议使用final方法的第二个原因是效率 已经不再需要使用final方法来进行优化了

final和private关键字
类中所有的private方法都隐式地指定为是final的 由于无法取用private方法 所以也就无法覆盖它 可以对private方法添加final修饰词 但这并不能给该方法增加任何额外的意义
在这里插入图片描述
在这里插入图片描述

final类
当将某个类的整体定义为final时(通过将关键字final置于它的定义之前) 就表明了你不打算继承该类 而且也不允许别人这样做 换句话说 出于某种考虑 你对该类的设计永不需要做任何变动 或者出于安全的考虑 你不希望它有子类
在这里插入图片描述
在这里插入图片描述
请注意 final类的域可以根据个人的意愿选择为是或不是final 不论类是否被定义为final 相同的规则都适用于定义为final的域 然而 由于final类禁止继承 所以final类中所有的方法都隐式指定为是final的 因为无法覆盖它们 在final类中可以给方法添加final修饰词 但这不会增添任何意义

有关final的忠告
在设计类时 将方法指明是final的 应该说是明智的 你可能会觉得 没人会想要覆盖你的方法 有时这是对的

初始化及类的加载
类的代码在初次使用时才加载 这通常是指加载发生于创建类的第一个对象之时 但是当访问static域或static方法时 也会发生加载
初次使用之处也是static初始化发生之处 所有的static对象和static代码段都会在加载时依程序中的顺序(即 定义类时的书写顺序)而依次初始化 当然 定义为static的东西只会被初始化一次

继承与初始化
在这里插入图片描述

总结
继承和组合都能从现有类型生成新类型 组合一般是将现有类型作为新类型底层实现的一部分来加以复用 而继承复用的是接口
一般应优先选择使用组合(或者可能是代理) 只在确实必要时才使用继承 此外 通过对成员类型使用继承技术的添加技巧 可以在运行时改变那些成员对象的类型和行为 因此 可以在运行时改变组合而成的对象的行为

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值