Java编程思想--07复用类

复用类的两种方式:①直接在类中创建另一个类的对象(组合)。②按照现有类来创建新的类(继承
)。

7.1 组合语法

编译器并不是每一次都为每一个引用创建对象,这样能够减少不少负担。初始化引用的位置如下:

  1. 在定义的地方
  2. 在构造器中
  3. 在使用的时候(惰性初始化),这样可以减少不必要的负担。
  4. 使用实例初始化(暂时分不清)

7.2 继承语法

  1. 继承使用extends关键字
  2. 每个类都可以创建main方法。但是被运行的那个文件的main方法才会被调用。main函数方便于单元测试。可以在一个类的main方法中显式地调用另一个类的main方法。
  3. 基类中包访问权限的变量和方法,只能被相同包的类访问,无法被其他包的类访问到。
  4. 在基类中可以覆盖基类方法,并通过super来调用基类的方法。

7.2.1 初始化基类

无参构造器的初始化顺序:系统会自动调用基类构造器,然后调用当前类的构造器。
有参构造器:需要显式调用。

7.3 代理–介于继承与组合之间

在代理类中组合对象,并定义新的函数调用组合类的方法。

7.4 继承与组合的结合使用

7.4.1 确保正确的清理

在必须要有的清理中,需要注意顺序(尤其有继承的时候)。

7.4.2 名称的屏蔽与@override

如果基类中有某个被多次重载的方法名称,那么在导出类重新定义并不会屏蔽基类中的任何版本。
@override可以提示不想冲在时发生了以外的重载。

7.5 继承与组合的选择

组合与继承都允许在新类中放置子对象,组合是显式的方式,继承是隐式的方式。

组合:在新类中想用现有类的功能而不是其接口。如汽车与其相关部件的组合。
继承:使用某个现有的类,开发其特殊版本来满足特殊化的需要。

7.6 protected关键字

在实际项目中,经常会将某些事物对外部隐藏,但仍需要对其导出类成员访问他们。(富翁希望把财产留给后代,而不是社会)

7.7 向上转型

继承的关系可以表述为“新类型是现有类的一种类型”。这不仅是一种华丽的概括,而且有语言具体的支撑。
由于继承类可以确保基类的方法在导出类同样有效,因此发送给基类的消息,继承类一样能接收到。

7.7.2 再讨论组合与继承

慎用继承:如果向上转型是必要的,则继承是必要的,否则应当考虑是否要继承。

7.8 final关键字

final关键字表示“这是不可改变的”可以分三种情况:数据、方法、类

7.8.1 final 数据

应用场景

  1. 一个永不改变的编译常量。
  2. 一个在运行时被初始化的量,并且在之后不希望被改变。

注意点:

  1. 一个既是static又是final的变量只占据一段不饿能改变的内存空间。
  2. 当对象引用使用final修饰时,final使引用的值恒定不变。

7.8.1 final 方法

应用场景

  1. 设计方面:锁定方法,防止任何继承类修改它的含义,并且不会被覆盖。
  2. 效率方面:方法声明为final就是同意编译器将针对该方法的调用转为内嵌调用。当调用该方法时,会根据自己的判断,跳过插入程序而执行调用机制(将参数入栈,跳出方法代码处执行,然后回来清理栈中参数,处理返回值),并且以方法体中的实际代码副本来代替方法的调用。这将消除方法调用的开销。但是当方法很大,所带来的提升会因为花费方法内的时间量而被缩减。

注:在目前版本中,这一情况会被JVM探测处理,不需要final来优化了

final与private
类中所有方法都是隐式指定为final的。增加final并不会附加任何额外的意义。

7.8.3 final类

当某个类被声明为final时,就表明该类不打算被继承,并且也不允许别人这么做。

7.9 初始化及类的加载–包含static的情况

当创建对象或者调用static方法时就会发生初始化,并且定义为static的东西只会被初始化一次。

初始化顺序:按照基类的继承顺序进行依次加载。接下来根基类中的static初始化,然后是下一个导出类依次类推。这种方式很重要,因为导出类的static初始化很可能依赖于基类成员能否被正确初始化。

至此为止,必要的类的初始化加载完毕,对象可以被创建了。首先对象中的基本类型会被设置为默认值,对象引用被设置为null,然后基类构造器被调用(或者super调用)。

7.10 总结

