java设有4位java正整数正则表达式,其各个位数和的3次方等于这个数本身,求这样的4位数都是多少

Java实验二 求一个整数各位数的和_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Java实验二 求一个整数各位数的和
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢java编程练习题_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
java编程练习题
&&java编程练习题
你可能喜欢扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
在所有的四位数中,各个数位上的数字之和等于34.这样的数一共有多少个?
作业帮用户
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
在所有的四位数中,各个数位上的数字之和等于34的数有多少个?4个数字之和是34,只有9+9+9+7=34,9+9+8+8=34,不同的数字放在不同位是组成的四位数不同,考虑顺序.99,,98,答:有10个
为您推荐:
其他类似问题
,,,,,
千位必须大于等于789 79 98 9988 所以总共10个
扫描下载二维码当前位置: >>
JAVA各章习题及答案
面向对象程序设计―Java 语言习题答案第1章一、选择题 1.下列选项中,不属于 Java 语言特点的一项是( C ) 。 (A)分布式 (B)安全性 (C)编译执行 (D)面向对象 【解析】Java 程序采用解释执行的方法。在系统编译运行 Java 程序时,Java 编译器将 Java 程序转化为字节码,在运行时,解释器将编译得到的字节码进行解释执行。 2.在 Java 语言中, C )是最基本的元素? ( (A)方法 (B)包 (C)对象 (D)接口 【解析】构成 Java 程序的基本元素类(抽象的对象) 。 3.编译一个定义了 3 个类和 10 个方法的 Java 源文件后,会产生( D )个字节码文件?扩 展名是( D )? (A)13 个字节码文件,扩展名为.class (B)1 个字节码文件,扩展名为.class (C)3 个字节码文件,扩展名为.java (D)3 个字节码文件,扩展名为.class 【解析】源文件中的每一个类编译后都会生成一个字节码文件,字节码文件的扩展名 是.class。 4.在创建 Applet 应用程序时,需要用户考虑问题是( B ) 。 (A)窗口如何创建 (B)绘制的图形在窗口中的位置 (C)程序的框架 (D)事件处理 【解析】创建 Applet 程序时必须继承系统类 Applet,而 Applet 类中已经包含了如何创 建窗口以及事件处理等内容, 这类程序的框架也都是固定的, 而绘制图形在窗口中的位置则 需要由用户确定。 5.Java 语言属于( B )种语言? (A)面向机器的语言 (B)面向对象的语言 (C)面向过程的语言 (D)面向操作系统的语言 【解析】Java 语言是一种纯面向对象的语言。 6.下列关于 Application 和 Applet 程序的说法中不正确的一项是( B ) 。 (A)Application 使用解释器 java.exe (B)Application 不使用独立的解释器 (C)Applet 在浏览器中运行 (D)Applet 必须继承 Java 的 Applet 类 【解析】Application 程序包含 main()方法,它是一种独立执行的程序,因此必须使用独 立的解释器解释执行。 7.下列选项中,不属于 Java 核心包的一项是( A ) 。 (A)javax.swing (B)java.io (C)java.utile (D)java.lang 【解析】凡是以 java 开头的包都是 Java 核心包,以 javax 开头的包则属于 Java 扩展包。 8.下列描述中,不正确的是( A ) 。 (A)不支持多线程 (B)一个 Java 源文件不允许有多个公共类1 (C)Java 通过接口支持多重继承 (D)Java 程序分为 Application 和 Applet 两类 【解析】Java 是支持多线程的语言。 9.阅读下列代码,选出该代码段正确的文件名( C ) 。 class A{ void method1(){ System.out.println(&Method1 in class A&); } } public class B{ void method2(){ System.out.println(&Method2 in class B&); } public static void main(String[] args){ System.out.println(&main() in class B&); } } (A)A.java (B)A.class (C)B.java (D)B.class 【解析】Java 源文件名必须和公共类的名字完全一样,源文件的扩展名为.java。 10.编译下面源程序会得到哪些文件( D )? class A1{ } class A2{ } public class B{ public static void main(String[] args){ } } (A)只有 B.class 文件 (B)只有 A1.class 和 A2.class 文件 (C)编译不成功 (D)A1.class、A2.class 和 B.class 文件 【解析】由于该程序包含 3 个类,每个类编译后都会生成 1 个字节码文件,因此编译后 会生成以这 3 个类名命名的字节码文件。 二、填空题 1.Java 程序的编译和执行模式包括 2 点,是 半编译 和 半解释 。 2.Java 语言支持 TCP/IP 协议,从而使得 Java 程序在分布式环境中能够很方便地访问处 于不同地点的 对象 。 3.开发 Java 程序的一般步骤是:源程序编辑、 生成字节码 和 解释执行 。 4.每个 Java Application 程序可以包括许多方法,但是必须有且只能有一个 main() 方法, 统一格式为 public static void main(String[] args) ,它是程序执行的入口。 5. JVM 把字节码程序与各种不同的 操作系统 和 硬件 分开, 使得 Java 程序独立于平台。 6.在 Java 程序中,能在 WWW 浏览器上运行的是 Applet 程序。 7.Java 源程序文件和字节码文件的扩展名分别为 .java 和 .class 。 8.如果在 Java 程序中需要使用 java.utile 包中的所有类,则应该在程序开始处加上 import java.utitle.* 语句。2 三、编程题 1.编写一个 Java Application 类型的程序,输出“This is my first Java Application!。 ” 【编程分析】 要编写 Java Application 类型的程序,需要在 JCreator 中创建一个 Java Application 类型的工程,这时 JCreator 会自动创建程序框架,该框架包含一个公共类,其中 包含一个 main()方法。删除 main()方法中自动生成的代码,编写自己的代码即可。由于该程 序要求输出一句话,因此在 main()方法中直接调用 System.out.println()或 System.out.print() 方法即可实现。 【参考程序】 public class X3_1 { public static void main(String args[]){ System.out.println(&This is my first Java Application!&); } } 【运行结果】 This is my first Java Application! 2.编写一个 Java Applet 类型的程序,输出“这是我的第一个 Java Applet 类型的程序” 。 【编程分析】 要编写一个 Java Applet 类型的程序,首先利用 JCreator 创建一个 Java Applet 类型的工程, 该工程自动创建两个文件, 一个源文件 (.java 文件) 和一个 HTML 文件 (.html 文件) ,源文件中包含一个公共类,其中包含两个方法,即 init()方法和 paint()方法,由于该 程序只是要求输出一句话, 因此只要将 paint()方法中 g.drawString()方法的第一个参数修改为 要输出的内容即可。如果不是利用 JCreator 开发工具,而是利用 J2SDK,则用户需要自己编 写 HTML 文件。 【参考程序】 import java.awt.*; import java.applet.*; public class X3_2 extends Applet { public void paint(Graphics g) { g.drawString(&这是我的第一个 Java Applet 类型的程序&,50,50); } } 【运行结果】3 第2章一、选择题 1.下列( D )是合法的标识符? (A)12class (B)void (C)-5 (D)_blank 【解析】根据 Java 标识符的构成规则确定。 2.下列( B )不是 Java 中的保留字? (A)if (B)sizeof (C)private (D)null 【解析】根据 Java 保留字表进行选择。 3.下列( C )不是合法的标识符? (A)$million (B)$_million (C)2$_million (D)$2_million 【解析】根据 Java 标识符的构成规则确定。 4.下列选项中, B )不属于 Java 语言的基本数据类型? ( (A)整数型 (B)数组 (C)浮点型 (D)字符型 【解析】根据 Java 语言的基本数据类型包含的类别选取。 5.下列关于基本数据类型的说法中,不正确的一项是( D ) 。 (A)boolean 类型变量的值只能取真或假 (B)float 是带符号的 32 位浮点数 (C)double 是带符号的 64 位浮点数 (D)char 是 8 位 Unicode 字符 【解析】Java 中的字符采用的是 16 位的 Unicode 字符。 6.下列关于基本数据类型的取值范围的描述中,正确的一个是( B ) 。 (A)byte 类型的取值范围是-128~128 (B)boolean 类型的取值范围是真或假 (C)char 类型的取值范围是 0~65536 ( D ) short 类 型 的 取 值 范 围 是 -32767 ~ 32767 【解析】根据每种类型占几个字节即可推算出其取值范围,如 byte 类型占 1 个字节, 即共包含 28 个数值,其取值范围范围应为-128~127,其他类型也是如此。 7.下列关于 Java 语言简单数据类型的说法中,正确的一项是( A ) 。 (A)以 0 开头的整数代表 8 进制整型常量 (B)以 0x 或 0X 开头的整数代表 8 进制整型常量 (C)boolean 类型的数据作为类成员变量的时候,相同默认的初始值为 true (D)double 类型的数据占计算机存储的 32 位 【解析】根据每种数据类型的特性进行判断。 8.下列 Java 语句中,不正确的一项是( C ) 。 (A)$e, a, b = 10; (B)char c, d = ?a‘; (C)float e = 0.0d; (D)double c = 0.0f; 【解析】不能将 double 类型的常量赋值给 float 类型的变量。 9.在编写 Java 程序时,如果不为类的成员变量定义初始值,Java 会给出它们的默认值,下 列说法中不正确的一个是( D ) 。 (A)byte 的默认值是 0 (B)boolean 的默认值是 false (C)char 类型的默认值是‘\0‘ (D)long 类型的默认值是 0.0L 【解析】long 类型的默认值是 0L,而不是 0.0L。 10.下列语句中不正确的一个是( B ) 。4 (A)float f = 1.1f; (B)byte b = 128; (C)double d = 1.1/0.0; (D)char c = (char)1.1f; 【解析】bytel 类型变量的取值范围是-128~127。 11.下列表达式 1+2+ &aa&+3 的值是( B ) 。 (A)&12aa3& (B)&3aa3 & (C)&12aa& (D)&aa3& 【解析】整数和整数相加得到两个整数的和,而整数和字符串相加得到的是字符串。 12.已知 y=2, z=3, n=4,则经过 n=n+ -y*z/n 运算后 n 的值为( A ) 。 (A)3 (B)-1 (C)-12 (D)-3 【解析】根据运算符的优先级,该表达式相当于 n=n+ ((-y)*z)/n。 13.已知 a=2, b=3,则表达式 a%b*4%b 的值为( A ) 。 (A)2 (B)1 (C)-1 (D)-2 【解析】根据运算符的优先级,该表达式相当于((a%b)*4)%b。 14.已知 x=2, y=3, z=4,则经过 z- = --y C x--运算后,z 的值为( D ) 。 (A)1 (B)2 (C)3 (D)4 【解析】在表达式运算过程中,--y 的值变为 2,x―的值还是 2,等号右侧运算后的值 为 0,因此 z 的值没有变化。 15.表达式(12==0) && (1/0 & 1)的值为( B ) 。 (A)true (B)false (C)0 (D)运行时抛出异常 【解析】由于(12==0)的值为 false,因此整个表达式发生短路运算,即(1/0 & 1)就没有参 与运算,整个表达式的值为 false。 16.设有类型定义 short i=32; long j=64; 下面赋值语句中不正确的一个是( B ) (A)j=i; (B)i=j; (C)i=(short)j; (D)j=(long)i; 【解析】long 类型的数据不能自动转变为 short 类型,因此不能将 long 类型的变量直接 赋值给 short 类型。 17.现有 1 个 char 类型的变量 c1=66 和 1 个整型变量 i=2,当执行 c1=c1+(char)i;语句后,c1 的值为( D ) 。 (A)'d' (B)'D' (C)68 (D)语句在编译时出错 【解析】两个字符型的数据相加,得到的是一个整数,而如果把整数再赋值给一个字符 型变量则会在编译时出错。 18.下列说法中,正确的一项是( D ) 。 (A)字符串&\\abcd& 的长度为 6 (B)False 是 Java 的保留字 (C)123.45L 代表单精度浮点型 (D)False 是合法的 Java 标识符 【解析】 Java 语言对字符的大小写是敏感的, False 不是 false, 因此 False 是合法的 Java 标识符。 19.以下的变量定义语句中,合法的是( D ) (A)float _*5 = 123.456F; (B)byte $_b1 = 12345; (C)int _long_ = 123456L; (D)double d = Double.MAX_VALUE; 【解析】 (A)中_*5 不是合法的标识符, (B)中 12345 超出 byte 范围, (C)中不能将 long 类型的常量赋值给 int 型的变量。 20.下列关于运算符优先级的说法中,不正确的一个是( C ) (A)运算符按照优先级顺序表进行运算 (B)同一优先级的运算符在表达式中都是按照从左到右的顺序进行运算的 (C)同一优先级的运算符在表达式中都是按照从右到左的顺序进行运算的 (D)括号可以改变运算的优先次序5 【解析】同一优先级的运算符在表达式中都是按照从左到右的顺序进行运算的。 二、填空题 1. 变量是 Java 程序的基本存储单元之一, 变量的主要类型包括 2 大类: 字符型 和 数值型 。 2.Java 语言的整数类型变量和常量一样,各自都包括 4 种类型的数据,它们分别是 byte、 int 、 short 和 long。 3. boolean 类型数据不可以做类型转换。 4.在 Java 语言的基本数据类型中,占存储空间最少的类型是 boolean ,该类型占用的 存储空间为 1 位。 5.Java 语言中的 保留字 具有特殊意义和作用,不能作为普通标识符使用。 6.在 Java 语言中,浮点类型数据属于实型数据,可以分为 单精度 和 双精度 两种。 7.char 类型的数据可以表示的字符数共为 65536 。 8.定义初始值为 10 的 8 次方的常整型变量 iLong 的语句是 final iLong = L 。 9.Java 语言中的数据类型转换包括 自动转换 和 强制转换 两种。 10.Java 中的字符采用的是 16 位的 Unicode 编码。 11.数据类型中存储空间均为 64 位的两种数据类型是 long 和 double 。 12.表达式 9*4/ -5%5 的值为 -2 。 (十进制表示) 13.表达式 5&2 的值为 0 。 (十进制表示) 14.表达式 42&&4 的值为 672 。 (十进制表示) 15.表达式 &&&3 的值为 11010 。 (二进制表示) 16.表达式 7|3 的值为 7 。 (十进制表示) 17.表达式 10^2 的值为 8 。 (十进制表示) 18.Java 语言中的逻辑与(&&)和逻辑或(||)运算采用 短路 方式进行运算。 19.若 a、b 为 int 型变量,并且已分别赋值为 5 和 10,则表达式(a++)+(++b)+a*b 的值为 82 。 20.假设 i=10, j=20, k=30,则表达式 !(i&j+k) || !(i+10&=j) 的值为 false 。 三、编程题 1.编写一个 Java Application 类型的程序,定义一个 byte 类型的变量 b,并从键盘上给它赋 值为-100 和 100 时,输出该变量的值。 【编程分析】要实现键盘输入一个 byte 类型的变量,首先创建输入流对象,再利用该对象 的 readLine()方法输入字符串, 然后利用 Byte 类的 parseByte()方法将输入的字符串转化为字 节类型,最后通过 System.out.println()方法输出该变量。 【参考程序】 import java.io.*; public class X2_3_1 { public static void main(String[] args) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String str = br.readLine(); b = Byte.parseByte(str); System.out.println(b); b = Byte.parseByte(str); System.out.println(b);6 } } 【运行结果】 -200 Exception in thread &main& java.lang.NumberFormatException at java.lang.Byte.parseByte(Byte.java:124) at java.lang.Byte.parseByte(Byte.java:79) at EX11_1.main(EX11_1.java:8) 注意:给 b 赋值的范围只能在-128 至 127 之间,如果超出这个范围,则发生例外。 2.编写一个 Java Applet 类型的程序,计算输出表达式 12+5&3||12-5&7 的值。 【编程分析】由于表达式 12+5&3||12-5&7 的最终结果是 boolean 类型,因此可以将该表达式 赋值给一个 boolean 类型的变量,然后输出该变量的值。 【参考程序】 import java.awt.*; import java.applet.*; public class X2_3_2 extends Applet { public void paint(Graphics g) { boolean b = 12+5&3||12-5&7; g.drawString(&b = &+b, 50, 60 ); } } 【运行结果】3.编写一个 Java Application 类型的程序,从键盘上输入三角形的三条边的长度,计算三角 形的面积和周长并输出。根据三角形边长求面积公式如下:area ? s * ( s ? a) * ( s ? b) * ( s ? c),其中 a、b、c 为三角形的三条边,s=(a+b+c)/2。【编程分析】 该程序由于涉及到数据输入, 因此首先建立输入流对象, 输入三角形三条边 a、 b、c 的值,然后求出中间变量 s 的值,最后利用数学方法 Math.sqrt()方法求出三角形的面积 并输出。 【参考程序】 import java.io.*; public class X2_3_3 { public static void main(String[] args) throws IOException{7 InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); double a, b, c, s, S str = br.readLine(); a = Double.parseDouble(str); str = br.readLine(); b = Double.parseDouble(str); str = br.readLine(); c = Double.parseDouble(str); s = (a+b+c)/2.0; area = Math.sqrt(s*(s-a)*(s-b)*(s-c)); System.out.println(&area = &+area); } } 【运行结果】 3 4 5 area = 6.0 注意: 输入的三角形的三条边必须满足三角形的构成规则, 如果不满足则输出错误结果。 4.编写一个 Java Application 类型的程序,从键盘上输入摄氏温度 C,计算华氏温度 F 的值 并输出。其转换公式如下: F = (9 / 5) * C + 32 【编程分析】该程序和上一个程序类似,在此不再赘述。 【参考程序】 import java.io.*; public class X2_3_4 { public static void main(String[] args) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); double C, F; S str = br.readLine(); C = Double.parseDouble(str); F=(9 / 5) * C + 32; System.out.println(&F = &+F); } } 【运行结果】 37 F = 69.0 5.已知圆球的体积公式为 4/3 ? r3,编一程序,输入圆球半径,计算并输出球的体积。 【编程分析】该程序和第 3 题类似,在此不再赘述。8 【参考程序】 import java.io.*; public class X2_3_5 { public static void main(String[] args) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); S System.out.print(&Enter the value of radius please: &); str = br.readLine(); radius = Integer.parseInt(str); volume=4*Math.PI*Math.pow(radius,3)/3; System.out.println(&volume = &+volume); } } 【运行结果】 Enter the value of radius please: 26 volume = 32561第3章一、选择题 1.下列( D )不属于 Java 语言流程控制结构? (A)分支语句 (B)跳转语句 (C)循环语句 (D)赋值语句 【解析】Java 语言流程控制结构只包括分支、循环和跳转三种语句。 2.假设 a 是 int 类型的变量,并初始化为 1,则下列( D )是合法的条件语句? (A)if(a){} (B)if(a&&=3){} (C)if(a=2){} (D)if(true){} 【解析】条件语句中的“条件表达式”只能是 boolean 类型,不能是其他类型。 3.下列说法中,不正确的一个是( C ) 。 (A)switch 语句的功能可以由 if…else if 语句来实现 (B)若用于比较的数据类型为 double 型,则不可以用 switch 语句来实现 (C)if …else if 语句的执行效率总是比 switch 语句高 (D)case 子句中可以有多个语句,并且不需要大括号{}括起来 【解析】语句的执行效率高低要根据具体语句来确定,不能简单地说 if …else if 语句的 执行效率总是比 switch 语句高。 4.设 a、b 为 long 型变量,x、y 为 float 型变量,ch 为 char 类型变量且它们均已被赋值, 则下列语句中正确的是( B ) 。 (A)switch(x+y) {} (B)switch(ch+1) {} (C)switch ch {} (D)switch(a+b); {} 【解析】switch 后面的表达式必须放在括号()中,且表达式的类型只能是 byte、short、 int 和 char 类型,不能是其他类型。 5.下列循环体执行的次数是( C ) 。9 int y=2, x=4; while(--x != x/y){ } (A)1 (B)2 (C)3 (D)4 【解析】第 1 次执行 while 时,--x 的值为 3,3/2=1,满足等号两端值不等的条件,执 行一次循环体;第 2 次执行 while 时,--x 的值为 2,2/2=1,条件满足,又执行一次循环体; 第 3 次执行 while 时,--x 的值为 1,1/2=0,条件满足,再次执行一次循环体;第 4 次执行 while 时,--x 的值为 0,0/2=0,条件不满足满足,结束循环。因此在这个循环语句执行的过 程中,循环体共执行了 3 次。 6.下列循环体执行的次数是( B ) 。 int x=10, y=30; do{ y -= x++; }while(x++&y--); (A)1 (B)2 (C)3 (D)4 【解析】执行 1 次循环体后,y 的值为 20,x 值为 11,然后执行 while,此时 x++的值 为 11,y―的值为 20,因此 x++&y―条件满足,判断完后,x 的值变为 12,y 的值变为 19; 接着执行第 2 次循环体,执行完第 2 次循环体后,y 的值为 9,x 值为 13,然后执行 while, 此时 x++的值为 13,y―的值为 9,因此 x++&y―条件不满足,结束循环。因此在这个循环 语句执行的过程中,循环体共执行了 2 次。 7.已知如下代码: switch(m){ case 0: System.out.println(&Condition 0&); case 1: System.out.println(&Condition 1&); case 2: System.out.println(&Condition 2&); case 3: System.out.println(&Condition 3&); default:System.out.println(&Other Condition&); } 当 m 的值为( D )时,输出“Condition 3” (A)2 (B)0、1 (C)0、1、2 (D)0、1、2、3 【解析】当 m 的值为 0、1、2、3 时,都能输出“Condition 3” ,因为 case 0、case 1、 case 2 后面的语句都没有 break,因此可以继续向后执行。 二、填空题 1.跳转语句包括 break、continue、return 和 throw 2.switch 语句先计算 switch 后面的 表达式 的值,再和各 case 语句后的值做比较。 3.if 语句合法的条件值是 boolean 类型。 4.continue 语句必须使用于 循环 语句中。 5.break 语句有两种用途:一种从 switch 语句的分支中跳出,一种是从循环语句内部跳出。 6.do - while 循环首先执行一遍 循环体 ,而 while 循环首先判断 表达式的值 。 7.与 C++语言不同,Java 语言不通过 goto 语句实现跳转。 8.每一个 else 子句都必须和它前面的一个距离它最近的 if 子句相对应。 9.在 switch 语句中,完成一个 case 语句块后,若没有通过 break 语句跳出 switch 语句,则 会继续执行后面的 case 语句块。 10.在 for 循环语句中可以声明变量,其作用域是 for 循环体 。 三、写出下列程序的运行结果 1. public class X3_3_1 {10 public static void main(String[] args) { for(int i=0; i&10; i++){ if(i==5) System.out.print(i); } } } 【运行结果】01234 【程序解析】本程序主要考查 break 语句的使用。程序中的 for 循环变量 i 是从 0 到 9 进行 循环,正常情况下应该输出 0 到 9,但是由于循环体中有“if(i==5)”语句,当 i 为 5 时 for 循环就结束了,因此最后的结果是 01234。 2.public class X3_3_2 { public static void main(String[] args) { int i=5, j=2; while(j&i--) j++; System.out.print(j); } } 【运行结果】4 【程序解析】 本程序主要考查 while 语句以及 “后缀--” 运算符的使用。 由于每执行一次 while 判断,i 的值就减 1,每执行 1 次循环体,j 的值就增加 1,而 while 判断总共经历了“2&5” 、 “3&4”“4&3”三次,第 3 次时由于条件不满足,还没有执行循环体就结束了循环,因此 、 循环体总共执行了 2 次,j 的值也只加了 2,而其初始值为 2,因此 j 最后的值为 4。 3.public class X3_3_3 { public static void main(String[] args) { int i=4; while(--i&0){ } System.out.print(i); } } 【运行结果】0 【程序解析】本程序主要考查 while 语句以及“前缀--”运算符的使用。由于 i 的初值为 4, 要使“while(--i&0)”结束执行,必须等到 i 的为 0,因此 i 最后的值为 0。 4.public class X3_3_4 { public static void main(String[] args) { int j=0; for(int i=3; i&0; i--){ j += int x = 2; while(x&j){ x += 1; System.out.print(x); } }11 } } 【运行结果】 【程序解析】本程序主要考查 for 循环和 while 循环嵌套的情况。在 for 循环第 1 次执行到 while 语句时,j 和 x 的值分别为 3 和 2,此时“while(x&j)”条件满足,进入 while 循环体执 行,x 值变为 3,然后输出,再进行判断“while(x&j)” ,此时条件不满足,结束 while 循环, 程序到 for 循环头部的第 3 个表达式“i--”处执行。此时 i 的值变为 2, “i&0”条件满足,进 入 for 循环体。 for 循环第 2 次执行到 while 语句时,和 x 的值分别为 5 和 2, “while(x&j)” 在 j 此时 条件满足,进入 while 循环体执行,该循环体共执行 3 次,x 值分别变为 3、4、5,然后输 出,在 for 循环第 3 次执行到 while 语句时,j 和 x 的值分别为 6 和 2,此时“while(x&j)”条 件满足,进入 while 循环体执行,该循环体共执行 4 次,x 值分别变为 3、4、5、6,然后输 出。当程序再次到 for 循环头部的第 3 个表达式“i--”处执行;此时 i 的值变为 0, “i&0”条 件不满足,退出 for 循环,结束程序执行。 5. public class X3_3_5 { public static void main(String[] args) { int i=8, j=2; while(j& --i) for(int k=0; k&4; k++) j++; System.out.print(j); } } 【运行结果】6 【程序解析】本程序主要考查 while 循环和 for 循环嵌套执行的情况。第 1 次执行“while(j& --i)”时,j 和―i 的值分别为 2 和 7,条件满足,执行 for 循环,for 循环体共执行了 4 次,j 的值增 4,变为 6;然后又第 2 次执行“while(j& --i)” ,此时 j 和―i 的值分别为 6 和 6,条件 不满足,结束 while 循环,输出 j 的值。 6. public class X3_3_6 { public static void main(String[] args) { int a=0, b=1; do{ if(b%2==0) a += b++; }while(b &= 100); System.out.print(a); } } 【运行结果】2550 【程序解析】本程序主要考查 do…while 循环的执行情况。执行循环体之前,a=0,b=1,进 入循环体后,由于“b%2==0”的条件不满足,因此直接执行“b++” 的值变为 2,满足 ,b “while(b &= 100)”条件,再次进入循环体。此时“b%2==0”的条件满足,语句“a+=b”执 行,然后执行“b++” ,再进行“while(b &= 100)”判断,如此一直执行下去,直至该条件不 满足为止,最后输出 a 的值。从循环过程来看,只有 b 为偶数时才加到 a 中去,因此 a 的值 应该是“2+4+6+…+100” 。12 7. public class X3_3_7 { public static void main(String[] args) { for(int i=1; i&=10; i++){ if(i&=5) System.out.print(i + & &); } } } 【运行结果】6 7 8 9 10 【程序解析】本程序主要考查 continue 语句的使用情况。由于“if(i&=5)”语句, 使得 for 循环变量 i 从 1 到 5 的循环过程中都不能执行“System.out.print(i + & &);” ,只有 i 的 值从 6 到 10 时才执行该语句,因此输出结果为“6 7 8 9 10” 。 8. public class X3_3_8 { public static void main(String[] args) { char ch='7'; int r=10; switch(ch+1){ case '7': r += 7; case '8': r += 8; case '9': r += 9; default: } System.out.print(r); } } 【运行结果】27 【程序解析】本程序主要考查 switch…case 语句,由于“ch+1”的值是'8',因此程序执行了 “r += 8;”语句,由于该语句后没有 break,因此又执行了后面的“r += 9;”语句,由于 r 的 初值为 10,因此 r 最后的值为 27。 9. public class X3_3_9 { public static void main(String[] args) { lable: for(int i=0; i&3; i++){ for(int j=0; j&3; j++){ if(i==j) System.out.print(i*3+j+&\t&); } System.out.print(&i= &+i); } } } 【运行结果】3 6 7 【程序解析】本程序主要考查 continue lab 语句的运行情况。当程序执行到“” 语句时,程序直接跳转到外层 for 循环,执行下一次循环。 10. public class X3_3_10 {13 public static void main(String[] args) { int j=0; a1: for(int i=3; i&0; i--){ j += a2: for(int k=1; k&3;k++){ j *= if(i==k) break a1; } } System.out.println(&j= &+j); } } 【运行结果】j= 16 【程序解析】本程序主要考查 break lab 语句的执行情况。当程序执行到“break a1;”时,程 序流程直接跳出 a1 所在的外层 for 循环,输出 j 的值。 四、编写程序 1.利用 if 语句,根据下列函数编写一个程序,当键盘输入 x 值时,求出并输出 y 的值。 x 3x-2 4x (x&=1) (1&x&10) (x&=10)y=【编程分析】本题主要考查 if…else 语句的使用。根据给定的数学算式,只要给出 x 的 值,就有对应的 y 算式,因此利用 if…else 语句直接可以实现。 【参考程序】 import java.io.*; public class X3_4_1 { public static void main(String[] args) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); int x, x = Integer.parseInt(br.readLine()); if(x&=1) y = else if(x&10) y = 3*x - 2; else y=4*x; System.out.println(&x = &+x + &\ty = &+y); } } 【运行结果】 9 x = 9 y = 25 2. 利用 switch 语句将学生成绩分级, 当从键盘中输入学生成绩在 100~90 范围时, “优 输出 秀” ,在 89~80 范围时输出“良好” ,在 79~70 范围时输出“中等” ,在 69~60 范围时输出 “及格” ,在 59~0 范围时输出“不及格” ,在其他范围时输出“成绩输入有误!。 ” 【编程分析】本题主要考查 switch 语句的使用。由于要根据一定的数值范围来输出相应的14 汉字,而 switch 后面的表达式类型不能是一个范围,因此要把一个整数范围变成一个整数 来满足要求。由于 Java 中的 int 和 int 运算的结果还是 int 型,可以把某个给定的程序除 10, 如 89/10 和 81/10 的结果都是 8,这样就满足了要求。 【参考程序】 import java.io.*; public class X3_4_2 { public static void main(String[] args) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); int score, score = Integer.parseInt(br.readLine()); if(score&100 || score&0){ System.out.println(&输入成绩超出范围!&); System.exit(1); } k = score/10; switch(k){ case 10: case 9: System.out.println(&优秀&); case 8: System.out.println(&良好&); case 7: System.out.println(&中等&); case 6: System.out.println(&及格&); default: System.out.println(&不及格&); } } } 【运行结果】 87 良好 3.利用 for 循环,计算 1+3+7+??+(220-1)的和。 【编程分析】本例主要考查利用 for 循环求一个数列的和的编程方法。数列的项数和每一项 的值都已知,因此直接利用 for 循环和数学类中的相应方法即可实现。 【参考程序】 public class X3_4_3 { public static void main(String[] args) {15 int i, sum=0; for(i=1; i&21; i++) sum += Math.pow(2,i) - 1; System.out.println(&sum = & + sum); } } 【运行结果】 sum = .已知 S ? 1 ?1 1 1 1 1 ? ? ??? ? ,利用 while 循环编程求解 n=100 时的 S 值。 2 3 4 n ?1 n【编程分析】本例主要考查利用 while 循环实现对一个数列进行加、减运算的编程方法。由 于项数已经确定,因此数列的首项和末项已知,但是由于加减交替出现,可以利用一个变量 sign 来确定符号, sign 初始值为 1, 设 循环一次让它变一次符号, 从而实现符号的交替变化。 【参考程序】 public class X3_4_4 { public static void main(String[] args) { int i=1, n = 100; double sign = 1, sum = 0; while(i&=n){ double k = sign/i; sum += i++; sign = - } System.out.println(&S = & + sum); } } 【运行结果】 S = 0.195 5.利用 do…while 循环,计算 1!+2!+3! +??+100!的和。 【编程分析】本例主要考查利用 do…while 循环实现数列相加的程序设计方法。由于每一项 都是一个阶乘,所以在循环过程中先求阶乘,然后再相加。 【参考程序】 public class X3_4_5 { public static void main(String[] args) { int i=1; long fact = 1, sum = 0; do{ fact *= sum += i++; } while(i&=100) ; System.out.println(&sum = & + sum); }16 } 【运行结果】 sum = .编程序,求?kk ?1103【编程分析】 本例主要考查利用任意一种循环结构实现给定数列求和的程序设计方法。 实现 方法和前几例类似,在此不再赘述。 【参考程序】 public class X3_4_6 { public static void main(String[] args) { int k, sum = 0; for(k=1;k&=10;k++) sum += Math.pow(k,3); System.out.println(&sum = & + sum); } } 【运行结果】 sum = 3025 7.编写打印“九九乘法口诀表”的程序。 【编程分析】本例主要考查利用循环嵌套进行程序设计的方法。 “九九乘法口诀表”既涉及 到行,又涉及到列,因此需要利用循环嵌套来实现,实现时还需要注意输出格式。 【参考程序】 public class X3_4_7 { public static void main(String[] args) { int i, for(i=1;i&10;i++){ for(j=1;j&=i;j++) System.out.print(i + &x& + j +&=& + i*j + &\t&); System.out.println(&&); } } } 【运行结果】 1x1=1 2x1=2 2x2=4 3x1=3 3x2=6 3x3=9 4x1=4 4x2=8 4x3=12 4x4=16 5x1=5 5x2=10 5x3=15 5x4=20 5x5=25 6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36 7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49 8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64 9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81 9.水仙花数是指其个位、十位和百位三个数的立方和等于这个三位数本身,求出所有的水17 仙花数。 【编程分析】 本例主要考查如何利用循环结构将一个多位整数拆分成多个个位数的程序设计 方法。在求“水仙花数”过程中,需要将这个百位的数拆分成 3 个个位数。 【参考程序】 public class X3_4_9 { public static void main(String[] args) { for(int i=100;i&=999;i++){ int k = int gw = k % 10; k /= 10; int sw = k % 10; k /= 10; int bw = int sum = (int)(Math.pow(gw,3)+Math.pow(sw,3)+Math.pow(bw,3)); if(i == sum) System.out.print(i+ &\t&); } } } 【运行结果】 153 370 371 407 10.编写一个程序,接受用户输入的两个数据为上、下限,然后输出上、下限之间的所有素 数。 【编程分析】本例主要考查如何利用 Java 语言的流程控制语句解决求素数的问题。由于素 数是除了能被 1 和它本身整除外,不能被其他任何整数整除的自然数。假设要判断某数 i 是 否为素数,可以利用循环语句让该数分别除以 2~i-1 之间的所有数,如果一直不能整除, 则 i 是素数,否则不是。如果让 i 分别除以 2~i/2 之间的所有数,如果一直不能整除,则 i 也是素数,因为任何数都不可能被大于它一半的数整除,这样可以减少循环次数,提高程序 运行效率。另外,数学原理证明,如果让 i 分别除以 2~ (int) i 之间的所有数,如果一直不 能整除,则 i 也是素数,这样就可以大大减少循环次数,提供程序效率。 【参考程序】 import java.io.*; public class X3_4_10 { public static void main(String[] args) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); int top, bottom, i, System.out.print(&请输入上限:&); top = Integer.parseInt(br.readLine()); System.out.print(&请输入下限:&); bottom = Integer.parseInt(br.readLine()); if(top&bottom){ System.out.println(&输入的上、下限不正确!&);18 System.exit(1); } for(i= i&= i++){ int k = (int)Math.sqrt(i); for(j=2; j&=k; j++){ if(i % j == 0) } if(j&k) System.out.print(i + &\t&); } System.out.println(); } } 【运行结果】 请输入上限:500 请输入下限:100 101 103 151 157 199 211 263 269 317 331 383 389 443 449107 163 223 271 337 397 457109 167 227 277 347 401 461113 173 229 281 349 409 463127 179 233 283 353 419 467131 181 239 293 359 421 479137 191 241 307 367 431 487139 193 251 311 373 433 491149 197 257 313 379 439 499第4章一、选择题 1.下列哪种类成员修饰符修饰的变量只能在本类中被访问?( D ) (A)protected (B)public (C)default (D)private 【解析】只有私有访问权限修饰符才能限制变量只能在本类中被访问。 2.在 Java 语言中,哪一个包中的类是自动导入的?( A ) A)java.lang B)java.awt C)java.io D)java.applet 【解析】只有 java.lang 包中的类能够被自动导入。 3.给出下面的程序代码: public class X4_1_3 { public static void m ( ){ } } 如何使成员变量 a 被方法 m( )访问( C ) (A)将 private float a 改为 protected float a(B)将 private float a 改为 public float a (C)将 private float a 改为 static float a (D)将 private float a 改为 float a 【解析】static 类型的方法只能访问 static 类型的数据成员。 4.有一个类 B,下面为其构造方法的声明,正确的是( B ) 。 (A)void B(int x) {} (B)B(int x) {}19 (C)b(int x) {} (D)void b(int x) {} 【解析】构造方法没有类型,且方法名与类名相同。 5.下面关于类的说法,不正确的是( C ) 。 (A)类是同种对象的集合和抽象 (B)类属于 Java 语言中的复合数据类型 (C)类就是对象 (D)对象是 Java 语言中的基本结构单位 【解析】类是对象的抽象,对象是类的实例,因此类和对象是有区别的。 6.下面关于方法的说法,不正确的是( C ) 。 (A)Java 中的构造方法名必须和类名相同 (B)方法体是对方法的实现,包括变量声明和合法语句 (C)如果一个类定义了构造方法,也可以用该类的默认构造方法 (D)类的私有方法不能被其他类直接访问 【解析】类中一旦用户定义了构造方法,该类默认的构造方法就不存在了,除非用户再自定 义该类的默认构造方法。 7.关于内部类,下列说法不正确的是( A ) 。 (A)内部类不能有自己的成员方法和成员变量 (B)内部类可用 private 或 protected 修饰符修饰 (C)内部类可以作为其他类的成员,而且可访问它所在的类的成员 (D)除 static 内部类外,不能在类内声明 static 成员 【解析】内部类也可以有自己的成员方法和变量。 8.定义外部类时不能用到的关键字是( C ) 。 (A)final (B)public (C)protected (D)abstract 【解析】定义外部类不能使用 protected 修饰符。 9.为 AB 类定义一个无返回值的方法 f,使得使用类名就可以访问该方法,该方法头的 形式为( D ) (A)abstract void f() (B)public void f() (C)final void f() (D)static void f() 【解析】只有 static 类型的方法才可以直接使用类名来引用。 10.定义一个公有 double 型常量 PI,哪一条语句最好?( B ) (A)public final double PI; (B)public final static double PI=3.14; (C)public final static double PI; (D)public static double PI=3.14; 【解析】用 public final static 来定义常量,既可以节省存储空间,又可以保证数值不会 被改变。 二、填空题 1. 对象 是对事物的抽象,而 类 是对对象的抽象和归纳。 2.从用户的角度看,Java 源程序中的类分为两种: 系统定义的类 和 用户自己定义 的类 。 3.一个类主要包含两个要素: 数据成员 和 成员方法 。 4.创建包时需要使用关键字 package 。 5.类中的 构造 方法是一个特殊的方法,该方法的方法名和类名相同。 6.如果用户在一个自定义类中未定义该类的构造方法,系统将为这个类定义一个默认 构造方法。这个方法没有 形式参数 ,也没有任何 具体语句 ,不能完成任何操作。 7.静态数据成员被保存在类的内存区的 公共存储 单元中,而不是保存在某个对象 的内存区中。因此,一个类的任何对象访问它时,存取到的都是 相同 (相同/不同)的数 值。20 8.静态数据成员既可以通过 对象名 来访问,也可以通过 类名 直接访问它。 9.定义常量时要用关键字 final ,同时需要说明常量的 数据类型 并指出常量的 具体值 。 10.方法体内定义变量时,变量前不能加 修饰符 ;局部变量在使用前必须 明确赋 值 ,否则编译时会出错;而类变量在使用前可以不用赋值,它们都有一个 默认 的值。 11.static 方法中只能引用 static 类型的数据成员和 static 类型的成员方法;而非 static 类型的方法中既可以引用 static 类型的数据成员和成员方法,也可以引用非 static 类型的数据成员和成员方法。 12.引用 static 类型的方法时,可以使用 类名 做前缀,也可以使用 对象名 做前缀。 13.当程序中需要引用 java.awt.event 包中的类时,导入该包中类的语句为 import java.awt.event.*。 14.定义类时需要 class 关键字,继承类时需要 extends 关键字,实现接口时需要 关键字 implements 。 三、编程题 1.编一个程序,程序中包含以下内容: 一个圆类(Circle),包含: 属性:圆半径 radius;常量:PI。 方法:构造方法;求面积方法 area();求周长方法:perimeter()。 主类(X4_3_1),包含: 主方法 main(),在主方法中创建圆类的对象 c1 和 c2 并初始化,c1 的半径为 100, c1 的半径为 200,然后分别显示两个圆的面积和周长。 【编程分析】按照要求创建 Circle 类,其中的半径可以定义为 int 类型,PI 定义为 final static double 类型,求面积和周长的方法都应定义为 double 类型,在构造方法中对 radius 进行初 始化。 【参考答案】 public class X4_3_1 { public static void main(String[] args) { Circle c1 = new Circle(100); Circle c2 = new Circle(200); System.out.println(&c1.area() = & +c1.area()+&\tc1.perimenter() = &+c1.perimeter()); System.out.println(&c2.area() = & +c2.area()+&\tc2.perimenter() = &+c2.perimeter()); } } class Circle{ final static double PI=3.14; Circle(int r){ radius = } double area(){ return PI*radius* } double perimeter(){ return 2*PI*21 } } 【运行结果】 c1.area() = .perimenter() = 628.0 c2.area() =
c2.perimenter() = .编一个程序,程序中包含以下内容: 一个学生类(Student) ,包含: 属性:学号 s_No,姓名 s_Name,性别 s_Sex,年龄 s_Age。 方法:构造方法,显示学号方法 showNo(),显示姓名方法 showName(),显示性别方法 showSex(),显示年龄方法 showAge(),修改年龄方法 modifyAge()。 主类(X4_3_2),包含: 主方法 main(), 在其中创建两个学生对象 s1 和 s2 并初始化, 两个对象的属性自行确定, 然后分别显示这两个学生的学号、姓名、性别、年龄,然后修改 s1 的年龄并显示修改后的 结果。 【编程分析】按照要求首先编写 Student 类,其中的属性和方法根据实际情况选择相应的类 型和权限修饰符,要通过方法来修改年龄,因此 s_Age 属性应该为 private 类型,否则可以 直接在主类中进行修改,就没有必要使用方法了。 【参考答案】 public class X4_3_2 { public static void main(String[] args) { Student s1 = new Student(101,&张三&,&男&,18); Student s2 = new Student(102,&李四&,&女&,16); System.out.println(&第 1 个学生的信息为:&); s1.showNo(); s1.showName(); s1.showSex(); s1.showAge(); System.out.println(&第 2 个学生的信息为:&); s2.showNo(); s2.showName(); s2.showSex(); s2.showAge(); System.out.println(&修改第 1 个学生的年龄:&); s1.modifyAge(24); System.out.println(&第 1 个学生的年龄修改为:&); s1.showAge(); } } class Student{ private int s_No; private String s_N private String s_S private int s_A Student(int no, String name, String sex, int age){22 s_No = s_Name = s_Sex = s_Age = } void showNo(){ System.out.println(&学号:&+s_No); } void showName(){ System.out.println(&姓名:& + s_Name); } void showSex(){ System.out.println(&性别:& + s_Sex); } void showAge(){ System.out.println(&年龄:& + s_Age); } void modifyAge(int newAge){ s_Age = newA } } 【运行结果】 第 1 个学生的信息为: 学号:101 姓名:张三 性别:男 年龄:18 第 2 个学生的信息为: 学号:102 姓名:李四 性别:女 年龄:16 修改第 1 个学生的年龄: 第 1 个学生的年龄修改为: 年龄:24第5章一、选择题 1.已知有下面类的说明:public class X5_1_1 extends x{ private float f =10.6f; int i=16; static int si=10; public static void main(String[] args) { 23 X5_1_1 x=new } }X5_1_1();在 main()方法中,下面哪条语句的用法是正确的?( A ) A.x.f B.this.si C.X5_1_1.i D.X5_1_1.f 【解析】由于 x 是在 main 方法内部定义的对象,因此它可以引用类的非 static 类型的属性, 因此选 A,而 this 和 super 不能在 main 方法中使用,使用类名只能引用本类的静态属性, 因此 B、C、D 不对。 2.下列程序的运行结果是( C ) 。public class X5_1_2 extends x{ int ab(){ static int aa=10; aa++; System.out.println(aa); } public static void main(String[] args) { X5_1_2 x=new X5_1_2(); x.ab(); } }A.10 B.11 C.编译错误 D.运行成功,但不输出 【解析】方法体内的局部变量不能使用 static 修饰符。 3.下面关于接口的说法中不正确的是( C ) 。 A.接口中所有的方法都是抽象的 B.接口中所有的方法都是 public 访问权限 C.子接口继承父接口所用的关键字是 implements D.接口是 Java 中的特殊类,包含常量和抽象方法 【解析】 子接口继承父接口所用的关键字也是 extends, 只有类实现接口时才使用 implements。 4.区分类中重载方法的依据是( A ) 。 A.形参列表的类型和顺序 B.不同的形参名称 C.返回值的类型不同 D.访问权限不同 【解析】形参表的类型和顺序不同时区分重载方法的唯一标志。 5.子类对象能否直接向其父类赋值?父类对象能否向其子类赋值?( B ) A.能,能 B.能,不能 C.不能,能 D.不能,不能 【解析】子类对象可以直接赋值给父类对象,而父类对象不能直接赋值给子类对象。 6.Java 语言类间的继承关系是( A ) 。 A.单继承 B.多重继承 C.不能继承 D.不一定 【解析】Java 语言类间的继承关系是单继承,但一个类可以实现多个接口。 7.Java 语言接口间的继承关系是( B ) 。 A.单继承 B.多重继承 C.不能继承 D.不一定 【解析】Java 语言接口间的继承关系允许多重继承。 8.一个类实现接口的情况是( A ) 。 A.一次可以实现多个接口 B.一次只能实现一个接口 C.不能实现接口 D.不一定 【解析】Java 语言允许一个类一次实现多个接口。 9.定义外部类的类头时,不可用的关键字是( C ) 。 A.public B.final C.protected D.abstract24 【解析】定义外部类时不能使用 protected 关键字。 10.如果局部变量和成员变量同名,如何在局部变量作用域内引用成员变量?( B ) A.不能引用,必须改名,使它们的名称不相同 B.在成员变量前加 this,使用 this 访问该成员变量 C.在成员变量前加 super,使用 super 访问该成员变量 D.不影响,系统可以自己区分 【解析】this 可以用来引用本类对象。 11.下面说法不正确的是( B ) 。 A.抽象类既可以做父类,也可以做子类 B.abstract 和 final 能同时修饰一个类 C.抽象类中可以没有抽象方法,有抽象方法的类一定是抽象类或接口 D.声明为 final 类型的方法不能在其子类中重新定义 【解析】abstract 和 final 不能同时修饰一个类,因为 abstract 类需要子类,而 final 类不能有 子类。 二、填空题 1.消息就是向对象发出 服务请求 ,是对 数据成员 和 成员方法 的引用。 2.在面向对象系统中,消息分为两类 公有消息 和 私有消息 。 3.在面向对象程序设计中,采用 继承 机制可以有效地组织程序结构。充分利用已有的类 来创建更复杂的类,大大提高程序开发的效率,提高代码的复用率,降低维护的工作 量。 4. 数据成员的隐藏 是指在子类中重新定义一个与父类中已定义的数据成员名完全相同的 数据成员。 5.子类可以重新定义与父类同名的成员方法,实现对父类方法的 覆盖 。 6. 子类在重新定义父类已有的方法时, 应保持与父类完全相同的 方法名 、返回值类型 和 参数列表 , 否则就不是方法的覆盖, 而是子类定义自己特有的方法, 与父类的方法无关。 7.this 代表了 当前对象 的一个引用,super 表示的是当前对象的 直接父类对象 的引用。 8.抽象类不能 创建 对象,该工作由抽象类派生的非抽象子类来实现。 9.如果父类中已有同名的 abstract 方法,则子类中就 不能 (能/不能)再有同名的抽象 方法。 10.abstract 类中不能有 private 访问权限的数据成员或成员方法。 11. interface 是声明接口的关键字,可以把它看成一个特殊类。接口中的数据成员默认的 修饰符是 public static final ,接口中的成员方法默认的修饰符是 public abstract 。 12.如果实现某接口的类不是 abstract 的抽象类,则在类的定义部分必须 实现 该接口的 所有抽象方法;如果实现某接口的类是 abstract 的抽象类,则它可以 不实现 该接口 所有的方法。 但是对于这个抽象类任何一个非抽象的子类而言, 它们父类所实现的接口 中的所有抽象方法以及自身所实现接口中的抽象方法都必须有实在的 方法体 。 13.包的作用有两个,一是 划分类名空间 ,二是 控制类之间的访问 。 14.封装也称 信息隐藏 ,是指类的设计者只为类的使用者提供类的可以访问的部分(包 括类的数据成员和成员方法) ,而把类中的其他成员 隐藏 起来,使用户不能访问的 机制。 15.Java 提供了 4 种访问权限来实现封装机制,即 private 、 protected 、 默认 和 public 。 16.Java 中提供两种多态机制, 重载 与 覆盖 。 17.当一个构造方法需要调用另一个构造方法时,可以使用关键字 this ,同时这个调用语 句应该是整个构造方法的 第一条 可执行语句。25 18.如果子类自己没有构造方法,那么父类也一定 没有 (有/没有)带参的构造方法,此 时它将继承父类的 无参构造方法 作为自己的构造方法;如果子类自己定义了构造方 法, 则在创建新对象时, 它将先执行 父类 的构造方法, 然后再执行自己的 构造方法 。 19.对于父类的含参数构造方法,子类可以通过在自己的构造方法中使用 super 关键字来 调用它,但这个调用语句必须是子类构造方法的 第一条 可执行语句。 20.创建一个名为 myPachkage 的包的语句为 package myP ,该语句应该放在程序第 一行 位置。 三、编程题 1.编写一个实现方法重载的程序。 【编程分析】重载的含义就是在一个类中定义多个具有相同方法名,不同参数列表的方法。 在下面程序中的类中定义了三个同名方法 area,分别用于求圆、矩形和三角形的面积。三个 方法具有不同的参数。 【参考程序】 public class X5_3_1{ public double area(double radius){ return Math.PI*radius* } public double area(double width, double height){ return width* } public double area(double a, double b, double c){ double s = (a+b+c)/2; return Math.sqrt(s*(s-a)*(s-b)*(s-c)); } public static void main(String[] args){ X5_3_1 shape = new X5_3_1(); System.out.println(&The area of circle is: &+shape.area(10)); System.out.println(&The area of rectangle is: &+shape.area(10,20)); System.out.println(&The area of triangle is: &+shape.area(10,15,20)); } } 【运行结果】 The area of circle is: 314.3 The area of rectangle is: 200.0 The area of triangle is: 72.07 2.编写一个实现方法覆盖的程序。 【编程分析】方法覆盖是指在子类中重新定义了父类中的方法。本例中在 Shape 类、Circle 类、 Cylinder 类中都定义了 area 方法, 而且 Cylinder 类继承了 Circle 类、 Circle 类继承了 Shape 类,从而实现了 area 方法的覆盖。 【参考程序】 abstract class Shape { abstract protected double area(); }26 class Circle extends Shape{ public Circle(float a) { r=a; } public double area(){ System.out.print(&Calculate the area of circle: &); return Math.PI*r*r; } } class Cylinder extends Circle { public Cylinder(float a,float b) { super(a); h=b; } public double area() { System.out.print(&Calculate the area of cylinder: &); return 2*Math.PI*r*r+2*Math.PI*r*h; } } public class EX5_3_2 { public static void main(String args[]) { Circle cl=new Circle(3); Cylinder cd=new Cylinder(2,5); System.out.println(cl.area()); System.out.println(cd.area()); } } 【运行结果】 Calculate the area of circle: 28.138 Calculate the area of cylinder: 87.21 3.编写一个实现数据成员隐藏的程序。 【编程分析】 数据成员的隐藏是指子类和父类都有一个相同的数据成员, 当子类对象调用该 数据成员时,默认调用子类的该成员,而不是父类的该成员,相当于隐藏了父类的该成员。 本例中 Hide 类中定义了数据成员 x,该类的子类 X_5_3_3 中也定义了数据成员 x,当子类 对象调用 x 时,调用的是子类的 x,而不是父类的 x。 【参考程序】 public class X5_3_3 extends Hide { int x = 200; public static void main(String args[]) { X5_3_3 obj = new X5_3_3 (); System.out.println(&x = &+obj.x); // 数据成员的隐藏 }27 } class Hide{ int x = 100; } 【运行结果】 x = 200 4.编写一个使用 this 和 super 关键字的程序。 【编程分析】this 关键字表示当前对象本身,而 super 关键字则是当前对象的直接父类对象。 本例程序中定义了两个类 X1 和 X2,其中都定义了成员变量 x、y。此时就需要区分父类与 子类的成员变量,采用 super 引用父类的成员变量和方法。 注意:父类和子类中都定义了 show()方法,如果没有特别指定,则是调用当前类的方法。 【参考程序】 public class X5_3_4{ public static void main(String[] args){ X2 x = new X2(5); x.setY(); x.show(); System.out.println(&super.y=&+x.getY()); // 输出父类数据成员 y System.out.println(&this.y=&+x.y); // 输出子类数据成员 y } } class X1{ int x,y; X1(int i){ x=i; y=x*2; } int getY(){ } void show(){ System.out.println(&x=&+x+& y=&+y); } } class X2 extends X1{ int x,y; X2(int j){ super(3); // 利用 super 来调用父类的构造方法 this.x=j; // 利用 this 来调用本类的数据成员 x } void show(){ System.out.println(&super.x=&+super.x+& this.x=&+x); // 输出父类和子类的属性 x }28 void setY(){ y=super.x+this.x; }// 引用父类和子类中的数据成员 x} 【运行结果】 super.x=3 this.x=5 super.y=6 this.y=8 5.编写一个人类 Person,其中包含姓名、性别和年龄的属性,包含构造方法以及显示姓 名、性别和年龄的方法。再编写一个学生类 Student,它继承 Person 类,其中包含学号属 性,包含构造方法以及显示学号的方法。最后编写一个主类 X5_3_5,包含 main()方法, 在 main()方法中定义两个学生 s1 和 s2 并给他们赋值,最后显示他们的学号、姓名、性别 以及年龄。 【编程分析】本题主要考察类的继承问题。 第一步:定义 Person 类。 第二步:定义 Student 类,该类继承 Person 类。 第三步:定义主类。 【参考程序】 public class X5_3_5 { public static void main(String[] args) { Student s1=new Student(&Zhangsan&,&Male&,20,&102A&); Student s2=new Student(&Lisi&,&Female&,18,&108S&); s1.show(); s1.showID(); s2.show(); s2.showID(); } } class Person{ S S public Person(String n,String s,int a){ name = sex = age = } void show(){ System.out.println(&name: &+name); System.out.println(&sex: &+sex); System.out.println(&age: &+age); } } class Student extends Person{29 String sID; public Student(String n,String s,int a,String sid){ super(n,s,a); sID = } void showID(){ System.out.println(&sID: &+sID); } } 【运行结果】 name: Zhangsan sex: Male age: 20 sID: 102A name: Lisi sex: Female age: 18 sID: 108S 6.编一个程序,包含以下文件。 (1)Shape.java 文件,在该文件中定义接口 Shape,该接口在 shape 包中。 属性:PI。 方法:求面积的方法 area()。 (2)Circle.java 文件,在该文件中定义圆类 Circle,该类在 circle 包中,实现 Shape 接口。 属性:圆半径 radius。 方法:构造方法;实现接口中求面积方法 area();求周长方法 perimeter()。 (3) “Cylinder.java”文件,在该文件中定义圆柱体类 Cylinder,该类口在 cylinder 包中, 继承圆类。 属性:圆柱体高度 height。 方法:构造方法;求表面积方法 area();求体积方法 volume()。 (4)X5_3_6.java 文件,在该文件中定义主类 X5_3_6,该类在默认包中,其中包含主 方法 main(),在主方法中创建两个圆类对象 cir1 和 cir2,具体尺寸自己确定,并显示圆的面 积和周长;再创建两个圆柱体类的对象 cy1 和 cy2,具体尺寸自己确定,然后分别显示圆柱 体 cy1 和 cy2 的底圆的面积和周长以及它们各自的体积和表面积。 【编程分析】本题主要考察接口、包、继承、封装等问题。编程步骤如下: 第一步:首先创建 p1 包,在其中创建 Shape 接口 // Shape.java 文件 package p1; // 创建 p1 包 public interface Shape{ // 定义 Shape 接口 … } 第二步:创建 Circle 类和 Cylinder 类,它们都定义在 p2 包中。 // Circle.java 文件 package p2; // 创建 p2 包 import p1.*;30 public class Circle implements Shape{ // 定义实现 Shape 接口的 Circle 类 … } // Cylinder.java 文件 package p2; public class Cylinder extends Circle{ // 创建继承 Circle 类的 Cylinder 类 … } 第三步:创建主类,在其中的 main()方法中创建对象,实现相应的功能。 // X5_3_6.java 文件 package p3; import p2.*; public class X5_3_6 { // 定义主类 public static void main(String[] args) { … } } 【参考程序】 // X5_3_6.java 文件 package p3; import p2.*; public class X5_3_6 { // 定义主类 public static void main(String[] args) { Circle cir1 = new Circle(120.5); Circle cir2 = new Circle(183.8); System.out.println(&cir1.area: &+cir1.area()); System.out.println(&cir1.perimeter: &+cir1.perimeter()); System.out.println(&cir2.area: &+cir2.area()); System.out.println(&cir2.perimeter: &+cir2.perimeter()); Cylinder cy1 = new Cylinder(27.3,32.7); Cylinder cy2 = new Cylinder(133.5,155.8); System.out.println(&cy1.area: &+cy1.area()); System.out.println(&cy1.volume: &+cy1.volume()); System.out.println(&cy2.area: &+cy2.area()); System.out.println(&cy2.volume: &+cy2.volume()); } } // Shape.java 文件 package p1; // 创建 p1 包 public interface Shape{ // 定义 Shape 接口 double PI=Math.PI; double area(); // 求面积方法 } // Circle.java 文件31 package p2; // 创建 p2 包 import p1.*; public class Circle implements Shape{ // 定义实现 Shape 接口的 Circle 类 // 半径 public Circle(double r){ radius = } public double area(){ // 实现 Shape 接口中的方法(这是必须的) return PI*radius* } public double perimeter(){ // 定义求圆周长的方法 return 2*PI* } } // Cylinder.java 文件 package p2; public class Cylinder extends Circle{ // 创建继承 Circle 类的 Cylinder 类 public Cylinder(double r,double h){ super(r); height = } public double area(){ return 2*PI*radius*radius+2*PI*radius* } public double volume(){ return PI*radius*radius* } } 【运行结果】 cir1.area: 287195 cir1.perimeter: 757.2 cir2.area:
cir2.perimeter: 59608 cy1.area: 160162 cy1.volume: 56173 cy2.area:
cy2.volume: 65466第6章一、选择题 1.给出下面程序代码:byte[] a1, a2[]; 32 byte a3[][]; byte[][] a4;下列数组操作语句中哪一个是不正确的?( A ) A.a2 = a1 B.a2 = a3 C.a2 = a4 D.a3 = a4 【解析】只有维数相同的数组才能相互赋值。 2.关于数组,下列说法中不正确的是( C ) 。 A.数组是最简单的复合数据类型,是一系列数据的集合 B.数组元素可以是基本数据类型、对象或其他数组 C.定义数组时必须分配内存 D.一个数组中所有元素都必须具有相同的数据类型 【解析】数组元素可以是基本数据类型、对象或其他数组。 3.设有下列数组定义语句: int a[] = {1, 2, 3}; 则对此语句的叙述错误的是( C ) 。 A.定义了一个名为 a 的一维数组 B.a 数组有 3 个元素 C.a 数组元素的下标为 1~3 D.数组中每个元素的类型都是整数 【解析】数组元素的下标是从 0 开始的。 4.执行语句:int[] x = new int[20];后,下面哪个说法是正确的?( C ) A.x[19]为空 B.x[19]未定义 C.x[19]为 0 D.x[0]为空 【解析】此语句定义了 x 数组后,x[0]~x[19]的值全部为 0。 5.下面代码运行后的输出结果为( A ) 。public class X6_1_5 { public static void main(String[] args) { AB aa = new AB(); AB bb = System.out.println(bb.equals(aa)); } } class AB{ int x = 100; }A.true B.false C.编译错误 D.100 【解析】同一个类的两个对象可以相互赋值,赋值后两个对象具有相同的存储空间,因 此是相同的。 6.已知有定义:String s=&I love&,下面哪个表达式正确?( A ) A.s += &you&; B.char c = s[1]; C.int len = s. D.String s = s.toLowerCase(); 【解析】字符串对象可以执行“+=”运算,但不能用 s[1]这种方式取其中的字符,也不 能用 length 求它的长度,可以用 length()求其长度,因此 B、C 不正确,不能再次定义 s 字 符串,因此 D 不正确。 二、填空题 1. Object 类 是所有类的直接或间接父类,它在 java.lang 包中。 2.System 类是一个功能强大、非常有用的特殊的类,它提供了 标准输入/输出 、 运行 时 系统信息等重要工具。这个类不能 实例化 ,即不能创建 System 类的对象,所 以它所有的属性和方法都是 static 类型,引用时以类名 System 为前缀即可。 3.Applet 由浏览器自动调用的主要方法 init , start , stop 和 destroy 分别对应了 Applet 从初始化、启动、暂停到消亡的生命周期的各个阶段 。 4.数组是一种 复合 数据类型,在 Java 中,数组是作为 对象 来处理的。数组是有限33 元素的有序集合,数组中的元素具有相同的 数据类型 ,并可用统一的 数组名 和 下标 来唯一确定其元素。 5.在数组定义语句中,如果[]在数据类型和变量名之间时,[]之后定义的所有变量都是 数组 类型,当[]在变量名之后时,只有[]之前的变量是 数组 类型,之后没有[]的则 不是数组类型。 6.数组初始化包括 静态 初始化和 动态 初始化两种方式。 7.利用 System 类中的 arraycopy() 方法可以实现数组元素的复制;利用 Arrays 类中的 sort() 和 binarySearch() 方法可以实现对数组元素的排序、查找等操作。 8.Java 语言提供了两种具有不同操作方式的字符串类: String 类和 StringBuffer 类。它 们都是 java.lang.Object 的子类。 三、写出下列程序的运行结果 1.public class X6_3_1 {public static void main(String[] args) { int a[]={12,39,26,41,55,63,72,40,83,95}; int i1=0,i2=0; for(int i=0;i&a.i++) if(a[i] %2 == 1) i1++; else i2++; System.out.println(i1+&\t&+i2); } 【运行结果】 6 42.public class X6_3_2 {public static void main(String[] args) { int a[]={36,25,48,14,55,40,32,66}; int b1,b2; b1=b2=a[0]; for(int i=1;i&a.i++) if ( a[i] &b1 ){ if ( b1 &b2 ) b2=b1; b1=a[i]; } System.out.println(b1+&\t&+b2); } } 【运行结果】 66 553.public class X6_3_3 {public static void main(String[] args) { int a[]={36,25,48,14,55,40,32,66 }; int b1,b2; b1=b2=a[0]; for (int i=1;i&a.i++) if ( a[i]&b1 ) { if ( b1&b2 ) b2=b1; b1=a[i]; } System.out.println(b1+&\t&+b2); } } 【运行结果】 14 254.public class X6_3_4 {34 public static void main(String[] args) { String str = &abcdabcabfgacd&; char[] a =str.toCharArray(); int i1 =0, i2=0, for(i=0;i&a.i++) { if(a[i] == 'a' ) i1++; if(a[i] == 'b' ) i2++; } System.out.println(i1+&\t&+i2); } } 【运行结果】 4 35.public class X6_3_5 {public static void main(String[] args) { String str =&abcdabcabdaeff&; char[] a = str.toCharArray(); int b[] = new int[5],i; for(i=0;i&a.i++) { switch (a[i]) { case 'a': b[0] ++; case 'b': b[1] ++; case 'c': b[2] ++; case 'd': b[3] ++; default : b[4] ++; } } for(i =0; i&5; i++) System.out.print(b[i]+&\t&); System.out.println(); } } 【运行结果】 4 3 public int int int for2236.public class X6_3_6 {static void main(String[] args) { a[] = {76,83,54,62,40,75,90,92,77,84}; b[] = {60,70,90,101}; c[]=new int[4],i; (i=0; i&a. i++) { int j =0; while (a[i] &= b[j] ) j ++; c[j] ++;} for (i=0; i&4; i++) System.out.print(c[i]+&\t&); System.out.println(); } } 【运行结果】 2 1527.public class X6_3_7 {public static void main(String[] args) { int a[][] = {{1,2,7,8},{5,6,11,12},{9,10,3,4}}; int m = a[0][0]; int ii = 0, jj = 0; for (int i=0;i&a.i++) 35 for(int j=0;j&a[i].j++) if ( a[i][j]&m ){ m =a[i][j]; ii =i; jj =j; } System.out.println(ii+&\t&+jj+&\t&+a[ii][jj]); } } 【运行结果】 1 3 12 8.public class X6_3_8 { public static void main(String[] args) { String[] a = {&student& ,&worker& ,&cadre& ,&soldier& ,&peasant& }; String s1,s2; s1 = s2 = a[0]; for( int i = 1; i&a.i ++) { if (a[i].compareTo(s1)&0) s1=a[i]; if (a[i].compareTo(s2)&0) s2=a[i]; } System.out.println(s1+&\t&+s2); } } 【运行结果】 worker cadre四、编程题 1.有一个数列,它的第一项为 0,第二项为 1,以后每一项都是它的前两项之和,试产生该 数列的前 20 项,并按逆序显示出来。 【编程分析】本例由于涉及到 20 项数据的存储,因此可以利用数组来实现。由于数列的各 项之间存在一定的关系,可以利用前两项来计算后面项。 【参考答案】 public class X6_4_1 { public static void main(String[] args) { int[] a = new int[20]; a[0]=0; a[1]=1; for(i=2;i&20;i++){ a[i]=a[i-1]+a[i-2]; // 求其余 18 项 } for(i=0;i&20;i++){ // 每一行显示 5 个元素 if(i%5 == 0) System.out.println(); System.out.print(a[i]+&\t&); } System.out.println(); } } 【运行结果】 0 1 1 2 336 5 8 13 21 34 55 89 144 233 377 610 987 81 2.首先让计算机随机产生出 10 个两位正整数,然后按照从小到大的次序显示出来。 【编程分析】首先利用 Math.random()方法,让计算机随机产生 10 个两位数的正整数,然后 编写一个排序方法,实现对数组的排序。 (也可以利用 java.utitl.Arrays 类提供的排序方法排 序) 【参考答案】 public class X6_4_2 { public static void main(String[] args) { int[] a = new int[10]; for(i=0;i&10;i++){ a[i]=10+(int)(90*Math.random()); // 产生 10 个两位数的随机数 } System.out.println(&随机产生的数据为:&); for(i=0;i&10;i++){ System.out.print(a[i]+&\t&); } System.out.println(&排序后的数据为:&); selectSort(a); // 排序方法的调用 for(i=0;i&10;i++){ System.out.print(a[i]+&\t&); } System.out.println(); } static void selectSort(int[] aa){ // 选择排序方法的定义 int i,j,k; for(i=1;i&aa.i++){ k=i-1; for(j=i;j&aa.j++){ if(aa[j]&aa[k]) k=j; } int x = aa[i-1]; aa[i-1]=aa[k]; aa[k]=x; } } } 【运行结果】 随机产生的数据为: 33 67 47 31 19 11 77 65 88 84 排序后的数据为: 11 19 31 33 47 65 67 77 84 8837 3.从键盘上输入 4 行 4 列的一个实数矩阵到一个二维数组中,然后求出主对角线上元素 之乘积以及副对角线上元素之乘积。 【编程分析】本例主要考察二维数组及其动态初始化的方法。 第一步:创建输入流对象。 InputStreamReader isr = new InputStreamReader(System.in); // 创建输入流对象 BufferedReader br=new BufferedReader(isr); 第二步:求主、付对角线乘积 for(i=0;i&M;i++){ main_product *= a[i][i]; // 计算主对角线元素的乘积 vice_product *= a[i][M-i-1]; // 计算付对角线元素的乘积 } 【参考程序】 import java.io.*; public class X6_4_3 { public static void main(String[] args) throws IOException{ final int M = 4; double[][] a = new double[M][M]; int i,j; double main_product=1.0,vice_product=1.0; InputStreamReader isr = new InputStreamReader(System.in); // 创建输入流对象 BufferedReader br=new BufferedReader(isr); for(i=0;i&M;i++) for(j=0;j&M;j++) a[i][j]=Double.parseDouble(br.readLine()); for(i=0;i&M;i++){ main_product *= a[i][i]; // 计算主对角线元素的乘积 vice_product *= a[i][M-i-1]; // 计算付对角线元素的乘积 } System.out.println(&主对角线乘积为:&+main_product); System.out.println(&付对角线乘积为:&+vice_product); } } 【运行结果】 1 2 3 4 5 6 7 8 9 10 1138 12 13 14 15 16 主对角线乘积为:1056.0 付对角线乘积为:3640.0?1 ?3 0 4 5? ?2 4.已知一个数值矩阵 A 为 ?6 2 1 7 ? ,另一个矩阵 B 为 A 为 ? ? ? ?0 ?4 1 5 8 ? ? ? ? ?9 ? 4 0 3? 5 1 6? ? ,求出 A 与 7 4 4? ? 3 6 0? ?3B 的乘积矩阵 C[3][4]并输出出来,其中 C 中的每个元素 C[i][j]等于 ? A[i ][k ]* B[k ][ j ] 。k ? 0【编程分析】 本例主要考察二维数组及其静态初始化的方法, 以及如何利用二维数组实现矩 阵的乘积。主要步骤如下: 第一步:定义三个二维数组 A、B、C,其中 A、B 为题目中给的数组,在定义的同时 进行静态初始化,C 数组为 A、B 的乘积,其行数为 A 矩阵的行数、列数为 B 矩阵的列数。 第二步:利用公式 C[i][j]= ? A[i ][k ]* B[k ][ j ] 求数组 C。3 k ? 0【参考程序】 import java.io.*; public class X6_4_4 { public static void main(String[] args) throws IOException{ final int M =3, N=4, P=4; int i,j,k; int[][] a = {{3,0,4,5},{6,2,1,7},{4,1,5,8}}; int[][] b = {{1,4,0,3},{2,5,1,6},{0,7,4,4},{9,3,6,0}}; int[][] c = new int[M][N]; for(i=0;i&M;i++) for(j=0;j&N;j++) for(k=0;k&P;k++) c[i][j] += a[i][k]*b[k][j]; for(i=0;i&M;i++){ for(j=0;j&N;j++) System.out.print(c[i][j]+&\t&); System.out.println(); } } } 【运行结果】 48 55 46 25 73 62 48 34 78 80 69 3839 5.从键盘上输入一个字符串,试分别统计出该字符串中所有数字、大写英文字母、小写英文 字母以及其他字符的个数并分别输出这些字符。 【编程分析】本题主要考察字符串的输入及字符串方法的应用。 第一步:建立输入流对象,实现从键盘输入字符串。 第二步:利用循环语句及字符串类中的方法 charAt(),对输入字符串中的每个字符进行 判断,并统计出各类字符的个数。 【参考程序】 import java.io.*; public class X6_4_5 { public static void main(String args[]) throws IOException{ InputStreamReader isr= new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String str = br.readLine(); int i, ditNo=0, upCharNo=0, loCharNo=0, otherCharNo=0; for(i=0;i&str.length();i++){ if(str.charAt(i)&='9' && str.charAt(i)&='0') ditNo++; else if(str.charAt(i)&='Z' && str.charAt(i)&='A') upCharNo++; else if(str.charAt(i)&='z' && str.charAt(i)&='a') loCharNo++; else otherCharNo++; } System.out.println(&ditNo = &+ditNo+&\t&+&upCharNo = &+upCharNo); System.out.println(&loCharNo=&+loCharNo+&\t&+&otherCharNo = &+otherCharNo); } } 【运行结果】 abcABCDE1234&&&&?..dF5 ditNo = 5 upCharNo = 6 loCharNo = 4 otherCharNo = 7 6.从键盘上输入一个字符串,利用字符串类提供的方法将大写字母转变为小写字母,小写字 母转变为大写字母,再将前后字符对换,然后输出最后结果。 【编程分析】本题主要考察 StringBuffer 类及其方法的应用。 第一步:创建输入流对象。 第二步:创建 StringBuffer 类对象。 第三步:利用 StringBuffer 类中的方法,实现将大写字母转变为小写字母,小写字母转 变为大写字母,以及将前后字符对换操作。 【参考程序】 import java.io.*; public class X6_4_6 { public static void main(String args[]) throws IOException{ InputStreamReader isr= new InputStreamReader(System.in);40 BufferedReader br = new BufferedReader(isr); StringBuffer strb = new StringBuffer(br.readLine()); for(i=0; i&strb.length(); i++){ char ch = strb.charAt(i); if(ch&='Z' && ch&='A') strb.setCharAt(i,(char)(ch+32)); if(ch&='z' && ch&='a') strb.setCharAt(i,(char)(ch-32)); } strb.reverse(); System.out.println(strb); } } 【运行结果】 abc123DEFG gfed321CBA第7章一、选择题 1.关于异常的含义,下列描述中最正确的一个是( D ) 。 A.程序编译错误 B.程序语法错误 C.程序自定义的异常事件 D.程序编译或运行时发生的异常事件 【解析】异常就是程序编译或运行时发生的异常事件。 2.自定义异常时,可以通过对下列哪一项进行继承?( C ) A.Error 类 B.Applet 类 C.Exception 类及其子类 D.AssertionError 类 【解析】自定义异常类时,该类必须继承 Exception 类及其子类。 3.对应 try 和 catch 子句的排列方式,下列哪一项是正确的?( A ) A.子类异常在前,父类异常在后 B.父类异常在前,子类异常在后 C.只能有子类异常 D.父类和子类不能同时出现在 try 语句块中 【解析】对应 try 和 catch 子句的排列方式,要求子类异常(范围小的异常)在前,父类异 常(范围大的异常)在后。 4.运行下面程序时,会产生什么异常?( A )public class X7_1_4 { public static void main(String[] args) { int x = 0; int y = 5/x; int[] z = {1,2,3,4}; int p = z[4]; } }A.ArithmeticException B.NumberFormatException C.ArrayIndexOutOfBoundsException D.IOException 【解析】当程序执行到“int y = 5/x”语句时,发生异常,程序中止执行,因此发生41 ArithmeticException 异常。 5.运行下面程序时,会产生什么异常?( C )public class X7_1_5 { public static void main(String[] args) { int[] z = {1,2,3,4}; int p = z[4]; int x = 0; int y = 5/x; } }A.ArithmeticException B.NumberFormatException C.ArrayIndexOutOfBoundsException D.IOException 【解析】当程序执行到“int p = z[4]”语句时,发生异常,程序中止执行,因此发生 ArrayIndexOutOfBoundsException 异常。 6.下列程序执行的结果是( B ) 。public class X7_1_6 { public static void main(String[] args) { try{ } finally{ System.out.println(&Finally&); } } }A.程序正常运行,但不输出任何结果 B.程序正常运行,并输出 Finally C.编译通过,但运行时出现异常 D.因为没有 catch 子句,因此不能通过编译 【解析】在执行 try-catch-finally 语句块时,最后必须执行 finally 语句块中的内容,而本程 序没有异常发生,因此程序正常运行,并输出 Finally。 7.下列代码中给出正确的在方法体内抛出异常的是( B ) 。 A.new throw Exception(& &); B.throw new Exception(& &); C.throws IOException(); D.throws IOE 【解析】 在方法体内抛出异常时只能使用 throw, 而不能使用 throws, 另外, “new Exception(& &)”是创建一个异常,因此 B 是正确的。 8.下列描述了 Java 语言通过面相对象的方法进行异常处理的好处,请选出不在这些好处范 围之内的一项( C ) A.把各种不同的异常事件进行分类,体现了良好的继承性 B.把错误处理代码从常规代码中分离出来 C.可以利用异常处理机制代替传统的控制流程 D.这种机制对具有动态运行特性的复杂程序提供了强有力的支持 【解析】异常处理机制不能代替传统的流程控制。 二、填空题 1.异常是在程序编译或运行中所发生的可预料或不可预料的异常事件,出现在编译阶段 的异常,称之为 编译时异常 ,出现在运行阶段的异常,称之为 运行时异常 。 2.根据异常的来源,可以把异常分为两种类型: 系统定义的运行时异常 和 用户自定义 异常 。 3.所有的 Java 异常类都是系统类库中的 Exception 类的子类。 4.抛出异常分为 由系统自动抛出异常 、 通过 throw 抛出异常 以及 通过 throws 抛出异 常 三种情况。42 5.Java 语言为我们提供了 try?catch 语句和 try?catch?finally 语句捕捉并处理异常。 6.一个 try 块后面可能会跟着若干个 catch 块,每个 catch 块都有一个异常类名作为参数。 7.如果 try 语句块产生的异常对象被第一个 catch 块所接收,则程序的流程将 转向第一个 catch 块 ,catch 语句块执行完毕后就 退出当前方法 ,try 块中尚未执行的语句和其 他的 catch 块将被 忽略 ;如果 try 语句块产生的异常对象与第一个 catch 块不匹配,系 统将自动转到 第二个 catch 块 进行匹配。 8.由于异常对象与 catch 块的匹配是按照 catch 块的 先后 顺序进行的,所以在处理多 异常时应注意认真设计各 catch 块的排列顺序。 9.throws 语句抛出的异常实际上是由 throws 语句修饰的方法内部的 throw 语句抛出的, 使用 throws 的主要目的是为了 通知所有预调用此方法的方法 。 三、编程题 1.编写一个系统自动抛出的、系统自行处理的数组大小为负数的程序。 【编程分析】 当编写的程序中没有处理异常的语句时,系统会自动抛出异常,并自行进行处理。 【参考程序】 public class X7_3_1 { public static void main(String[] args){ int[] a = new int[-5]; for(int i=0; i&a. i++){ a[i] = 10 + } } } 【运行结果】 Exception in thread &main& java.lang.NegativeArraySizeException at X7_3_1.main(X7_3_1.java:3) 2.编写一个由 throw 抛出的、系统自行处理的数组下标越界的程序。 【编程分析】 当由 throw 抛出异常后,如果程序本身不进行异常处理,Java 系统将采用默认的处理方 式进行处理。 【参考程序】 import java.io.*; public class X7_3_2 { public static void main(String[] args)throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); int[] a = new int[5]; int n = Integer.parseInt(br.readLine()); if(n&5) // 当输入的 n 值大于 5 时将由 throw 抛出异常 throw new ArrayIndexOutOfBoundsException(); System.out.println(&程序继续执行&); for(int i=0; i&n; i++){ a[i] = 10 + System.out.print(a[i]+&\t&);43 } System.out.println(); } } 【运行结果】 8 Exception in thread &main& java.lang.ArrayIndexOutOfBoundsException at C1.main(C1.java:9) 3.编写一个系统自动抛出的、由 try-catch 捕捉处理的分母为 0 以及数组下标越界的程序。 【编程分析】 当在 try 语句块中出现分母为 0 的情况时,如果在 catch 参数中有 ArithmeticException 对象,则就能捕捉到该异常并进行处理;同样,当在 try 语句块中出现分母为数组下标越界 的情况时,如果在 catch 参数中有 ArrayIndexOutOfBoundsException 对象,则就能捕捉到该 异常并进行处理。 【参考程序】 import java.io.*; public class X7_3_3 { public static void main(String args[]) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.println(&请输入两个整数:&); int a = Integer.parseInt( br.readLine()); int b = Integer.parseInt( br.readLine()); try{ // 当输入的 b 为 0 时,就会出现算术异常 System.out.println(a/b); } catch(ArithmeticException e){ // 捕捉算术异常并进行处理 System.out.println(&出现被 0 除的情况!&); } int c[] =new int[4], sum = 0; try{ // 当出现数组下标越界时就会抛出异常 for(int i = 0; i&5; i++) sum += c[i]; System.out.println( & sum = & + sum); } catch(ArrayIndexOutOfBoundsException e){// 捕捉数组下标越界异常并处理 System.out.println(&数组下标越界!&); } } } 【运行结果】 请输入两个整数: 20 0 出现被 0 除的情况!44 数组下标越界! 4.编写一个由 throw

我要回帖

更多关于 java 随机正整数 的文章

 

随机推荐