新書推薦:
《
当代精神分析新论
》
售價:HK$
94.6
《
宋初三先生集(中国思想史资料丛刊)
》
售價:HK$
217.8
《
定言命令式:康德道德哲学研究(政治哲学名著译丛)
》
售價:HK$
129.8
《
棕榈油的全球史 : 从奴隶船到购物篮
》
售價:HK$
96.8
《
简帛时代与早期中国思想世界(上下册)(王中江著作系列)
》
售價:HK$
308.0
《
进化主义在中国的兴起(王中江著作系列)
》
售價:HK$
209.0
《
不废风雅 生活的意趣(汪曾祺风雅意趣妙文)
》
售價:HK$
61.6
《
东亚世界形成史论(新版)
》
售價:HK$
107.8
|
編輯推薦: |
本书倡导的是快乐学习,实战就业。在语言描述上力求准确、通俗、易懂,在章节编排上力求循序渐进,在语法阐述时尽量避免术语和公式,从项目开发的实际需求入手,将理论知识与实际应用相结合。目标就是让初学者能够快速成长为初级程序员,并拥有一定的项目开发经验,从而在职场中拥有一个高起点。
|
內容簡介: |
本书以零基础讲解为宗旨,用实例引导读者学习,摒弃了枯燥乏味、层次结构混乱等缺陷,从零开始、由浅入深、层层递进、细致而又详尽地讲解Java这门大型编程语言。 本书知识系统全面,吸取了十多本Java图书及教材的优点,全书共13章,涵盖Java基础、数组、方法、面向对象、异常、多线程、Java基础类库、集合类、IO、GUI、网络编程、Eclipse工具等主流Java语言开发技术。为了使大多数读者都能看懂,本书采用朴实生动的语言来阐述复杂的问题,列举了大量现实生活中的例子进行讲解,真正做到通俗易懂。 本书面向初学者和中等水平的Java开发人员、大专院校及培训学校的老师和学生,是牢固掌握主流Java语言开发技术的必读之作。
|
目錄:
|
第1章Java开发入门
1.1Java概述
1.1.1认识Java
1.1.2Java发展史
1.1.3Java语言的特点
1.2JDK的使用
1.2.1下载JDK
1.2.2安装JDK
1.2.3配置JDK
1.2.4测试开发环境
1.2.5JDK目录介绍
1.3第一个Java程序
1.3.1编写Java源文件
1.3.2编译运行
1.3.3Java虚拟机JVM
1.4Java运行流程
1.5本章小结
1.6习题
第2章Java编程基础
2.1Java的基本语法
2.1.1语句和表达式
2.1.2基本格式
2.1.3注释
2.1.4关键字
2.1.5进制转换
2.2基本数据类型
2.2.1整数类型
2.2.2浮点数类型
2.2.3字符类型
2.2.4布尔类型
2.3变量与常量
2.3.1标识符
2.3.2变量的定义
2.3.3变量的类型转换
2.3.4变量的作用域
2.3.5常量
2.4Java中的运算符
2.4.1算术运算符
2.4.2赋值运算符
2.4.3关系运算符
2.4.4逻辑运算符
2.4.5位运算符
2.4.6运算符的优先级
2.5程序的结构
2.5.1顺序结构
2.5.2选择结构
2.5.3循环结构
2.5.4循环中断
2.6本章小结
2.7习题
第3章数组与方法
3.1数组
3.1.1数组的定义
3.1.2数组的初始化
3.1.3数组的常用操作
3.1.4数组的内存原理
3.1.5二维数组
3.2方法
3.2.1方法的定义
3.2.2方法的调用
3.2.3方法的重载
3.2.4方法的递归
3.3数组的引用传递
3.4本章小结
3.5习题
第4章面向对象上
4.1面向对象的概念
4.2类与对象
4.2.1类的定义
4.2.2对象的创建与使用
4.2.3类的封装
4.3构造方法
4.3.1构造方法的定义
4.3.2构造方法的重载
4.4this关键字
4.5垃圾回收
4.6static关键字
4.6.1静态变量
4.6.2静态方法
4.6.3代码块
4.6.4单例模式
4.7内部类
4.7.1成员内部类
4.7.2静态内部类
4.7.3方法内部类
4.7.4匿名内部类
4.8本章小结
4.9习题
第5章面向对象下
5.1类的继承
5.1.1继承的概念
5.1.2重写父类方法
5.1.3super关键字
5.2final关键字
5.2.1final关键字修饰类
5.2.2final关键字修饰方法
5.2.3final关键字修饰变量
5.3抽象类和接口
5.3.1抽象类
5.3.2接口
5.3.3接口的实现
5.3.4接口的继承
5.3.5抽象类和接口的关系
5.4多态
5.4.1多态的概念
5.4.2对象的类型转换
5.4.3Object类
5.4.4设计模式工厂设计模式
5.4.5设计模式代理设计模式
5.5包
5.5.1包的定义与使用
5.5.2import语句
5.5.3Java的常用包
5.5.4给Java应用程序打包
5.6访问控制
5.7本章小结
5.8习题
第6章异常
6.1异常的概念
6.2异常捕获
6.3在方法中抛出异常
6.3.1使用throws关键字抛出异常
6.3.2使用throw关键字抛出异常
6.4Exception和Runtime Exception
6.5自定义异常
6.6断言
6.7异常的使用原则
6.8本章小结
6.9习题
第7章多线程
7.1线程概述
7.1.1进程
7.1.2线程
7.2线程的创建
7.2.1继承Thread类创建线程
7.2.2实现Runnable接口创建线程
7.2.3使用Callable接口和Future接口创建线程
7.2.4三种实现多线程方式的对比分析
7.3线程的生命周期及状态转换
7.4线程的调度
7.4.1线程的优先级
7.4.2线程休眠
7.4.3线程让步
7.4.4线程插队
7.4.5后台线程
7.5多线程同步
7.5.1线程安全
7.5.2同步代码块
7.5.3同步方法
7.5.4死锁问题
7.6多线程通信
7.7线程组和未处理的异常
7.8线程池
7.9本章小结
7.10习题
第8章Java基础类库
8.1基本类型的包装类
8.2JDK 5.0新特性自动装箱和拆箱
8.3Scanner类
8.4String类、StringBuffer类和StringBuilder类
8.4.1String类的初始化
8.4.2String类的常见操作
8.4.3StringBuffer类
8.4.4StringBuilder类
8.4.5String类对正则表达式的支持
8.5System类与Runtime类
8.5.1System类
8.5.2Runtime类
8.6Math类与Random类
8.6.1Math类
8.6.2Random类
8.7日期操作类
8.7.1Date类
8.7.2Calendar类
8.7.3DateFormat类
8.7.4SimpleDateFormat类
8.8JDK 7.0新特性switch语句支持字符串类型
8.9本章小结
8.10习题
第9章集合类
9.1集合概述
9.2Collection接口
9.3List接口
9.3.1List接口简介
9.3.2ArrayList集合
9.3.3LinkedList实现类
9.3.4Iterator接口
9.3.5JDK5.0新特性foreach循环
9.3.6ListIterator接口
9.3.7Enumeration接口
9.4Set接口
9.4.1Set接口简介
9.4.2HashSet集合
9.4.3TreeSet集合
9.5Queue接口
9.5.1Queue接口简介
9.5.2PriorityQueue实现类
9.5.3Deque接口与ArrayDeque实现类
9.6Map接口
9.6.1Map接口简介
9.6.2HashMap集合
9.6.3LinkedHashMap集合
9.6.4TreeMap集合
9.6.5Properties集合
9.7JDK 5.0新特性泛型
9.7.1为什么使用泛型
9.7.2泛型定义
9.7.3通配符
9.7.4有界类型
9.7.5泛型的限制
9.7.6自定义泛型
9.8Collections工具类
9.9Arrays工具类
9.10集合转换
9.11本章小结
9.12习题
第10章IO(输入输出)
10.1流概述
10.2字节流
10.2.1字节流的概念
10.2.2字节流读写文件
10.2.3文件的复制
10.2.4字节流的缓冲区
10.2.5装饰设计模式
10.2.6字节缓冲流
10.3字符流
10.3.1字符流定义及基本用法
10.3.2字符流操作文件
10.3.3字符流的缓冲区
10.3.4LineNumberReader
10.3.5转换流
10.4其他IO流
10.4.1ObjectInputStream和ObjectOutputStream
10.4.2DataInputStream和DataOutputStream
10.4.3PrintStream
10.4.4标准输入输出流
10.4.5PipedInputStream和PipedOutputStream
10.4.6ByteArrayInputStream和ByteArrayOutputStream
10.4.7CharArrayReader和CharArrayWriter
10.4.8SequenceInputStream
10.5File类
10.5.1File类的常用方法
10.5.2遍历目录下的文件
10.5.3文件过滤
10.5.4删除文件及目录
10.6RandomAccessFile
10.7字符编码
10.7.1常用字符集
10.7.2字符编码和解码
10.7.3字符传输
10.8本章小结
10.9习题
第11章GUI(图形用户界面)
11.1AWT概述
11.2AWT事件处理
11.2.1事件处理机制
11.2.2事件适配器
11.2.3用匿名内部类实现事件处理
11.3常用事件分类
11.3.1窗体事件
11.3.2鼠标事件
11.3.3键盘事件
11.3.4动作事件
11.4布局管理器
11.4.1FlowLayout
11.4.2BorderLayout
11.4.3GridLayout
11.4.4GridBagLayout
11.4.5CardLayout
11.4.6不使用布局管理器
11.5AWT绘图
11.6Swing
11.6.1JFrame
11.6.2JDialog
11.6.3中间容器
11.6.4文本组件
11.6.5按钮组件
11.6.6JComboBox
11.6.7菜单组件
11.6.8创建Tree
11.6.9JTable
11.7本章小结
11.8习题
第12章网络编程
12.1网络通信协议
12.1.1IP地址和端口号
12.1.2InetAddress
12.1.3UDP与TCP协议
12.2UDP通信
12.2.1DatagramPacket
12.2.2DatagramSocket
12.2.3UDP网络程序
12.2.4UDP案例聊天程序
12.3TCP通信
12.3.1ServerSocket
12.3.2Socket
12.3.3简单的TCP网络程序
12.3.4多线程的TCP网络程序
12.3.5TCP案例文件上传
12.4Java Applet
12.5本章小结
12.6习题
第13章Eclipse开发工具
13.1Eclipse概念
13.2Eclipse安装与启动
13.2.1Eclipse工作台
13.2.2Eclipse透视图
13.3使用Eclipse进行程序开发
13.3.1创建Java项目
13.3.2创建类文件
13.3.3编写代码
13.3.4运行程序
13.4Eclipse程序调试
13.5使用Eclipse导出、导入jar文件
13.5.1Eclipse导出jar文件
13.5.2Eclipse导入jar文件
13.6本章小结
13.7习题
|
內容試閱:
|
前言
Foreword
在瞬息万变的IT时代,一群怀揣梦想的人创办了千锋教育,投身到IT培训行业。六年来,一批批有志青年加入千锋教育,为了梦想笃定前行。千锋教育秉承用良心做教育的理念,为培养顶级IT精英而付出一切努力。为什么会有这样的梦想,我们先来听一听用人企业和求职者的心声:现在符合企业需求的IT技术人才非常紧缺,这方面的优秀人才我们会像珍宝一样对待,可为什么至今仍缺少合格的人才?面试的时候,用人企业问能做什么,这个项目如何来实现,需要多长的时间,我们当时都蒙了,回答不上来。这已经是面试过的第十家公司了,如果再不行的话,是不是要考虑转行了。
这已经是参加面试的N个求职者了,为什么都是计算机专业,当问到项目如何实现,怎么连思路都没有呢?
这些心声并不是个别现象,而是社会上的一种普遍现象。当今的世界是知识爆炸的世界,科学技术与信息技术急速发展。但教科书却不能将这些知识内容随时编入,致使教科书的知识内容瞬息之间便会陈旧不实用,以致教材的陈旧性与滞后性尤为突出。高校的IT教育与企业的真实需求存在脱节,如果高校的相关课程仍然不进行更新,毕业生将面临难以就业的困境,很多用人单位表示,高校毕业生表面上知识丰富,但绝大多数在实际工作中用之甚少,甚至完全用不上高校阶段所学的知识。针对上述存在的问题,国务院也作出了关于加快发展现代职业教育的决定。很庆幸,千锋所做的事情就是配合高校达成产学合作。千锋教育致力于打造IT职业教育全产业链人才服务平台,全国数十家分校,数百名讲师团坚持以教学为本的方针,全面采用面对面教学,传授企业实用技能,教学大纲实时紧跟企业需求,拥有全国一体化就业体系。千锋的价值观是做真实的自己,用良心做教育。
针对高校教师的服务:1. 千锋教育基于近六年的教育培训经验,精心设计了包含教材 授课资源 考试系统 测试题 辅助案例的教学资源包,节约教师的备课时间,缓解教师的教学压力,显著提高教学质量。2. 本书配套代码视频,索取网址: http:www.codingke.com。3. 本书配备了千锋教育优秀讲师录制的教学视频,按本书知识结构体系部署到了教学辅助平台(扣丁学堂)上,可以作为教学资源使用,也可以作为备课参考。高校教师如需索要配套教学资源,请关注(扣丁学堂)师资服务平台,扫描下方二维码关注微信公众平台索取。
扣丁学堂
针对高校学生的服务:
1. 学IT有疑问,就找千问千知,它是一个有问必答的IT社区,平台上的专业答疑辅导老师承诺工作时间3小时内答复您在IT学习中遇到的专业问题。读者也可以通过扫描下方的二维码,关注千问千知微信公众平台,浏览其他学习者在学习中分享的问题和收获。2. 学习太枯燥,想了解其他学校的伙伴都是怎样学习的,你可以加入扣丁俱乐部。扣丁俱乐部是千锋教育联合各大校园发起的公益计划,专门面向对IT有兴趣的大学生提供免费的学习资源和问答服务,已有超过30多万名学习者获益。就业难,难就业,千锋教育让就业不再难!
千问千知
关于本书
本书由清华大学出版社技术编审委员会委员、微软全球最有价值专家胡耀文担任主编,本书可作为高等院校本、专科计算机相关专业的Java入门教材,其中包含了千锋教育Java基础全部的课程内容,是一本适合广大计算机编程爱好者的优秀读物。抢红包
本书配套源代码、习题答案的获取方法:添加小千QQ号或微信号2570726663。注意!小千会随时发放助学金红包。致谢本教材由千锋教育高教产品研发团队编写,研发小组成员有胡耀文、孙建超、聂千琳、杨轩、曹秀秀。大家在近一年时间里参阅了大量Java语言图书,通过反复的修改最终完成了这本著作。另外,院校老师李文法、衣俊艳、张蕾、王廷梅等人也参与了教材的部分编写与修订工作,除此之外,千锋教育的500多名学员也参与到了教材的试读工作中,他们站在初学者的角度对教材提供了许多宝贵的修改意见,在此一并表示衷心的感谢。
意见反馈在本书的编写过程中,虽然力求完美,但难免有一些不足之处,欢迎各界专家和读者朋友们给予宝贵意见,联系方式:huyaowen@1000phone.com。
北京千锋互联科技有限公司高教产品研发部
2017年3月于北京
第3章chapter3
数组与方法
本章学习目标 了解Java数组的定义 掌握Java数组的常用操作 理解Java二维数组 掌握Java的方法定义与调用 掌握Java方法重载与递归 理解Java数组的引用传递在开发过程中需要定义多个相同类型的变量时,使用数组是一个很好的选择。例如,要存储80名学生的成绩,在没有数组之前,就需要定义80个变量,很明显这个定义的过程相当琐碎,耗费时间和精力,于是Java语言提供了数组来存储相同类型的数据,这样要存储80名学生的成绩,只需一个数组就可以了。当遇到有些代码需要反复使用的情况时,可以将代码声明成一个方法,以供程序反复调用。
3.1数组数组是一种数据结构,是按一定顺序排列的相同类型的元素集合。数组实际上就是一连串类型相同的变量,这些变量用一个名字命名,即数组名,并用索引区分它们。使用数组时,可以通过索引来访问数组元素,如数组元素的赋值和取值。3.1.1数组的定义在Java中数组是相同类型元素的集合,可以存放上千万个数据,在一个数组中,数组元素的类型是唯一的,即一个数组中只能存储同一种数据类型的数据,而不能存储多种数据类型的数据,数组一旦定义好就不可以修改长度,因为数组在内存中所占的大小是固定的,所以数组的长度不能改变,如果要修改就必须重新定义一个新数组或者引用其他的数组,因此数组的灵活性较差。数组是可以保存一组数据的一种数据结构,它本身也会占用一个内存地址,因此数组是引用类型。定义数组的语法格式如下:
数据类型[] 数组名;
对于数组的声明也可用另外一种形式,其语法格式如下:
数据类型 数组名[];
上述两种不同语法格式声明的数组中,[ ]是一维数组的标识,从语法格式可见,它既可放置在数组名前面,也可以放在数组名后面。面向对象程序设计更侧重放在前面,保留放在后面是为了迎合C程序员的使用习惯,在这里推荐使用第一种格式。下面演示不同数据类型的数组声明,具体示例如下:
int[] a; 声明一个int类型的数组
double b[]; 声明一个double类型的数组
上述示例中声明了一个int类型的数组a与一个double类型的数组b,数组名是用来统一这组相同数据类型的元素名称,数组名的命名规则和变量相同。3.1.2数组的初始化在Java程序开发中,使用数组之前都会对其进行初始化,这是因为数组是引用类型,声明数组只是声明了一个引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使用该数组变量来访问数组元素。所谓数组初始化,就是让数组名指向数组对象的过程,该过程主要分为两个步骤: 一是对数组对象进行初始化,即为数组中的元素分配内存空间和赋值; 二是对数组名进行初始化,即将数组名赋值为数组对象的引用。通过两种方式可对数组进行初始化,即静态初始化和动态初始化,下面演示这两种方式的具体语法。1. 静态初始化静态初始化是指由程序员在初始化数组时为数组每个元素赋值,由系统决定数组的长度。数组的静态初始化有两种方式,具体示例如下:
int[] array; 声明一个int类型的数组
array = new int[]{1,2,3,4,5}; 静态初始化数组
int[] array = new int[]{1,2,3,4,5}; 声明并初始化数组
对于数组的静态初始化也可简写,具体示例如下:
int[] array = {1,2,3,4,5}; 声明并初始化一个int类型的数组
上述示例中静态初始化了数组,其中大括号包含数组元素值,元素值之间用逗号,分隔。此处注意,只有在定义数组的同时执行数组初始化才支持使用简化的静态初始化。2. 动态初始化动态初始化是指由程序员在初始化数组时指定数组的长度,由系统为数组元素分配初始值。数组动态初始化的具体示例如下:
int[] array = new int[10]; 动态初始化数组
上述示例会在数组声明的同时分配一块内存空间供该数组使用,其中数组长度是10,由于每个元素都为int型数据类型,因此上例中数组占用的内存共有104=40个字节。此外,动态初始化数组时,其元素会根据它的数据类型被设置为默认的初始值。本例数组中每个元素的默认值为0,其他常见的数据类型默认值如表3.1所示。
表3.1数据类型默认值表
成员变量类型初始值成员变量类型初始值
byte0double0.0Dshort0char空字符,''\u0000''int0booleanfalselong0L引用数据类型nullfloat0.0F3.1.3数组的常用操作1. 访问数组在Java中,数组对象有一个length属性,用于表示数组的长度,所有类型的数组都是如此。获取数组长度的语法格式如下:
数组名.length
接下来用length属性获取数组的长度,具体示例如下:
int[] list = new int[10]; 定义一个int类型的数组
int size = list.length; size = 10,数组的长度
数组中的变量又称为元素,考虑到一个数组中的元素可能会很多,为了便于区分它们,每个元素都有下标索引,下标从0开始,如在int[] list = new int[10]中,list[0]是第1个元素,list[1]是第2个元素,,list[9]是第10个元素,也就是最后一个元素。因此,假如数组list有n个元素,那么list[0]是第一个元素,而list[n1]则是最后一个元素。如果下标值小于0,或者大于等于数组长度,编译程序不会报任何错误,但运行时将出现异常: ArrayIndexOutOfBoundsException : N,即数组下标越界异常,N表示试图访问的数组下标。2. 数组遍历数组的遍历是指依次访问数组中的每个元素。接下来演示循环遍历数组,如例31所示。例31TestArrayTraversal.java
1public class TestArrayTraversal {
2public static void mainString[] args {
3int[] list = {1, 2, 3, 4, 5}; 定义数组
4for int i = 0; i max { 依次判断后面元素值是否比max大
10max = score[i]; 如果大,则修改max的值
11}
12if score[i] array[j 1] {
12 交换元素
13int tmp = array[j];
14array[j] = array[j 1];
15array[j 1] = tmp;
16}
17}
18 打印每轮排序结果
19System.out.print"第" i 1 "轮排序: ";
20for int j=0; j 100 {
13System.out.println"成绩输入错误!";
14return;
15}
16if score = 90.0 {
17System.out.println''A'';
18} else if score = 80.0 {
19System.out.println''B'';
20} else if score = 70.0 {
21System.out.println''C'';
22} else if score = 60.0 {
23System.out.println''D'';
24} else {
25System.out.println''F'';
26}
27}
28 带返回值的方法
29public static char getGradedouble score {
30if score = 90.0 {
31return ''A'';
32} else if score = 80.0 {
33return ''B'';
34} else if score = 70.0 {
35return ''C'';
36} else if score = 60.0 {
37return ''D'';
38} else {
39return ''F'';
40}
41}
42}
程序的运行结果如图3.17所示。
图3.17例37运行结果
在例37中,定义了两个方法printGrade和getGrade,其中printGrade方法是用void修饰的,不返回任何值。而getGrade方法有返回值。用void修饰的方法不需要return语句,但它能用于终止方法返回到方法的调用者,控制程序的流程。当成绩不在0~100之间,调用printGrad方法,程序将打印成绩输入错误!,执行return语句后,它后面的语句将不再执行,程序直接返回到调用者。3.2.2方法的调用方法在调用时执行方法中的代码,因此要执行方法,必须调用方法。如果方法有返回值,通常将方法调用作为一个值来处理。如果方法没有返回值,方法调用必须是一条语句。具体示例如下:
int large = max3, 4; 将方法的返回值赋给变量
System.out.printlnmax3,4; 直接打印方法的返回值
System.out.println"Hello World!"; println方法没有返回值,必须是语句
如果方法定义中包含形参,调用时必须提供实参。实参的类型必须与形参的类型兼容,实参顺序必须与形参的顺序一致。实参的值传递给方法的形参,称为值传递pass by value,方法内部对形参的修改不影响实参值。当调用方法时,程序控制权转移至被调用的方法。当执行return语句或到达方法结尾时,程序控制权转移至调用者。如例38所示。例38TestCallMethod.java
1public class TestCallMethod {
2public static void mainString[] args {
3int n = 5;
4int m =2;
5System.out.println"before main\t: n="n ", m=" m;
6swapn, m;
7System.out.println"end main\t: n="n ", m=" m;
8}
9 交换两个数
10public static void swapint n, int m {
11System.out.println"before swap\t: n="n ", m=" m;
12int tmp = n;
13n = m;
14m = tmp;
15System.out.println"end swap\t: n="n ", m=" m;
16}
17}
程序的运行结果如图3.18所示。
图3.18例38运行结果
在例38中,当调用swap方法时,程序将实参n、m的值传递给形参的n、m,然后程序将控制流程转向swap方法,执行swap方法时,交换形参n和m的值,当swap方法执行完毕时,系统释放形参并将控制权返还给它的调用者main方法。因此,swap方法不能交换实参n和m的值。每当调用一个方法时,JVM将创建一个栈帧,用于保存该方法的形参和变量。当方法调用结束返回到调用者时,JVM释放相应的栈帧。每一个方法从调用开始到执行完成的过程,就对应着一个栈帧在JVM中从入栈到出栈的过程。接下来演示堆栈中调用方法的栈帧,如图3.19所示。
图3.19栈帧
在图3.19中,main方法调用swap方法时,调用者main方法的栈帧不变,程序先将为swap方法创建一个新的栈帧,用于保存形参n、m和局部变量tmp的值,再将实参值传递给形参,并保存在该栈帧中,方法内部操作的都是该方法栈帧中的值。当swap方法执行结束时,其对应的栈帧将被释放。3.2.3方法的重载方法重载overloading是指方法名称相同,但形参列表不同的方法。调用重载的方法时,Java编译器会根据实参列表寻找最匹配的方法进行调用。如例39所示。例39TestOverload.java
1public class TestOverload {
2public static void mainString[] args {
3 调用maxint, int方法
4System.out.println"3和8的最大值: " max3, 8;
5 调用maxdouble, double方法
6System.out.println"3.0和8.0的最大值: " max3.0, 8.0;
7 调用maxdouble, double, double方法
8System.out.println"3.0、5.0和8.0的最大值: " max3.0, 5.0, 8.0;
9 调用maxdouble, double方法
10System.out.println"3和8.0的最大值: " max3, 8.0;
11}
12 返回两个整数的最大值
13public static int maxint num1, int num2 {
14int result;
15if num1 num2
16result = num1;
17else
18result = num2;
19return result;
20}
21 返回两个浮点数的最大值
22public static double maxdouble num1, double num2 {
23double result;
24if num1 num2
25result = num1;
26else
27result = num2;
28return result;
29}
30 返回三个浮点数的最大值
31public static double maxdouble num1, double num2, double num3 {
32return maxmaxnum1, num2, num3;
33}
34}
程序的运行结果如图3.20所示。
图3.20例39运行结果
在图3.20中,从程序运行结果结果可发现,max3, 8调用的是maxint, int方法,max3.0, 8.0调用的是maxdouble, double方法,max3.0, 5.0, 8.0调用的是maxdouble, double, double方法。而且max3, 8.0也能被执行,实参3被自动转换为double类型,然后调用maxdouble, double方法。为什么max3, 8不会调用maxdouble, double方法呢?其实,maxdouble, double和maxint, int与max3, 8都可能匹配。当调用方法时,Java编译器会根据实参的个数和类型寻找最准确的方法进行调用。因为maxint, int比maxdouble, double更精确,所以max3, 8会调用maxint, int。调用一个方法时,若出现两个或多个可能的匹配,编译器无法判断哪个是最精确的匹配,则会产生编译错误,这称为歧义调用ambiguous invocation。如例310所示。例310TestAmbiguousInvocation.java
1public class TestAmbiguousInvocation {
2public static void mainString[] args {
3System.out.printlnmax3, 8;
4}
5 返回整数和浮点数的最大值
6public static double maxint num1, double num2 {
7if num1 num2
8return num1;
9else
10return num2;
11}
12 返回浮点数和整数的最大值
13public static double maxdouble num1, int num2 {
14if num1 num2
15return num1;
16else
17return num2;
18}
19}
程序的编译结果如图3.21所示。
图3.21例310编译结果
在图3.21中,程序编译错误并提示对max的引用不明确,原因在于maxint, double和maxdouble, int与max3, 8都匹配,从而产生歧义,导致编译错误。方法只能根据参数列表参数类型、参数顺序和参数个数进行重载,而不能通过修饰符或返回值来重载。3.2.4方法的递归方法的递归是指一个方法直接或间接调用自身的行为,递归必须要有结束条件,否则会无限地递归。递归用于解决使用简单循环难以实现的问题。如例311所示。例311TestRecursion.java
1public class TestRecursion {
2public static void mainString[] args {
3System.out.println"4的阶乘: "fact4;
4}
5*
6计算阶乘
7阶乘计算公式:
80!=1
9n! = n * n-1!; n0
10*
11public static long factint n {
12 结束条件
13if n ==0
14return 1;
15return n * factn - 1;
16}
17}
程序的运行结果如图3.22所示。
图3.22例311运行结果
在例311中,定义了fact方法用于计算阶乘,方法是将数学上的阶乘公式转换为代码。当用n=0调用该方法时,程序立即返回结果,这种简单情况称为结束条件,如果没有终止条件,就会出现无限递归。当用n0调用该方法时,就将这个原始问题分解成计算n-1的阶乘的子问题,持续分解,直到问题达到最终条件为止,就将结果返回给调用者。然后调用者进行计算并将结果返回给它自己的调用者,过程持续进行,直到结果返回原始调用者为止。原始问题的解就可以通过将factn-1的结果乘以n得到。调用过程称为递归调用,如图3.23所示。
图3.23递归原理
在图3.23中,描述了例311中的递归调用过程,整个递归过程中fact方法被调用了5次,每次调用n的值都会递减,当n的值为0时,所有递归调用的方法都会以相反的顺序相继结束,所有的返回值会进行累乘,最终得到结果24。3.3数组的引用传递在方法调用时,参数按值传递,即用实参的值去初始化形参。对于基本数据类型,形参和实参是两个不同的存储单元,因此方法执行中形参的改变不影响实参的值; 对于引用数据类型,形参和实参存储的是引用内存地址,都指向同一内存单元,在方法执行中,对形参的操作实际上就是对实参数的操作,即对执行内存单元的操作,因此,方法执行中形参的改变会影响实参。向方法传递数组时,方法的接收参数必须是符合其类型的数组; 从方法返回数组时,返回值类型必须明确的声明其返回的数组类型。数组属于引用类型,所以在执行方法中对数组的任何操作,结果都将保存下来。如例312所示。例312TestRefArray.java
1public class TestRefArray {
2public static void mainString[] args {
3int[] array = {1, 3, 5};
4revarray; 将数组元素反序
5System.out.print"数组的反序: ";
6printArrayarray; 打印反序后的数组
7int[] copy = copyarray; 复制数组
8array[0] = 9; 修改源数组
9System.out.print"修改源数组: ";
10printArrayarray; 打印源数组
11System.out.print"复制的数组: ";
12printArraycopy; 打印复制数组
13}
14 将数组元素反序
15public static void revint[] pa {
16for int i = 0, j = pa.length-1; i B. a[10]=2;C. a[0]=5*2;D. a[1]=a[2]*a[0];2 数组对象在Java中存储在中。A. 栈B. 队列C. 堆D. 链表3 方法的是指一个方法直接或间接调用自身的行为。A. 传递B. 递归C. 访问 D. 方法4 数组a的第三个元素表示为。A. a[2]B. a3C. a2D. a[3]5 关于数组作为方法的参数时,向方法传递的是。A. 数组的元素 B. 数组的引用C. 数组的栈地址D. 数组自身3. 思考题1 什么时候为数组分配内存?2 数组一旦被创建,大小能不能改变?3 实参是如何传递给方法的?4 什么是方法的重载?4. 编程题1 编写方法返回两个整数的最大公约数和最小公倍数。2 编写程序计算字符数组中每个字符出现的次数。
|
|