描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302454786丛书名: 21世纪大学本科计算机专业系列教材
本书在知识表达形式上改变了传统教材对知识平铺直叙的描述方式,而是将大量知识点融入到代码实例中进行讲解,由浅入深,通过对核心知识的实例化来提高学生的编程兴趣,让学生既知道需要学什么,又懂得如何学以致用。与其他Java教材相比,本书在重要知识点和案例选择中均针对实际问题需求,从软件开发者的视角进行讲解与分析,各知识点中均凝聚了作者在Java应用开发中的实际经验和教研成果,体现了知识的实用性。在注重基本知识的同时,将案例解决方法、过程和原理融入其中,提升学生分析问题和实际编程的能力。
本书可作为高等学校计算机及相关专业本科生“Java程序设计”课程的教材,也可作为需要运用Java语言开发应用的软件人员的自学参考书。
目录CONTENTS篇基础篇
第1章Java概述3
本章学习目标3
1.1认识Java语言3
1.1.1Java语言的特点4
1.1.2Java平台的体系结构4
1.2Java运行环境与开发环境5
1.2.1Java运行环境6
1.2.2安装6
1.2.3安装Eclipse开发工具6
1.3Java程序举例8
1.3.1用Eclipse编写个Java
Application8
1.3.2用Eclipse编写带命令行参数的应用程序13
习题与思考15
第2章Java程序设计基础16
本章学习目标16
2.1标识符和关键字16
2.1.1如何定义标识符16
2.1.2关键字17
2.1.3注释17
2.2常量和变量18
2.2.1常量18
2.2.2变量18
2.3基本数据类型19
2.3.1布尔类型19
2.3.2字符类型20Java程序设计(第2版)目录2.3.3整数类型21
2.3.4浮点类型21
2.3.5各类型数据间的相互转换22
2.4运算符23
2.4.1算术运算符23
2.4.2赋值运算符25
2.4.3条件运算符26
2.4.4位运算符26
2.4.5关系运算符28
2.4.6逻辑运算符28
2.5表达式29
2.6程序控制语句30
2.6.1if语句30
2.6.2switch语句31
2.6.3while与dowhile语句33
2.6.4for语句34
2.6.5break语句36
2.6.6continue语句38
2.6.7return语句39
2.6.8实用案例40
2.7实训任务41
习题与思考42
第3章数组44
本章学习目标44
3.1数组使用初探44
3.2一维数组45
3.2.1定义数组45
3.2.2生成数组45
3.2.3初始化数组46
3.2.4访问数组46
3.2.5实用案例47
3.3二维数组47
3.3.1定义二维数组48
3.3.2二维数组元素的引用48
3.3.3实用案例49
3.4Arrays类50
3.4.1Arrays类及基本使用50
3.4.2实用案例52
3.5数组实训任务53
习题与思考54
第4章类和对象设计56
本章学习目标56
4.1面向对象基础56
4.2类和对象初探58
4.3定义类59
4.3.1定义成员变量59
4.3.2定义成员方法60
4.3.3方法重载61
4.4对象62
4.4.1实例化对象62
4.4.2初始化对象62
4.4.3使用对象64
4.4.4使用静态变量和方法66
4.4.5清除对象68
4.4.6应用程序与命令行参数68
4.4.7实用案例70
4.5包71
4.5.1包的定义71
4.5.2包的引入72
4.6类及成员修饰符73
4.6.1public73
4.6.2protected74
4.6.3private75
4.6.4final76
4.6.5实用案例77
4.7类和对象实训任务78
习题与思考83
第5章继承与多态84
本章学习目标84
5.1继承使用初探84
5.2类的继承85
5.2.1继承的实现85
5.2.2继承与重写87
5.2.3继承与类型转换90
5.2.4实用案例91
5.3多态性92
5.3.1多态性的概念92
5.3.2实用案例94
5.4抽象类与抽象方法95
5.4.1定义抽象类及实现抽象方法95
5.4.2实用案例95
5.5接口97
5.5.1接口定义97
5.5.2接口实现97
5.5.3实用案例99
5.6内部类100
5.6.1成员内部类101
5.6.2局部内部类101
5.6.3静态内部类(嵌套类)101
5.6.4匿名内部类102
5.6.5实用案例102
5.7Java类的高级特性104
5.7.1泛型104
5.7.2Java类加载机制107
5.7.3Java反射机制108
5.7.4实用案例114
5.7.5Java注解120
5.8继承与多态实训任务123
习题与思考125
第6章Java标准类库128
本章学习目标128
6.1Java标准类库简介128
6.2字符串String类和StringBuffer类129
6.2.1String类129
6.2.2StringBuffer类134
6.2.3正则表达式136
6.2.4实用案例139
6.3数据类型包装器类139
6.3.1整型包装器类140
6.3.2实用案例141
6.4System类和Runtime类142
6.4.1记录程序执行的时间142
6.4.2复制数组143
6.4.3内存管理143
6.4.4实用案例144
6.5Math类和Random类145
6.5.1Math类145
6.5.2Random类146
6.5.3实用案例147
6.6日期时间实用工具类148
6.6.1Date(日期)148
6.6.2Calendar(日历)149
6.6.3实用案例151
6.7Java集合类152
6.7.1集合接口152
6.7.2实现List接口的类154
6.7.3实现Set接口的类156
6.7.4通过迭代接口访问集合类158
6.7.5映射接口160
6.7.6实现Map接口的类162
6.8标准类实训任务165
习题与思考167
第二篇提高篇
第7章异常处理171
本章学习目标171
7.1为什么需要异常处理171
7.2异常概述174
7.2.1什么是异常174
7.2.2异常处理带来的好处175
7.3异常处理机制177
7.3.1Java的异常处理机制177
7.3.2异常类的类层次178
7.3.3异常的处理179
7.3.4实用案例182
7.4自定义异常类184
7.5异常处理实训任务186
习题与思考187
第8章输入输出处理188
本章学习目标188
8.1流的作用188
8.2流的划分189
8.3标准输入输出流191
8.3.1标准输入191
8.3.2Scanner类封装标准输入流192
8.3.3标准输出193
8.3.4实用案例193
8.4字节流使用194
8.4.1File类194
8.4.2文件字节流199
8.4.3字节过滤流201
8.4.4实用案例203
8.5字符流使用205
8.5.1文件字符流205
8.5.2字节流向字符流的转化206
8.5.3Scanner封装字符流208
8.5.4实用案例210
8.6串行化211
8.6.1串行化的概念211
8.6.2实用案例212
8.7输入输出处理实训任务213
习题与思考217
第9章Java多线程218
本章学习目标218
9.1为什么使用多线程218
9.2线程的概念219
9.3线程的创建220
9.3.1采用继承创建线程220
9.3.2通过实现接口创建线程222
9.3.3实用案例223
9.4线程的生命周期及调度224
9.4.1线程生命周期224
9.4.2线程调度和优先级226
9.4.3线程的终止227
9.4.4实用案例229
9.5多线程互斥与同步230
9.5.1线程的互斥230
9.5.2线程的同步234
9.5.3实用案例236
9.6多线程实训任务238
习题与思考242
第10章GUI程序设计244
本章学习目标244
10.1为什么学习GUI程序设计244
10.2基于Swing的简单界面设计245
10.2.1Swing简介245
10.2.2Swing的类层次结构246
10.2.3常见GUI组件247
10.2.4基于AWT的GUI程序249
10.3界面布局251
10.3.1无布局管理器布局251
10.3.2FlowLayout253
10.3.3BorderLayout254
10.3.4GridLayout255
10.3.5利用可视化工具进行布局256
10.3.6实用案例259
10.4响应用户事件261
10.4.1事件处理的基本过程261
10.4.2常用事件与事件监听器类263
10.4.3键盘与鼠标事件265
10.4.4实用案例268
10.5高级组件JTree和JTable270
10.5.1JTree组件270
10.5.2JTable组件274
10.5.3实用案例277
10.6GUI程序设计实训任务279
习题与思考285
第三篇网络篇
第11章网络通信289
本章学习目标289
11.1类URL与URLConnection289
11.2类InetAddress294
11.3Socket通信296
11.3.1基于TCP协议的Socket通信296
11.3.2实用案例298
11.3.3基于UDP的网络通信302
11.3.4实用案例303
11.3.5基于MulticastSocket实现多点广播306
11.4网络通信实训任务308
习题与思考309
第12章JSP与Servlet技术310
本章学习目标310
12.1为什么使用JSP310
12.2JSP技术312
12.2.1JSP工作原理312
12.2.2JSP的构成314
12.2.3JSP内建对象317
12.2.4实用案例322
12.3Servlet技术324
12.3.1Servlet介绍324
12.3.2Servlet常用接口的使用325
12.3.3使用HttpServlet处理客户端请求329
12.3.4获得Servlet初始化参数332
12.3.5实用案例334
12.4JSP和Servlet结合的方法336
12.4.1模式一: JSP JavaBean336
12.4.2模式二:
JSP Servlet JavaBean336
12.4.3JSP和Servlet的选择337
12.4.4实用案例337
12.5JSP与Servlet开发实训任务339
习题与思考342
第13章用Tomcat构建Web站点343
本章学习目标343
13.1Tomcat简介343
13.2安装配置Tomcat344
13.3编写简单的Web站点345
13.3.1配置服务器运行环境345
13.3.2新建动态Web工程346
13.3.3Web工程的结构347
13.3.4新建Servlet和JSP程序347
13.4运行Web站点351
13.5发布Web站点352
习题与思考353
第14章JDBC技术354
本章学习目标354
14.1为什么需要JDBC354
14.2数据库和常用的SQL语句356
14.3JDBC的结构358
14.4通过JDBC访问数据库359
14.4.1加载JDBC驱动程序359
14.4.2建立连接359
14.4.3执行SQL语句360
14.4.4检索结果360
14.4.5关闭连接361
14.4.6实用案例361
14.4.7事务处理365
14.4.8实用案例366
14.5JDBC实训任务370
习题与思考376
第四篇实例篇
第15章Java应用开发案例379
本章学习目标379
15.1基于Web的简单学生信息管理系统379
15.1.1程序的基本结构379
15.1.2数据库操作的实现381
15.1.3处理Web请求386
15.1.4Web页面388
15.2推箱子游戏398
15.2.1程序的基本结构398
15.2.2游戏地图设计398
15.2.3程序逻辑399
15.2.4绘制游戏界面404
15.2.5游戏窗体406
参考文献409
本书主审: 李晓明
第2版前言FOREWORDJava语言是由Sun公司推出的面向对象程序设计语言,它的平台无关性特点非常适于网络应用,因而备受青睐。由于Java的体系和内容非常庞大,如何帮助初学者建立一个完整的知识体系,如何引导读者将Java的理论、实践和编程技能融为一体,是本书重点考虑的问题。本书是网络教育国家精品课程和国家精品资源共享课程“Java程序设计”的配套教程,适合作为高等学校或网络教育Java课程的教材。本书第1版出版5年多来,受到全国广大师生的好评,已7次印刷发行。教材第2版根据*高等学校计算机类专业教学指导委员会关于提升学生编程实践能力的精神,在总结课程教学改革经验基础上并结合对第1版教材的反馈意见修订而成。全书组织架构与第1版保持不变,内容由浅入深地分为4篇: “基础篇”(第1~6章)介绍面向对象程序设计的基本思想和Java核心语法;“提高篇”(第7~10章)讲述如何利用Java编程接口提升程序的实用性、可靠性和界面友好性;“网络篇”(第11~14章)在介绍网络通信知识基础上,讲述如何应用Java语言实现桌面应用和Web应用;“实例篇”(第15章)通过具体案例展示Java应用程序的设计过程、编程思路和技术,为项目实战积累编程经验。第2版主要修改包括:(1) 根据JDK 8版的新特性进行了版本更新,并增加了若干相关知识点,具体内容有: 第1章增加了Eclipse安装使用,同时删除原附录A;第3章增加了数组类Arrays;第5章增加了内部类、泛型、闭包、反射机制和注解技术等;第6章增加了正则表达式、Runtime类、自动装箱和拆箱技术等;第9章增加了线程池、多线程互斥与同步等;第10章弱化Applet,同时增强了Swing中的高级组件;第11章增加了多播通信技术;第14章增加了数据库事务管理等内容。(2) 进一步丰富了导入案例、知识点案例和各章的综合案例,增加了一系列面向小节知识的实用小案例,力图通过解决模拟问题,培养学生思维能力,激发学生编程兴趣。(3) 提供了与本书配套的、完整的案例源码,便于学生课后自我练习。全书由朱庆生、古平、刘骥、葛亮、杨瑞龙编写。其中,朱庆生教授负责全书体系构思、编写框架、内容选择和编写指导等,并对全书进行审定和修改。第3、4、5、11章由古平副教授编写,第1、7、12、14章由葛亮副教授编写,第10、13、15章由刘骥老师编写,第2、6、8、9章由杨瑞龙老师编写。本次修订,错误或遗漏之处在所难免,恳请批评指正。
作者2016年9月第1版前言FOREWORDJava语言是由Sun公司推出的面向对象程序设计语言,它的平台无关性特点非常适于网络应用,因而备受青睐。Java语言正逐步成为全世界程序员使用多的编程语言,并在桌面应用、Web应用、分布式应用、嵌入式应用系统中发挥着重要作用。对于初学Java程序设计语言的人来说,Java的体系和内容显得非常复杂。如何帮助他们建立一个完整的知识体系,以及如何引导他们将Java的理论、实践和技能融为一体,是本书重点考虑的问题。本书是在国家精品课程“Java程序设计”(网络)和*IBM精品课程“Java并发编程实践”的建设和实践教学中总结出来的实用教材,面向全国高校计算机及其相关专业本科生,也可供Java自学人员、软件开发人员参考使用。全书内容由浅入深分为4篇。篇为基础篇(第1~6章),侧重介绍面向对象程序设计的基本思想和Java核心语法,包括Java运行环境、程序设计基础、数组、类和对象、继承与多态、Java标准类库等。通过这一部分的学习,读者能够掌握Java程序设计的基本方法,并能设计简单的Java程序。第二篇为提高篇(第7~10章),讲述如何利用Java开放的编程接口提升程序的实用性、可靠性和界面友好性,包括Java的异常处理机制、输入输出处理、多线程、图形界面设计、Applet等。通过这一部分的学习,读者可以开发功能更复杂、界面更友好的实用Java应用系统。第三篇为网络篇(第11~14章),介绍网络通信的基础知识,以及Java对桌面网络应用和Web应用的支持与实现,内容包括URL与Socket通信技术、Web编程技术、JDBC技术,以及上述技术在Tomcat与Eclipse开发平台中的具体实现。这是Java在网络通信、Web服务中应用的关键技术。第四篇为实例篇(第15章),通过两个实用案例,分别展示Java桌面应用和Web应用程序的设计过程、思路和关键技术,是前3篇知识的综合应用,也为项目实战积累开发经验。本书在编写上具有以下特点:(1) 注重知识点之间的相互衔接。本书在章节安排上考虑了知识点之间的依赖关系,分析时层层推进,注重知识点之间的环环相扣。(2) 采用Why—What—How的编写模式。本书采用“为什么学→学什么→如何学”的教学思路进行内容组织,每章首先通过“本章学习目标”让读者明确为什么学,其次通过具体案例引出需要学什么,然后从问题求解过程中逐步引出关键知识点,使读者知道该如何学,能够轻松、快速掌握Java语言的基本知识体系和编程技巧。(3) 案例层次化。在章节进入时有导入案例,主要知识点有印证案例,模拟练习时有实训案例,所有案例均配有详细的代码解释和分析。导入案例→印证案例→实训案例,实践→理论→再实践,理论知识与实际应用紧密结合。本书由朱庆生、古平、刘骥、葛亮、杨瑞龙编写。其中,朱庆生教授负责全书体系构思、框架制定、内容选择、编写指导等,并对全书各章进行了审查和修改;第3、4、5、10(部分)、11章由古平编写;第1、7、12、14章由葛亮编写;第10(部分)、13、15章和附录由刘骥编写;第2、6、8、9章由杨瑞龙编写。书中难免有遗漏和不足之处,恳请业界同仁及读者朋友提出宝贵意见,以便在修订时进一步完善。
Java程序设计(第2版)编者2011年1月
void show() {System.out.println(“k: ” k);showi();}void sum() {System.out.println(“i k: ” (i k));}}public class Simple {public static void main(String args[]) {A superOb=new A();B subOb=new B();superOb.i=10;//对父类对象的成员赋值System.out.println(“Contents in 父类: “);superOb.showi();subOb.i=7; //对子类中继承得到的变量i赋值subOb.k=9;System.out.println(“Contents in 子类: “);subOb.show();System.out.println(“Sum of i and k in 子类:”);subOb.sum();}}程序运行结果:Contents in 父类:i: 10Contents in 子类:k: 9i: 7Sum of i and k in 子类:i k: 16分析: 类B中虽然没有定义变量i和方法showi(),但却可以通过继承关系获得,因此在类B中直接引用i和方法showi()是正确的。但是,如果在类A的语句int i前加上修饰符private,则上述程序会出现编译错误,其原因在于类B无法继承到private类型的变量i,因此i对类B是不可见的。提示: 尽管一个子类可以从父类继承所有允许的方法和变量,但它不能继承构造函数,掌握这一点很重要。一个类要得到构造函数,只有两个办法: 一是重写构造函数;二是根本不写构造函数,这时系统为每个类生成一个默认构造函数。5.2.2继承与重写在类的继承过程中,如果子类中新增的变量和方法与父类中原有的数据和方法同名,则会重写(也称覆盖)从父类继承来的同名变量和方法。重写又分变量重写和方法重写,变量重写是指父类和子类中的变量名相同,数据类型也相同。方法重写与之前介绍的方法重载相似,但更严格: 不仅要求父类与子类中的方法名称相同,而且参数列表也要相同,只是实现的功能不同。【例5.2】重写父类中的同名方法和变量。package code0502;class SuperCla {int a=3, b=4;void show() {System.out.println(“super result=” (a b));}}class SubCla extends SuperCla {int a=10;//重写了父类中同名的变量avoid show() { //重写了父类中同名的方法showint c=a b;System.out.println(“sub result=” c);}}public class OverrideTest {public static void main(String args[]) {SuperCla sp=new SuperCla();SubCla sb=new SubCla();sp.show(); //此处调用的是父类中的方法showSystem.out.println(“In super Class:a=” sp.a);//此处引用的是父类中的变量asb.show();//此时子类对象的show方法覆盖了父类的同名方法System.out.println(“In sub Class:a=” sb.a); }}程序运行结果:super result=7In super Class:a=3sub result=40In sub Class:a=10分析: 子类SubCla中定义有与父类SuperCla同名的变量a和方法show(),因此,使用子类对象sb访问变量a和方法show()时,引用的是子类中的成员,父类的同名变量被覆盖,同名的方法被重写。如果想在子类中访问父类中被覆盖的成员,可以使用关键字super来解决这一问题,其基本格式如下:访问父类成员:super.成员变量或super.成员方法([参数列表])访问父类构造方法:super([参数列表])【例5.3】super关键字的使用。package code0502;//定义员工类class Employee {private String name;private int salary;public String getDetails() {return “Name:” name “\nSalary:” salary;}Employee() {name=”Tom”;salary=1234;}}//定义经理类class Manager extends Employee {public String department;/ 重写getDetails方法 /public String getDetails() {System.out.println(“I am in Manager”);return super.getDetails();//调用父类的getDetails方法}Manager() {super(); //访问父类的无参构造方法,即Employee()department=”sale”;}}public class Inheritance {public static void main(String arg[]) {Manager m=new Manager();System.out.println(m.getDetails());System.out.println(“department:” m.department);}}程序运行结果:I am in ManagerName:TomSalary:1234department:sale分析: 程序首先对Manager实例化,并自动调用无参构造方法Manager(),主要完成两项主要任务: 一是通过super()调用父类的无参构造函数,即Employee();二是对子类中新增变量department初始化。接着,语句m.getDetails()调用子类的同名方法getDetails(),并在方法体中通过super.getDetails()实现对父类中getDetails()方法的调用。注意: 生成一个子类的实例时,首先要执行子类的构造方法,但如果该子类继承自某个父类,则执行子类的构造方法前, 系统将先自动调用父类的无参构造函数。因此,在例5.3中的方法Manager()中去掉语句super()效果是完全相同的。对于父类含参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法中的条可执行语句。与super不同,关键字this的主要作用在于表示当前对象的引用,当局部变量和类的成员变量同名时,该局部变量作用区域内成员变量就被隐藏了,必须使用this来指明。【例5.4】this关键字的使用。package code0502;public class ThisTest {public static void main(String[] args) {Local aa=new Local();} }class Local { public int i=1;//这个i是成员变量Local(int i) {//这个i是局部变量System.out.println(“this.i=” this.i);//this.i指的是对象本身的成员变量iSystem.out.println(“i=” i); //变量i前没有this,因此是局部变量}Local(){this(6);}}程序运行结果:this.i=1i=6分析: 关键字this的主要作用有两点: 一是通过它引用成员变量,如上例中this.i指的是当前对象中的成员变量i;二是通过this调用类的构造方法,如上例中的this(6)将调用对应的构造方法Local(int i)。5.2.3继承与类型转换和标准类型数据的转换一样,不同类的对象之间也可以相互转换,但前提是源和目标类之间必须通过继承相联系。转换可分为显式和隐式转换两种。显式转换格式为:(类名)对象名它将对象转换成类名所表示的其他对象。Java支持父类和子类对象之间的类型转换,如果是子类对象转换为父类,可进行显式转换或隐式转换;如果是父类对象转换成子类,编译器首先要检查这种转换的可行性,如果可行,则必须进行显式转换。【例5.5】对象类型的转换示例。package code0502;class CA{String s=”class CA”;}class CB extends CA{String s=”class CB”;}class Convert{public static void main(String args[]){CB bb,b=new CB();CA a,aa;a=(CA)b;//显式转换aa=b;//隐式转换System.out.println(a.s);System.out.println(aa.s);bb=(CB)a;//显式转换System.out.println(bb.s);}}程序运行结果:class CAclass CAclass CB分析: b是子类CB的实例,将其转换为父类CA的实例时可以进行显式或隐式转换。而父类对象a转换为子类CB的对象时,必须进行显式转换。5.2.4实用案例【例5.6】通过继承定义员工和经理类。普通员工和经理作为职员有很多共同之处,如都可以取得工资报酬,但经理可能还会获得额外的奖金,因此在成员属性和方法上可能有特殊之处。可以将NewEmployee类定义为父类,NewManager类作为子类,子类继承了父类,并添加了一个新的setBonus方法,用于增加奖金,后打印出结果。本实用案例程序如下:package code0502;import java.util.;class NewEmployee {private String name;private double salary;private Date hireDay;
public NewEmployee(String n, double s, int year, int month, int day) {name=n;salary=s;GregorianCalendar calendar=new GregorianCalendar(year, month-1, day);hireDay=calendar.getTime();}public String getName() {return name;}public double getSalary() {return salary;}public Date getHireDay() {return hireDay;}public void raiseSalary(double byPercent) {double raise=salary byPercent/100;salary =raise;}}package code0502;class NewManager extends NewEmployee {private double bonus;public NewManager(String n, double s, int year, int month, int day) {super(n, s, year, month, day);bonus=0;}public double getSalary() {double baseSalary=super.getSalary();return baseSalary bonus;}public void setBonus(double b) {bonus=b;}}package code0502;public class ManagerTest {public static void main(String[] args) {NewEmployee e=new NewEmployee(“Harry Hacker”, 50000, 1989, 10, 1);e.getName();System.out.println(e.getName() “:” e.getSalary());NewManager boss=new NewManager(“Carl Cracker”, 80000, 1987, 12, 15);boss.setBonus(5000);System.out.println(boss.getName() “:” boss.getSalary()); }}程序运行结果:Harry Hacker:50000.0Carl Cracker:85000.05.3多态性〖*4/5〗5.3.1多态性的概念简单地说,多态性就是一个名称可以对应多种不同的实现方法。Java的多态性体现在两个方面: 编译多态和运行多态。编译多态是指在程序编译过程中体现出的多态性,如方法重载,尽管方法名相同,但由于参数不同,在调用时系统根据传递参数的不同确定被调用的方法,这个过程是在编译是完成的。例如,定义一个作图的类,它有一个draw()方法用于绘图,根据不同的使用情况,可以接收字符串、矩形、圆形等参数。对于每一种实现,方法名都为draw(),只不过具体实现方式不同,不用另外重新起名,这样大大简化了方法的实现和调用,程序员无须记住很多的方法名,只需传递相应的参数即可。运行多态则是由类的继承和方法重写引起的,由于子类继承了父类的属性和方法,因此,凡是父类对象可以使用的地方,子类对象也可以使用。如例5.5中的类CA和CB,可以直接生成子类CB的对象,并将该引用赋给父类CA的对象,即:CA a=new CB();它等价于下面两个子句:CB b=new CB(); CA a=b;//隐式类型转换现在有一个问题: 如果子类重写了父类的成员方法,调用该方法时,到底应该调用父类中的方法还是子类中的方法?这无法在编译时确定,需要系统在运行时根据实际来决定,所以这种由方法重写引起的多态称为运行多态。Java规定: 对重写的方法,Java根据调用该方法的实例的类型来决定选择哪个方法。对子类的实例,如果子类重写了父类的方法,则调用子类的方法;如果子类没有重写父类的方法,则调用父类的方法。【例5.7】类的多态性示例。package code0503;class A {void callme() {System.out.println(“inside A”);}}class B extends A {void callme() {System.out.println(“inside B”);}}class Poly {public static void main(String args[]) {A a=new A();B b=new B();A c=new B();a.callme();b.callme();c.callme();}}程序运行结果:inside Ainside Binside B
评论
还没有评论。