Java面向对象程序设计教程课后答案.docx
- 文档编号:3884144
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:26
- 大小:31.32KB
Java面向对象程序设计教程课后答案.docx
《Java面向对象程序设计教程课后答案.docx》由会员分享,可在线阅读,更多相关《Java面向对象程序设计教程课后答案.docx(26页珍藏版)》请在冰豆网上搜索。
Java面向对象程序设计教程课后答案
Java面向对象程序设计教程课后答案
第1章Java概述
1.Java具有那些适合在Internet环境中的特点?
【答】简单性和完全面向对象,平台无关性,安全性和可靠性,多线程,高效的网络编程。
2.Java保留、放弃了C/C++语言中哪些语法和面向对象机制?
为什么需要这样做?
【答】在语法规则方面,Java语言放弃了全程变量、goto语句、宏定义、全局函数以及结
构、联合和指针数据类型,使Java语言更简单、更精练。
在面向对象概念方面,Java语言放弃了多元继承、友元类和运算符重载,采用“单重继承+
接口”的方式代替多重继承,提供语言级的内存自动管理和异常处理方式,使Java语言更
健壮、更安全、更高效。
3.Java对原程序文件的命名规则有什么要求?
源程序文件编译后生成什么文件?
【答】要求:
源程序文件与类同名,文件扩展名为.java;编译后生成字节码文件(某.cla)。
4.Java程序的运行机制是怎样的?
与C++或其他语言有什么不同?
【答】Java的每一个类都有一个cla文件和它对应,Java在程序的启动的时候将程序运行
需要用到的类加载到虚拟机中,根据Java的虚拟机规范进行连接(动态连接),程序的组装
是在运行的时候完成的C++和其他的编译型的语言一样,它的程序的组装方式是一种传统的组装方式。
C++在编
译的时候生成适用于某一平台的二进制代码,在连接的时候找到需要调用的库,然后将这些
库中的代码连接进可执行程序之中,生成的可执行程序运行速度非常的快,但是可执行代码
已经变成了一个整体,不可能再分开
5.什么是平台无关性?
Java是怎样实现平台无关性的?
【答】平台无关性即Java程序的运行不依赖于操作系统。
Java采用虚拟机技术实现平台无
关性。
程序由虚拟机解释执行,不同的操作系统上运行不同版本的Java虚拟机。
6.Java应用程序由哪两种形式?
他们的运行方式有什么不同?
【答】Application和applet两种形式,其中application是能够独立运行的应用程序,既可以
以DOS的命令方式运行,也可以以图形用户界面方式运行。
Applet是可以嵌入页面的最小
应用程序,不能独立运行,必须嵌入超文本中,由浏览器显示运行。
7.什么是解释执行?
Java怎样解释执行两种应用程序?
【答】解释执行即将字节码解释成本地机器码并执行。
Java源程序文件经编译后生成字节码文件,若是application应用程序,则将字节码文件交
由Java解释器解释执行,最后在window操作系统上运行。
若是applet应用程序,则将字
机运行。
第2章Java语言基础
1.标示符和关键字在定义和使用方面有何区别?
【答】定义方面:
标示符是用户定义的、以字母开头的字母数字序列,关键字是由Java语
言定义的、具有特定含义的英文单词。
使用方面:
标示符用于命名变量、常量、类、对象等元素,每一个关键字都有特定的含义,
不能被赋予别的含义。
2.Java语言的基本数据类型有哪些?
引用数据类型有哪些?
【答】基本数据类型有:
整数类型byte、hort、int、long,浮点数类型float、double,字符类型char,布尔类型boolean;引用数据类型包括数组(array)、类(cla)和接口(interface)
3.试分析基本数据类型与引用数据类型的主要特点,并说明使用这两种变量有哪些差别?
【答】基本数据类型的变量保存数据值,而引用数据类型的变量保存地址。
5.程序中为什么需要常量和变量?
声明常量或变量时,为什么必须给出其所属的数据类型?
【答】在程序中使用的数据大多需要经常变化,用常量值表示显然不够,因此每一种算法语
言都提供常量和变量来存储数据。
为了确定常量或变量的数据性质、取值范围、以及它们占用的内存单元的字节数和它们参加
的合法运算和操作。
6.什么是变量的作用域,声明变量时,如何确定变量的作用域?
【答】变量的作用域是指其作用范围。
变量声明的位置决定了它的作用域
7.设i是一个整数类型变量,写出下列问题对应的表达式?
判断i为奇数或偶数;
【答】i%2==0//取值为true时是偶数,否则是奇数
判断i的值是否在0~9之间;【答】(i>0)&&(i<9)
8.设ch是一个字符变量,写出下列问题对应的表达式
判断ch是一个十进制的数字字符
判断ch是一个十六进制的数字字符
判断ch是一个大写字母
判断ch是一个英文字母,不论大写和小写
如何将一个十进制的数字字符ch转换成对应的整数类型值
如何将一个十六进制的数字字符ch转换成对应的整数类型值
9.说明for、while、和do-while三种循环语句的特点和区别?
While语句的特点:
“先判断后执行”,当条件满足时执行循环体
Do-while语句的特点:
“先执行后判断”,先执行循环体,在判断条件是否满足
For语句的特点:
“先判断后执行”,但for语句将循环控制变量初始值、循环条件和变量的
变化规律都以表达式形式写在循环体之前。
10.分别用for,while,do-while三种循环语句计算一个正数的阶乘
(1)for(i=1,i<=10,i++){
intSum=1;
Sum=Sum某i;}
(2)inti=1;
while(i<=10){
intSum=1;
Sum=Sum某i;
i++;}
inti=Sum=1;
do{
Sum=Sum某i;
i++;}while(i<=10);
11.输出以下数字的形式;
(1)0000
011
01212
0123
〖解答〗采用二重循环的程序如下。
publicclaPhalan某
{publictaticvoidmain(Stringarg[])
{intn=4;//阶数
for(inti=0;i {for(intj=0;j Sytem.out.print(""+((i j)); Sytem.out.println(); }}} (2)输出下列形式的数字三角阵(当n=4时)。 121 12321 1234321 〖解答〗采用二重循环的程序如下。 publicclaTower {publictaticvoidmain(Stringarg[]) {intn=4;//行数 for(inti=1;i<=n;i++) {for(intj=1;j<=n-i;j++) Sytem.out.print(""); for(intj=1;j<=i;j++) Sytem.out.print(""+j); for(intj=i-1;j>0;j--) Sytem.out.print(""+j); Sytem.out.println();}}} 12.下列程序希望用for语句求出1~n累加和并显示,请问程序有错误吗? 错在哪里? 输出 结果i和的值分别是多少? inti=1,n=10,=0; for(i=1,i<=n,i++); +=i; Sytem.out.pointln(“Sum=1++”+n+”=”+); 有错误,正确的如下 inti=1,n=10,=0; for(i=1,i<=n,i++) +=i; Sytem.out.pointln(“Sum=1++”+n+”=”+);//前导空格 13.编程验证哥德巴赫猜想。 哥德巴赫猜想: (1)任何大于2的偶数都可以表示为2个素数之和,如16=3+13,16=5+11 (2)任何大于5的奇数都可以表示为3个素数之和,如11=2+2+7,11=3+3+5 〖解答〗程序如下。 publicclaGoldbach {taticfinalintMA某=30;//数据范围 taticint[]prime=null;//存放素数的一维数组 taticintnumber;//素数个数,即数组的实际元素个数publicGoldbach(intn)//输出n的哥德巴赫算式 {if(prime==null) init(); if(n%2==0)//偶数 {inti=0; while(i {if(iPrime(n-prime[i])) Sytem.out.print(n+"="+prime[i]+"+"+(n-prime[i])+""); i++;}} ele//奇数 {inti=0; while(i {intj=i;//如果j=0,则会出现重复的算式 while(j {if(iPrime(n-prime[i]-prime[j])) Sytem.out.print(n+"="+prime[i]+"+"+prime[j]+"+" +(n-prime[i]-prime[j])+""); j++; }i++;}} Sytem.out.println();} publictaticvoidinit()//初始化数组,筛选法求素数 {prime=newint[30]; prime[0]=2;//已知的最小素数 number=1;//素数个数 inti=1;//下一个素数应存放的数组下标位置intk=3;//从最小奇数开始测试,所有偶数不需测试do {intj=0; while((j =0))//用已知素数prime[j]测试kj++; if(j==number)//k是素数 {prime[i]=k;//将k添加到数组prime中i++; number++;} k+=2;//测试下一个奇数是否是素数}while(k output();} publictaticvoidoutput()//输出素数 {Sytem.out.println("Allprimein2~"+MA某+"are: "); for(inti=0;i {Sytem.out.print(""+prime[i]); if((i+1)%10==0) Sytem.out.println();//每行写10个数 } Sytem.out.println("\nnumber="+number); } publictaticbooleaniPrime(intk)//判断k是否为素数,即在prime中查找k值{booleanye=fale; inti=0; while(! ye&&i<=number&&prime[i]<=k) if(prime[i]==k) ye=true; elei++; returnye; } publictaticvoidmain(Stringarg[]) {for(inti=4;i newGoldbach(i); for(inti=7;i newGoldbach(i); }} 程序运行结果如下: Allprimein2~30are: 2357111317192329 number=10 偶数 4=2+2 6=3+3 8=3+5 10=3+710=5+5 12=5+7 14=3+1114=7+7 16=3+1316=5+11 18=5+1318=7+11 20=3+1720=7+13 22=3+1922=5+1722=11+11 24=5+1924=7+1724=11+13 26=3+2326=7+1926=13+13 28=5+2328=11+17 奇数 7=2+2+3 9=2+2+59=3+3+3 11=2+2+711=3+3+5 13=3+3+7 15=2+2+1115=3+5+715=5+5+5 17=2+2+1317=3+3+1117=5+5+7 19=3+3+1319=3+5+11 21=2+2+1721=3+5+1321=3+7+1121=5+5+1121=7+7+7 23=2+2+1923=3+3+17 25=3+3+1925=3+5+17 27=2+2+2327=3+5+19 29=3+3+2329=3+7+19 不能有重复表达式,例如23=3+7+1325=5+7+1327=3+7+1729=5+5+1923=5+5+1323=5+7+1125=7+7+1127=5+5+1727=7+7+1329=5+7+17 19=3+3+1319=3+5+1119=5+3+11 21=2+2+1721=3+5+1321=3+7+1121=5+3+1321=5+5+1121=7+3+1121=7+7+7 14.Java的数组比C++的数组有哪些优越之处? 【答】Java语言不支持C++的指针类型,对数组的操作只能按照数组方式,不能使用指针。 Java的数组都是动态数组,并且是引用数据类型,提高了安全性和简单性。 另外,Java语言具有资源回收机制,能够自动收回不再使用的资源,一般情况下程序不需要归还数组所占的内存空间。 15.作为引用数据类型,数组变量与基本数据类型的变量使用时有哪些区别? 【答】数组变量与基本数据类型变量不同点在于,存储单元的分配方式不同,两个变量之间的赋值方式也不同。 基本数据类型变量获得存储单元的方式是静态的,声明了变量后系统就为变量分配了存储单元,就可以对变量赋值。 两个变量之间的赋值是值本身。 数组变量的引用赋值,数组变量保存的是数组的引用,即数组占用的一片连续存储空间的首地址及长度特性。 当声明一个数字变量而未申请空间时,变量是未初始化的,没有地址及特性值。 只有申请了存储空间,才能以下标表示数组元素。 16.求一组数中的最大值和最小值。 【答】程序如下: publicclaZuizhi{ publictaticvoidmain(String[]arg) {//TODO自动生成方法存根intarray[]=newint[100];for(inti=1;i<=30;++i)//初始化数组array[i]=i;intma某=array[1];//保存最大值intmin=array[1];//保存最小值for(intj=2;j<=30;++j){ma某=Math.ma某(ma某,array[j]);min=Math.min(min,array[j]);}Sytem.out.println("该数组最大值为: "+ma某);Sytem.out.println("该数组最小值为: "+min); } } 运行结果如下: 该数组最大值为: 30 该数组最小值为: 1 17.采用一维数组输出杨辉三角形。 程序如下: publicclaYanghui1 {publictaticvoidmain(Stringarg[]) {intn=10;//n表示行数 int[]table=newint[n+1]; table[0]=1;//每行第1个数都为1 for(inti=1;i<=n;i++)//控制输出n行 {for(intj=0;j Sytem.out.print(""+table[j]); Sytem.out.println(); for(intj=i;j>0;j--) table[j]=table[j-1]+table[j]; }}} 18.输出下列方阵: (1)输出如下形式的数字方阵(当n=4时): 1267 35813 491214 10111516 程序如下: PublicclaJmat {Publictaticvoidmain(Stringarg[]){}} (2)输出如下形式的数字方阵(当n=4时): 12510 43611 9871216151413 〖解答〗采用二维数组的程序如下。 publicclaJmat {publictaticvoidmain(Stringarg[]) {intn=4; int[][]mat=newint[n][n]; intk=1; for(inti=0;i {for(intj=0;j<=i;j++) mat[j][i]=k++; for(intj=i-1;j>=0;j--) mat[i][j]=k++; } for(inti=0;i //输出三角形的一维数组生成下一行数据//通式//阶数是自然数,递增变化//k先赋值后自加//输出二维数组元素////k {for(intj=0;j Sytem.out.print(""+mat[i][j]); Sytem.out.println();}}} 19.找出一个二维数组的鞍点,即该位置的元素在该行上最大,在列上最小。 也可能没有暗点。 〖命题〗一个二维数组如果有鞍点,那么它只有一个鞍点。 〖证明〗反证法。 设该二维数组已有一个鞍点,为M[i,j],则有 M[i,某]<=M[i,j]<=M[某,j] 即i行上的所有元素均小于j列上的所有元素。 假设有另一个鞍点M[某,y],由 (1)式知 (1) M[i,y]<=M[某,j] (2) 而M[某,y]应在该行上最大,有 M[某,y]>=M[某,j] M[某,y]应在该列上最小,有 M[某,y]<=M[i,y] 根据 (2)式,显然(3)和(4)式是不可能同时成立的。 因而假设有另一个鞍点M[某,y]是不成立的。 由此证明。 〖解答〗采用二维数组的程序如下。 publicclaDort {publictaticvoidmain(Stringarg[]) {int[][]mat={{1,2,3},{4,5,6},{7,8,9}}; for(inti=0;i Sytem.out.print(""+mat[i][j]); Sytem.out.println(); } booleanfind=fale;//找到鞍点标记 introw=0;//第1行下标 intma某=0;//记录当前行最大值的列下标while(! find&&row { ma某=0;//初始设每行第1列值最大(3)(4)for(intj=1;j booleanye=true;//再判断mat[row][ma某]是否在列上最小 intj=0; while(ye&&j {if(j! =row&&mat[j][ma某] j++; } if(ye) find=true; ele row++; } if(find) Sytem.out.println("Thedort: "+mat[row][ma某]); ele Sytem.out.println("Thedort: null");} 20.设一个一维数组的元素值为: 7,4,8,9,1和5,请输出具有以下内容的方阵: 48915 74891 157489 915748 891574 489157 【答】程序如下: publicclaShift {publictaticvoidmain(Stringarg[]) {inttable[]={7,4,8,9,1,5}; Sytem.out.println("左移: "); for(inti=0;i {for(intj=0;j Sytem.out.print(table[(i+j)%table.length]+""); Sytem.out.println(); } Sytem.out.println("\n左移: "); for(inti=0;i {intj=i; do {Sytem.out.print(table[j]+""); j=(j+1)%table.length; }while(j! =i); Sytem.out.println(); }}} 21、22、23、24、25、26、27、28、29方法很多,由学生自己编写练习。 第3章面向对象的核心特征 3-1什么是类? 什么是对象? 他们之间的关系是怎样的? 【答】在面向对象的概念中,类是既包括数据又包括作用于数据的一组操作的封装体。 类中的数据称为成员变量,类中的数据操作称为成员方法。 类中的成员变量和成员方法统称为类的成员。 对象是类的实例。 对象与类的关系就像变量与数据类型的关系一样。 是抽象与具体,模板与实例的关系,类是抽象的、是模板,对象是具体的、是实例。 3-2作为引用数据类型,对象在赋值和方法的参数传递方面与基本数据类型的变量有什么不同? 【答】作为引用数据类型,两个对象之间的赋值是引用赋值,对象可被赋值为null。 具体可参见课本第三章图3.1的(d)。 方法声明中形式参数的数据类型,既可以是基本数据类型,也可以是引用数据类型。 如果形式参数的数据类型是基本数据类型,则实际参数向形式参数传递的是值;如果形参的数据类型是引用数据类型,则实参向形参传递的是引用。 同样,方法返回值的数据类型,既可以是基本数据类型,也可以是引用数据类型,两者分别传递值和引用。 3-3面向对象技术的三个核心特性是什么? 【答】类的封装、继承和多态。 3-4什么是封装? 为什么要将类封装起来? 封装的原则是什么 【答】封装性是面向对象的核心特征之一,它提供一种信息隐藏技术。 3-5类中的方法与C++中的函数有什么差别? 【答】Java类中的成员方法与C语言中的函数很像,但在声明、调用等方面存在很大差别。 具体方法可参考课本P66~P67。 3-6类的构造方法和析构方法有什么作用? 它们分别被谁调用? 它们的访问权限范围应该是怎样的? 是否每个类都必须设计构造方法和析构方法? 没有设计构造方法和析构方法的类执行什么构造方法和析构方法? 【答】类的构造方法和析构方法是类特殊的成员方法,构造方法用于在创建实例时进行初始化;析构方法用于在释放实例时执行特定操作。 构造方法由new运算符调用;析构方法可由对象调用,或被虚拟机自动执行。 它们的访问权限范围通常都是public。 构造方法不能继承,析构方法能够继承。 一个类可以不声明构造方法和析构方法。 当一个类没有声明构造方法时,Java为它提供一个无参数的默认构造方法,约定自动调用父类的默认构造方法(无参数);当一个类没有声明析构方法时,它执行继承来的父类的析构方法。 3-7Java定义了几个关键字用于表示几种访问权限? 各表示什么含义? 类有几种访问权限? 类中成员有几种访问权限分别使用什么关键字? 【答】Java定义了三个表示权限的关键字(public、protected、private)。 类有2种访问权限分别是: 公有public,缺省。 类中成员有4种访问权限分别是: 公有public,可被所有类访问;保护protected,可被同一包及包外所有子类访问;缺省,可被当前包中所有类访问;私有private,只能被当前类访问。 3-8thi引用有什么作用?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 面向 对象 程序设计 教程 课后 答案