组合与集成都能从现有的类中生成新的类。组合一般是将现有的类型作为新类型的一部分,而继承复用的是接口。
在继承时,由于导出类有基类的接口,因此可以向上转型,这对于多态至关重要。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重新使用接口 1.5.1 改善基础: 尽管extends关键字暗示着我们要为接口“扩展”新功能,但实情并非肯定如此。为区分我们的新,第二个办法是改变基础一个现有函数的行为。我们将其称作“改善”那个函数。 为改善一个函数,只需为衍生的函数建立一个新定义即可。我们的目标是:“尽管使用的函数接口未变,但它的新版本具有不同的表现”。 1.5.2 等价和似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 永久性 1.11 Java和因特网: 既然Java不过另一种型的程序设计语言,大家可能会奇怪它为什么值得如此重视,为什么还有这么多的人认为它是计算机程序设计的一个里程碑呢?如果您来自一个传统的程序设计背景,那么答案在刚开始的时候并不是很明显。Java除了可解决传统的程序设计问题以外,还能解决World Wide Web(万维网)上的编程问题。 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失: 在整个开发过程中,最重要的事情就是:不要将自己迷失!但事实上这种事情很容易发生。大多数方法都设计用来解决最大范围内的问题。当然,也存在一些特别困难的项目,需要作者付出更为艰辛的努力,或者付出更大的代价。但是,大多数项目都是比较“常规”的,所以一般都能作出成功的分析与设计,而且只需用到推荐的一小部分方法。但无论多么有限,某些形式的处理总是有益的,这可使整个项目的开发更加容易,总比直接了当开始编码好! 也就是说,假如你正在考察一种特殊的方法,其中包含了大量细节,并推荐了许多步骤和文档,那么仍然很难正确判断自己该在何时停止。时刻提醒自己注意以下几个问题: (1) 对象是什么?(怎样将自己的项目分割成一系列单独的组件?) (2) 它们的接口是什么?(需要将什么消息发给每一个对象?) 在确定了对象和它们的接口后,便可着手编写一个程序。出于对多方面原因的考虑,可能还需要比这更多的说明及文档,但要求掌握的资料绝对不能比这还少。 整个过程可划分为四个阶段,阶段0刚刚开始采用某些形式的结构。 1.12.2 阶段0:拟出一个计划: 1.12.3 阶段1:要制作什么?: 1.12.4 阶段2:如何构建? 1.12.5 阶段3:正式创建 1.12.6 阶段4:校订 1.12.7 计划的回报 1.13 Java还是C++? 第2章 一切都是对象 “尽管以C++为基础,但Java是一种更纯粹的面向对象程序设计语言”。 无论C++还是Java都属于杂合语言。但在Java中,设计者觉得这种杂合并不象在C++里那么重要。杂合语言允许采用多种编程风格;之所以说C++是一种杂合语言,是因为它支持与C语言的向后兼容能力。由于C++是C的一个超集,所以包含的许多特性都是后者不具备的,这些特性使C++在某些地方显得过于复杂。 Java语言首先便假定了我们只希望进行面向对象的程序设计。也就是说,正式用它设计之前,必须先将自己的思想转入一个面向对象的世界(除非早已习惯了这个世界的思维方式)。只有做好这个准备工作,与其他OOP语言相比,才能体会到Java的易学易用。在本章,我们将探讨Java程序的基本组件,并体会为什么说Java乃至Java程序内的一切都是对象。 2.1 用句柄操纵对象 2.2 必须创建所有对象: 创建句柄时,我们希望它同一个新对象连接。通常用new关键字达到这一目的。new的意思是:“把我变成这些对象的一种新型”。所以在上面的例子中,可以说: String s = new String("asdf"); 它不仅指出“将我变成一个新字串”,也通过提供一个初始字串,指出了“如何生成这个新字串”。 当然,字串(String)并非唯一的型。Java配套提供了数量众多的现成型。对我们来讲,最重要的就是记住能自行创建型。事实上,这应是Java程序设计的一项基本操作,是继续本书后余部分学习的基础。 2.2.1 保存在什么地方 2.2.2 特殊情况:主型 2.2.3 Java中的数组 2.3 绝对不要清除对象:在大多数程序设计语言中,变量的“存在时间”(Lifetime)一直是程序员需要着重考虑的问题。变量应持续多长的时间?如果想清除它,那么何时进行?在变量存在时间上纠缠不清会造成大量的程序错误。在下面的小节里,将阐示Java如何帮助我们完成所有清除工作,从而极大了简化了这个问题。 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据型: 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序:正式构建自己的第一个Java程序前,还有几个问题需要注意。 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他 2.8.5 文档标记 2.8.6 变量文档标记:变量文档只能包括嵌入的HTML以及@see引用。 2.8.7 方法文档标记 2.8.8 文档示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值