目录
第1章... 10
抽象和封装... 10
1.电子宠物系统用面向对象设计... 14
1.1.为什么使用面向对象... 14
1.1.22用面向对象设计... 15
1.收养宠物的功能通过创建对象来实现... 17
1.2.创建类对象... 17
1.2.2.结构方法及其重载... 23
1.2.3常见错误... 28
1.3使用封装优化电子宠物系统的类... 30
1.4上机练习... 38
上机练习1. 38
上机练习2. 39
上机练习3. 39
上机练习4. 39
本章总结... 40
本章作业... 41
一、 选择题... 41
二 、简答题... 43
第2章... 45
继 承... 45
本章单词... 46
2.1 继承基础... 47
2.2 重写和继承关系中的构造方法... 53
2.2.1 子类重写父类方法... 53
2.2.2 继承关系中的结构方法... 56
2.2.3 上机练习... 59
上机练习1. 59
指导-创建宠物对象,输出信息... 59
2.3 抽象类和final 60
2.3.1 抽象和抽象方法... 60
2.3.2 上机练习... 64
上机练习2. 64
指导-修改Pet强迫子类实现抽象类print()方法... 64
2.3.3 final修饰符... 64
2.3.4 常见错误... 65
1.final变量所指对象的属性值能否改变修改引用变量... 65
2.abstract是否可以和private、static、final共用... 66
2.4 综合实践:实现汽车租赁系统计价功能... 67
本章总结... 70
本章作业... 71
一、选择题... 71
二、简答题... 73
第3章... 76
多 态... 76
3.1 为什么使用多态?... 78
3.2 什么是多态... 83
3.2.1 子类到父类的转换(向上转型)... 83
3.2.2 以父亲为方法,实现多态... 84
3.2.3 父子转换(向下整形)... 89
3.2.4 instanceof运算符... 91
3.3 上机练习... 93
上机练习1. 93
练习-利用多态实现主人喂宠物的功能... 93
上机练习2. 94
练习-利用多态实现主人和宠物的玩耍功能... 94
3.4 综合练习:利用多态化改进汽车租赁系统的计价功能... 95
上机练习3. 95
指导-计算一次租多辆车的总租金... 95
上机练习4. 96
指导-增加租赁卡车业务,计算汽车租赁总租金... 96
本章总结... 98
本章作业... 99
一、选择题... 99
二、简答题... 101
第4章... 105
接 口... 105
4.1 接口基础知识... 107
4.2 接口表示协议... 110
上机练习1. 114
指导-用面向接口编程思想写一封家书... 114
4.3 接口表示一种能力... 116
上机练习2. 120
练习-软件工程师编写代码,解释业务... 120
4.4 在C接口在#中使用... 120
上机练习3. 124
指导-打印机支持不同类型的墨盒和纸张... 124
本章总结... 126
本章作业... 127
一、选择题... 127
二、简答题... 128
第5章... 131
项目案例:QuickHit 131
5.1 案例分析... 133
5.1.1 需求概述... 133
5.1.2 开发环境... 133
5.1.3 案例覆盖的技能点... 133
5.1.4 问题分析... 134
5.2 项目需求... 137
5.2.1 用例1:游戏输出字符串... 137
5.2.2 用例2:确认输入并输出结果... 138
5.2.3 用例3:玩家玩游戏... 139
5.2.4 用例4:初始化各个级别的具体参数... 140
5.3 进度记录... 142
第6章... 143
指导学习:动物乐园... 143
6.1 复习串讲... 144
6.1.1 难点突破... 144
6.1.2 知识梳理... 144
6.2 综合练习... 146
6.2.1 任务描述... 146
6.2.2 练习... 146
阶段1:指导——设计猫和鸭的类结构,画出类图并写出代码... 146
阶段2:指导——增加新成员海豚,重新设计类结构... 147
阶段3:练习——输出各种动物如何叫... 149
第7章... 151
在线培训:面向对象设计... 151
7.1 学习任务... 152
任务一:制作PPT,讲解类和类之间的关系... 152
任务二:制作PPT,讲解面向对象设计的基本原则... 152
任务三:使用类图设计佩恩沃星球... 153
7.2 参考资料... 154
1,推荐网站... 154
2,搜索关键字... 154
第8章... 155
异 常... 155
8.1异常概述... 157
8.1.1 生活中的异常... 157
8.1.2程序中的异常... 157
8.1.3什么是异常... 160
8.2异常处理... 160
8.2.1 什么是异常处理... 160
8.2.2 try-catch块... 160
8.2.3 try-catch-finally块... 163
8.2.4 多重catch块... 165
8.2.5 上机练习... 168
上机练习1. 168
练习——根据输入的课程编号输出相应的课程名称... 168
8.2.6 声明异常——throws. 168
8.3 抛出异常... 170
8.3.1 抛出异常——throw.. 170
8.3.2 异常的分类... 172
8.3.3上机练习... 174
上机练习2. 174
练习——使用throw抛出异常... 174
8.4开源日志记录工具log4j 175
8.4.1日志及分类... 175
8.4.2 如何使用log4j记录日志... 176
8.4.3 log4j配置文件... 179
8.4.4 上机练习... 181
上机练习3. 181
指导——使用log4j输出异常日志到控制台... 181
上机练习4. 181
练习——使用log4j记录日志到文件... 181
本章总结... 183
本章作业... 184
一、选择题... 184
二、简答题... 186
第 9 章... 188
集 合 框 架... 188
9.1 集合框架概述... 190
9.1.1 引入集合框架... 190
9.1.2 Java集合框架包含的内容... 190
9.2 List接口... 192
9.2.1 ArrayList集合类... 192
上机练习1. 196
练习——添加多个企鹅信息到List中... 196
9.2.2 LinkedList集合类... 197
9.3 Map接口... 199
上机练习2. 201
练习——根据宠物昵称查找宠物... 201
9.4 迭代器Iterator 202
上机练习3. 203
练习——使用Iterator迭代显示存储在List中的企鹅信息... 203
本章总结... 207
本章作业... 208
一、选择题... 208
二、简答题... 209
第10章... 211
JDBC. 211
10.1 JDBC简介... 213
10.1.1 为什么需要JDBC. 213
10.1.2 JDBC的工作原理... 213
10.1.3 JDBC API介绍... 214
10.1.4 JDBC访问数据库的步骤... 215
10.2 Connection接口... 216
10.2.1 两种常用的驱动方式... 216
10.2.2 使用JDBC-ODBC桥方式连接数据库... 216
10.2.3 使用纯Java方式连接数据库... 218
10.2.4 上机练习... 220
上机练习1. 220
练习——使用纯Java方式连接数据库,并进行异常处理... 220
10.3 Statement接口和ResultSet接口... 220
10.3.1 使用Statement添加宠物... 221
10.3.2 使用Statement更新宠物... 223
10.3.3 使用Statement和ResultSet查询所有宠物... 224
10.3.4上机练习... 227
上机练习2. 227
指导——查询所有宠物主人信息... 227
10.4 PreparedStatement接口... 228
10.4.1 为什么要使用PreparedStatement 228
10.4.2 使用PreparedStatement更新宠物信息... 230
10.4.3 上机练习... 232
上机练习3. 232
指导——使用PreparedStatement插入宠物信息... 232
本章总结... 234
本章作业... 235
一、选择题... 235
二、简答题... 236
第 11 章... 238
Oracle基础... 238
11.1 Oracle基础知识... 240
11.1.1 Oracle简介... 240
11.1.2 Oracle基本概念... 241
11.1.3 安装Oracle. 242
11.2 创建数据库和用户... 246
11.2.1 创建数据库... 246
11.2.2 登录管理后台... 254
11.2.3 创建表空间... 256
11.2.4 创建用户并授予权限... 257
11.2.5 上机练习... 259
上机练习1. 259
练习——创建数据库LEDB. 259
上机练习2. 259
练习——创建用户epet 259
11.3 创建数据库表... 260
11.3.1 Oracle数据类型... 260
11.3.2 创建数据库表的方法... 261
11.3.3 创建和使用序列... 263
11.3.4 上机练习... 265
上机练习3. 265
练习——创建数据库表... 265
上机练习4. 265
练习——创建序列,向数据库表录入测试数据... 265
本章总结... 266
本章作业... 267
一、选择题... 267
二、简答题... 267
第12章... 269
Oracle应用... 269
12.1使用JDBC访问Oracle. 271
12.2 Oracle常用函数... 275
上机练习1. 275
指导——主人登录成功后,显示主人的所有宠物信息... 275
上机练习2. 277
练习——主人登录成功后,领养宠物... 277
上机练习3. 281
练习——Oracle函数练习... 281
12.3 Oracle索引... 282
12.3.1 Oracle索引类型... 282
12.3.2 创建和删除索引... 283
12.4 Oracle中数据的导入导出... 284
12.4.1 使用imp和exp导入导出数据... 284
12.4.2 使用PL/SQL Developer导入导出数据... 286
本章总结... 288
本章作业... 289
一、选择题... 289
二、简答题... 290
第 13 章... 291
数据访问层... 291
13.1 数据持久化... 293
13.2 上机练习... 299
上机练习1. 299
练习——定义MasterDao接口和MasterDaoJabcOracleImpl实现类... 299
上机练习2. 300
指导——调用DAO类实现主人登录... 300
13.3 分层开发... 302
13.3.1 分层开发的优势... 302
13.3.2 分层的原则... 303
13.3.3 使用实体类传递数据... 303
13.4 上机练习... 305
上机练习3. 305
指导——记录车辆购置税... 305
本章总结... 307
本章作业... 308
一、选择题... 308
二、简答题... 308
第14章... 310
XML和File I/O.. 310
14.1 XML简介... 312
14.1.1 XML定义... 312
14.1.2 XML结构定义... 313
14.1.3 XML的作用... 318
14.1.4 XML和CSS共同使用... 318
14.2 解析XML. 319
14.2.1 使用DOM解析XML. 320
14.2.2 使用SAX解析XML. 322
上机练习1. 323
指导——根据DTD定义编写XML文档,存放宠物初始信息... 323
上机练习2. 324
指导——使用DOM解析存储宠物初始信息的XML文档... 324
14.3 读写文件... 325
14.3.1 使用Reader读取文件内容... 325
上机练习3. 327
指导——读取模板文件内容并输出... 327
14.3.2 替换模板文件中的占位符... 329
上机练习4. 329
指导——替换模板文件中的占位符... 329
14.3.3 使用Writer输出内容到文件... 330
上机练习5. 331
指导——写宠物信息到文本文件... 331
14.3.4 综合练习... 331
本章总结... 334
本章作业... 335
一.选择题... 335
二.简答题... 336
第 15 章... 337
项目案例:宠物商店... 337
15.1 案例分析... 339
15.1.1 需求概述... 339
15.1.2 开发环境... 339
15.1.3 案例覆盖的技能点... 339
15.1.4 问题分析... 340
15.2 项目需求... 342
15.2.1 用例1:系统启动... 342
15.2.2 用例2:宠物主人登录... 343
15.2.3 用例3:宠物主人购买库存宠物... 345
15.2.4 用例4:宠物主人购买新培育宠物... 345
15.2.5 用例5:宠物主人卖出宠物给商店... 345
15.3 进度记录... 346
第16章... 347
指导学习:课程总复习... 347
16.1 复习串讲... 348
16.1.1 核心技能目标... 348
16.1.2 知识梳理... 348
16.2 综合练习... 351
16.2.1 任务描述... 351
16.2.2 任务分析... 351
16.2.3 练习... 352
阶段1:练习——创建数据库表news. 352
阶段2:练习——创建HTML模板文件... 352
阶段3:指导——从数据库读取新闻信息,保存在泛型集合中... 353
阶段4:指导——读取模板文件... 354
阶段5:指导——编写生成HTML文件的方法... 354
阶段6:指导——遍历集合,生成HTML文件... 354
第1章
抽象和封装
Ø 用类图描述电子宠物系统的设计
Ø 编写代码实现领养宠物功能
Ø 使用类图描述设计
Ø 掌握面向对象设计的基本步骤
Ø 掌握类和对象的概念
Ø 掌握构造方法及其重载
Ø 掌握封装的概念及其使用
请在预习时学会下列单词的含义和发音,并填写在横线处。
- class:_____________________________
- object:____________________________
- static:_____________________________
- final:______________________________
- private:____________________________
- public:_____________________________
- protect:____________________________
- overloading:________________________
- constructor:________________________
- encapsulation:______________________
在学习《使用Java实现面向对象编程》这门课程之前,我们先一起来回顾与这门课程密切相关的课程:《使用Java语言理解程序逻辑》和《深入.ENT平台和C#编程》。
在《使用Java语言理解程序逻辑》中我们学习了一下内容。
Ø Java的基本数据类型以及各种运算符。
Ø 各种程序逻辑控制语句。
Ø 对象和类的区别与联系。
Ø 定义类的方法。
Ø Java中的数组和字符串。
在《深入.ENT平台和C#编程》中我们学习了以下内容。
Ø 类和对象的定义、区别和联系。
Ø 使用集合组织相关数据。
Ø 面向对象的三个特征:封装、继承和多态。
Ø 文件读写和XML。
Ø 序列化和反序列化。
在《使用Java语言理解程序逻辑》中我们掌握了Java语言的一些基础知识,并且掌握了如何运用Java语言实现各种程序逻辑控制,这为本门课程的学习打下了良好的基础。在《深入.ENT平台和C#编程》中我们学习了面向对象的基本思想、基本概念、集合与文件的操作等,与我们这门课的许多内容都是对应的,学习过程中要特别注意C#与Java中同一技能在概念和语法上的不同,通过对比可以更牢固地掌握。
本门课程对应的就业技能结构图如图1.1所示。
图1.1 Java面向对象技术就业技能结构图
图1.1展示了本门课程要学习的主要技能。通过学习不但需要掌握面向对象的封装性、继承性和多态性在Java中的体现,掌握面向对象中另一重要概念——接口。还需要进一步提高灵活运用面向对象技术解决问题的能力,有了扎实的面向对象基础后,我们将继续学习Java的集合类型、异常、使用JDBC操作数据库、XML和文件操作,这些内容的学习将为进一步的JSP技术和框架技术学习做好准备。
学习面向对象,理解其中的概念只是前提,灵活应用才是目的。在本门课程中,我们将通过一个电子宠物系统的设计和开发来展示面向对象的魅力。该案例贯穿书中大多数章节,让我们在完成案例的过程中轻松学会技能,深刻体会技能的应用场合,切实提高开发水平,缩短从技能到应用转化的时间。
本章是本门课程的第1章,首先学习面向对象设计的过程,也就是从现实世界中抽象出程序开发中的类,实现从现实到虚拟的转化;然后对抽象出的类进行操作,实现对现实世界中行为的模拟;第三部分对抽象出的类进行优化,通过封装隐藏类内部的信息以提高安全性;最后通过综合练习来巩固所学的技能。
1.1用面向对象设计电子宠物系统
1.1.1为什么使用面向对象
现实世界就是”面向对象的”。现实世界中的任何事物都可以看作是”对象”,比如人、建筑、交通工具、学习用品等。而事物都有自己的属性和行为。比如人,它具有各种属性:姓名、性别、身高、体重、籍贯等,还可以做很多事情:吃饭、睡觉、劳动、锻炼等。各个事物之间还会发生各种联系,人用木材可以做成一套家具,人用笔可以写出文章等。
面向对象就是采用”现实模拟”的方法设计和开发程序。计算机软件开发规模越来越大,解决的问题也越来越复杂,导致软件开发时间、软件开发成本、软件维护费用甚至软件开发质量等日益难以控制。而面向对象技术利用”面向对象的思想”去描述”面向对象的世界”,实现了虚拟世界和现实世界的一致性,符合人们的思维习惯,使得客户和软件设计开发人员之间,软件设计开发人员内部交流更加顺畅,同时还带来了代码重用性高、可靠性高等优点,大大提高了软件尤其是大型软件的设计和开发效率。
——问答———————————————————————————————————
问题:面向过程和面向对象有什么区别?
解答:我们要举办一次南京的联欢晚会。如果采用面向过程实现的话,就是全体人员合唱某某之歌→主持人宣布晚会开始→领导讲话→主持人过场→演员一表演→主持人过场→演员二表演······→最后一位演员表演→主持人宣布晚会结束,即从头至尾、自上而下的实现功能。而如果采用面向对象实现的话,首先分析晚会需要
———————————————————————————————————————
——问答———————————————————————————————————
哪些类:领导、主持人和演员。然后分析各种类的行为:主持人有宣布晚会开始、过场、宣布晚会结束,当然也有唱某某之歌。领导有讲话、唱某某之歌。演员主要就是表演节目,也有唱某某之歌。然后就利用设计好的类创建对应对象,调用相应方法(行为)来逐步进行晚会。
面向过程的核心概念是函数,以功能为中心,实现了函数级别的代码重用。面向对象的核心概念是封装了属性和方法(行为)的类,以数据为中心,实现了类级别的代码重用。面向对象因为采用了类,具有继承和多态特性,可以进一步重用代码和简化编程,而面向过程中没有继承和多态特性。
———————————————————————————————————————
1.1.2使用面向对象进行设计
下面就开始电子宠物系统的设计和开发之路吧,这一章的任务是用类来描述宠物,然后实现领养宠物功能。首先需要根据需求进行面向对象的设计。
——问答———————————————————————————————————
我们要设计一个电子宠物系统,其中领养宠物功能的详细需求如下。
Ø 根据控制台提示,输入领养宠物的昵称。
Ø 根据控制台提示,选择领养宠物的类型,有两种选择:狗狗和企鹅。
Ø 如果类型选择狗狗,要选择狗狗的品种,有两种选择:”聪明的拉布拉多犬”或者”酷酷的雪娜瑞”。
Ø 如果类型选择企鹅,要选择企鹅的性别:”Q仔”或”Q妹”。
Ø 所领养宠物的健康值默认是100,表示非常健康。
Ø 所领养宠物和主任的亲密度默认是0,表示和主人还不熟悉。
Ø 在控制台打印出宠物信息,包括昵称、健康值、亲密度、品种或性别,表示领养成功。
如何依据需求,使用面向对象思想来设计我们的电子宠物系统呢?
———————————————————————————————————————
——分析———————————————————————————————————
面向对象设计的过程就是抽象的过程,我们分三步来完成。
第一步:发现类。
第二步:发现来的属性。
第三步:发现类的方法。
———————————————————————————————————————
面向对象设计的过程就是抽象的过程,根据业务需求,关注与业务相关的属性和行为,忽略不必要的属性和行为,由现实世界中”对象”抽象出软件开发中的”对象”,如图1.2所示。
抽象 |
图1.2 面向对象设计的过程就是抽象的过程
接下来我们就按照发现类、发现类的属性和发现类的方法的步骤完成设计。
我们可以通过在需求中找出名词的方式确定类和属性,找出动词的方式确定方法。并根据需要实现业务的相关程度进行筛选。
需求中名词有控制台、宠物、昵称、狗狗、企鹅、类型、品种、聪明的拉布拉多犬、酷酷的雪娜瑞、性别、Q仔、Q妹、健康值、亲密度和主人等。
根据仔细筛选,发现可以作为类的名词有宠物、狗狗、企鹅和主人。本章要实现领养宠物功能,主要用到两个类:狗狗(Dog)和企鹅(Penguin)。宠物和主人在完善设计和增加功能时再使用。
需求中动词主要有输入、选择、领养、打印等。某些明显与设计无关、不重要的词语可以直接忽略。
通过仔细筛选,发现可作为属性的名词有昵称、健康值、亲密度、品种和性别,还有一些名词是作为属性值存在的,例如聪明的拉布拉多犬、酷酷的雪娜瑞是品种的属性值,Q仔和Q妹是性别的属性值。
根据需求,定义狗狗类的属性有昵称(name)、健康值(health)、亲密度(love)和品种(strain)。企鹅类的属性有昵称(name)、健康值(health)、亲密度(love)和性别(sex)。狗狗和企鹅的某些属性,例如年龄、体重、颜色等与领养业务需求无关,不予设置。
通过仔细筛选,发现类的方法主要是打印宠物信息。狗狗和企鹅的方法主要就是打印出自己的信息,取名为print()。至于狗狗睡觉、洗澡等行为,企鹅吃饭、游泳等行为,与领养业务需求无关,现在先不为其设定方法,在后续业务中若有需求再添加。
设计是一个逐步调整、完善的过程,类图是面向对象设计的”图纸”、使用”图纸”进行设计方便沟通和修改。将设计的结果通过类图来表示,如图1.3和图1.4所示。
图1.3 Dog类图 图1.4 Penguin类图
——小结———————————————————————————————————
抽象时遵循的原则。
Ø 属性、方法的设置是为了解决业务问题的。
Ø 关注主要属性、方法。
Ø 如果有必要,勿增加额外的类、属性与方法。
———————————————————————————————————————
1.2通过创建对象实现领养宠物功能
1.2.1创建类的对象
已经设计出了类及其属性和方法,下面需要把类图表示的内容转变为Java的类代码。
狗狗类的代码如示例1所示。
/**
* 宠物狗狗类。
* @author 南京
*/
public class Dog {
String name = "无名氏"; // 昵称,默认值是"无名氏"
int health = 100; // 健康值,,默认值是100
int love = 0; // 亲密度
String strain = "聪明的拉布拉多犬"; // 品种
/**
* 输出狗狗的信息。
*/
public void print() {
System.out.println("宠物的自白:\n我的名字叫" + this.name +
",健康值是" + this.health + ",和主人的亲密度是"
+ this.love + ",我是一只 " + this.strain + "。");
}
}
企鹅类的代码如示例2所示。
/**
* 宠物企鹅。
* @author 南京
*/
public class Penguin {
String name = "无名氏"; // 昵称
int health = 100; // 健康值
int love = 0; // 亲密度
String sex = "Q仔"; // 性别
/**
* 输出企鹅的信息。
*/
public void print() {
System.out.println("宠物的自白:\n我的名字叫" + this.name +
",健康值是" + this.health + ",和主人的亲密度是"
+ this.love + ",性别是 " + this.sex + "。");
}
}
从示例1和示例2中我们学习了类的基本结构,其主要由属性和行为组成,称为类的成员变量(或者成员属性)和成员方法,统称为类的成员(除此之外,类的成员还包括构造方法、代码块等)。
——问题———————————————————————————————————
已经有了狗狗和企鹅的类,如何领养宠物呢?
———————————————————————————————————————
——分析———————————————————————————————————
领养宠物的步骤如下。
Ø 根据控制台提示输入宠物的类型、昵称等内容。
Ø 根据输入内容创建相应的宠物对象。
Ø 打印出宠物信息表,示领养成功。
———————————————————————————————————————
通过测试类来创建具体的宠物对象并输出信息,如示例3所示。
import java.util.Scanner;
/**
* 领养宠物。
* @author 南京
*/
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("欢迎您来到宠物店!");
// 1、 输入宠物名称
System.out.print("请输入要领养宠物的名字:");
String name = input.next();
// 2、 选择宠物类型
System.out.print("请选择要领养的宠物类型:(1、狗狗 2、企鹅)");
switch (input.nextInt()) {
case 1:
// 2.1、如果是狗狗
// 2.1.1、选择狗狗品种
System.out.print("请选择狗狗的品种:(1、聪明的拉布拉多犬" +
" 2、酷酷的雪娜瑞)");
String strain = null;
if (input.nextInt() == 1) {
strain = "聪明的拉布拉多犬";
} else {
strain = "酷酷的雪娜瑞";
}
// 2.1.2、创建狗狗对象并赋值
Dog dog = new Dog();
dog.name = name;
dog.strain = strain;
// 2.1.3、输出狗狗信息
dog.print();
break;
case 2:
// 2.2、如果是企鹅
// 2.2.1、选择企鹅性别
System.out.print("请选择企鹅的性别:(1、Q仔 2、Q妹)");
String sex = null;
if (input.nextInt() == 1)
sex = "Q仔";
else
sex = "Q妹";
// 2.2.2、创建企鹅对象并赋值
Penguin pgn = new Penguin();
pgn.name = name;
pgn.sex = sex;
// 2.2.3、输出企鹅信息
pgn.print();
}
}
}
运行结果如图1.5和图1.6所示。
图1.5 领养狗狗运行结果
图1.6 领养企鹅运行结果
从示例3中我们学习了Java中对象的创建和成员的调用方法,语法和C#中是相同的。
Ø 通过构造方法来创建对象,例如”Penguin p=new Penguin();”。
Ø 通过对象名、属性名的方式调用属性,例如”p.name=“qq”;”。
Ø 通过对象名、方法名的方式调用方法,例如”p.print();”。
类(Class)和对象(Object)是面向对象中的两个核心概念。类是对某一类事物的描述,是抽象的、概念上的定义。对象是实际存在的该事物的个体,是具体的、现实的。类和对象就好比模具和铸件的关系,建筑物图纸和建筑物实物的关系。我们可以由一个类创建多个对象。
示例1是一个Dog类的代码,示例2是一个Penguin类的代码。但是如果要实现我们的需求,只有类是不行的,还需要创建对应类的示例,也就是对象。在示例3中我们根据输入的数据创建了宠物对象并输出宠物信息。
——规范———————————————————————————————————
类名、属性名、方法名以及常量名的命名规范如下。
Ø 类名由一个或几个单词组成,每个单词的第一个字母大写,如Dog、StringBuffer。
Ø 属性名和方法名由一个或几个单词组成,第一个单词首字母小写,其他单词首字母大写,例如health、stuName、println()、getMessage()。
Ø 常量名由一个或几个单词组成,所有字母大写,如PI、SEX_MALE。
———————————————————————————————————————
——问题———————————————————————————————————
如果我们创建了很多企鹅对象,它们的性别分别取值为”Q仔”或”Q妹”,但是后来要求变化,规定企鹅的性别只能取值”雄”或”雌”,此时已创建的每个企鹅对象的性别都要做相应修改,修改量很大,且代码可能分散在多个文件,不易查找,有没有更好地解决办法呢?
———————————————————————————————————————
——分析———————————————————————————————————
可以定义两个常量SEX_MALE和SEX_FEMALE,分别取值为”Q仔”和”Q妹”,在给企鹅赋值时直接将常量名SEX_MALE或SEX_FEMALE赋给sex属性。
如果以后要修改sex为”雄”或”雌”时,不管已创建了多少个对象,只需要修改两个常量的值就可以了,这样就方便了很多。
Ø final String SEX_MALE=“Q仔”: SEX_MALE是常量,值只能是”Q仔”,但是必须在创建对象后,通过对象名,SEX_MALE方式使用,很不方便。
Ø static final String SEX_MALE=“Q仔”: SEX_MALE是常量,值只能是”Q仔”,可以再创建对象后,通过对象名,SEX_MALE方式,也可以直接通过类名. SEX_MALE方式使用,建议采用此种方式。
———————————————————————————————————————
给企鹅添加两个静态常量SEX_MALE和SEX_FEMALE,如示例4所示。
/**
* 宠物企鹅类,使用静态常量。
*/
public class Penguin {
String name = "无名氏"; // 昵称
int health = 100; // 健康值
int love = 0; // 亲密度
static final String SEX_MALE ="Q仔";
static final String SEX_FEMALE="Q妹";
//static final String SEX_MALE = "雄";
//static final String SEX_FEMALE = "雌";
String sex = SEX_MALE; // 性别
/**
* 输出企鹅的信息。
*/
public void print() {
System.out.println("宠物的自白:\n我的名字叫" + this.name
+ ",健康值是" + this.health + ",和主人的亲密度是"
+ this.love + ",性别是 " + this.sex + "。");
}
}
编写测试类,创建三个企鹅对象并对其性别赋值,如示例5所示。
/**
* 测试静态常量的使用。
* @author 南京
*/
public class Test {
public static void main(String[] args) {
Penguin pgn = null;
pgn = new Penguin();
System.out.println("第一个企鹅的性别是" + pgn.sex + "。");
pgn = new Penguin();
pgn.sex = Penguin.SEX_FEMALE;
System.out.println("第二个企鹅的性别是" + pgn.sex + "。");
pgn = new Penguin();
pgn.sex = Penguin.SEX_MALE;
System.out.println("第三个企鹅的性别是" + pgn.sex + "。");
}
}
运行结果如图1.7所示。
图1.7 输出企鹅的性别
如图要改变企鹅的性别取值为”雄”和”雌”,只需要修改Penguin类中两个常量的值即可,如示例6所示,而创建对象的类如示例5所示,不用做任何修改。
/**
* 宠物企鹅类,使用静态常量。
*/
public class Penguin {
String name = "无名氏"; // 昵称
int health = 100; // 健康值
int love = 0; // 亲密度
// static final String SEX_MALE ="Q仔";
// static final String SEX_FEMALE="Q妹";
static final String SEX_MALE = "雄";
static final String SEX_FEMALE = "雌";
String sex = SEX_MALE; // 性别
/**
* 输出企鹅的信息。
*/