(完整word版)Java-2实用教程(第5版)习题解答
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题解答
习题1(第1章)
一、问答题
1.Java语言的主要贡献者是谁?
2.开发Java应用程序需要经过哪些主要步骤?
3.Java源文件是由什么组成的?一个源文件中必须要有public类吗?
4.如果JDK的安装目录为D:\jdk,应当怎样设置path和classpath的值?
5.Java源文件的扩展名是什么?Java字节码的扩展名是什么?
6.如果Java应用程序主类的名字是Bird,编译之后,应当怎样运行该程序?
7.有哪两种编程风格,在格式上各有怎样的特点?
1.James Gosling
2.需3个步骤:
1)用文本编辑器编写源文件。
2)使用javac编译源文件,得到字节码文件。
3)使用解释器运行程序。
3.源文件由若干个类所构成。
对于应用程序,必须有一个类含有public static void main(String args[])的方法,含有该方法的类称为应用程序的主类。
不一定,但至多有一个public类。
4.set classpath=D:\jdk\jre\lib\rt.jar;.;
5。
java和class
6。
java Bird
7.独行风格(大括号独占行)和行尾风格(左大扩号在上一行行尾,右大括号独占行)
二、选择题
1.B。
2.D。
1.下列哪个是JDK提供的编译器?
A) java.exe
B) javac。
exe
C) javap。
exe
D) javaw.exe
2.下列哪个是Java应用程序主类中正确的main方法?A)public void main (String args[])
B) static void main (String args[ ])
C)public static void Main (String args[])
D) public static void main (String args[])
三、阅读程序
阅读下列Java源文件,并回答问题。
public class Person {
void speakHello(){
System。
out。
print(”您好,很高兴认识您”); System.out。
println(” nice to meet you");
}
}
class Xiti {
public static void main(String args[]) {
Person zhang = new Person();
zhang。
speakHello();
}
}
(a)上述源文件的名字是什么?
(b)编译上述源文件将生成几个字节码文件?这些字节码文件的名字都是什么?
(c)在命令行执行java Person得到怎样的错误提示?执行java xiti得到怎样的错误提示?执行java Xiti。
class得到怎样的错误提示?执行java Xiti得到怎样的输出结果?
1.(a)Person。
java.(b)两个字节码,分别是Person.class和Xiti.class。
(c)得到“NoSuchMethodError”,得到“NoClassDefFoundError:Xiti/class”,得到“您好,很高兴认识您nice to meet you”
习题2(第2章)
一、问答题
1.什么叫标识符?标识符的规则是什么?false是否可以作为标识符。
2.什么叫关键字?true和false是否是关键字?请说出6个关键字。
3.Java的基本数据类型都是什么?
4.float型常量和double型常量在表示上有什么区别?
5。
怎样获取一维数组的长度,怎样获取二维数组中一维数组的个数.
1.用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符.标识符由字母、下划线、美元符号和数字组成,第一个字符不能是数字。
false不是标识符。
2.关键字就是Java语言中已经被赋予特定意义的一些单词,不可以把关键字作为名字来用。
true和false不是关键字。
6个关键字:class implements interface enum extends abstract。
3.boolean,char,byte,short,int,long,float,double.
4.float常量必须用F或f为后缀。
double常量用D或d为后缀,但允许省略后缀。
5.一维数组名.length。
二维数组名.length.
二、选择题
2.下列哪三项是正确的float变量的声明?adf
A。
float foo = -1;
B. float foo = 1。
0;
C. float foo = 42e1;
D。
float foo = 2.02f;
E。
float foo = 3.03d;
F。
float foo = 0x0123;
3.下列哪一项叙述是正确的?b
A。
char型字符在Unicode表中的位置范围是0至32767
B. char型字符在Unicode表中的位置范围是0至65535
C. char型字符在Unicode表中的位置范围是0至65536
D。
char型字符在Unicode表中的位置范围是—32768至32767 4.以下哪两项是正确的char型变量的声明?be
A. char ch = ”R”;
B. char ch = '\\’
C。
char ch = ’ABCD’;
D. char ch = "ABCD”;
E. char ch = '\ucafe’;
F。
char ch = '\u10100'
5.下列程序中哪些【代码】是错误的?2345
public class E {
public static void main(String args[]){
byte b = 127;//【代码1】
b = x;//【代码2】
x = 12L;//【代码3】
long y=8.0;//【代码4】
float z=6.89 ;//【代码5】
}
}
6.对于int a[] = new int[3];下列哪个叙述是错误的?b
A. a.length的值是3.
B。
a[1]的值是1。
C. a[0]的值是0。
D. a[a。
length-1]的值等于a[2]的值。
1.C.2.ADF。
3.B。
4.BE。
5.【代码2】【代码3】【代码4】【代码5】。
6.B。
三、阅读或调试程序
1.属于操作题,解答略.
2.属于操作题,解答略。
3.属于操作题,解答略。
4。
下列程序标注的【代码1】,【代码2】的输出结果是什么?
public class E {
public static void main (String args[]){
long[]a = {1,2,3,4};
long[]b = {100,200,300,400,500};
System。
out.println(”数组b的长度:”+b。
length);//【代码1】
System.out。
println(”b[0]="+b[0]); //【代码2】}
}
5。
下列程序标注的【代码1】,【代码2】的输出结果是什么?
public class E {
public static void main(String args[]) {
int []a={10,20,30,40},b[]={{1,2},{4,5,6,7}};
b[0]= a;
b[0][1]= b[1][3];
System。
out。
println(b[0][3]); //【代码1】
System.out.println(a[1]);//【代码2】
}
}
4.【代码1】:4。
【代码2】:b[0]=1。
5.【代码1】:40.【代码2】:7
四、编写程序
1.编写一个应用程序,给出汉字‘你'、‘我’、‘他’在Unicode表中的位置。
2.编写一个Java应用程序,输出全部的希腊字母。
1。
public class E {
public static void main(String args[]){
System.out.println((int)'你’);
System.out.println((int)'我');
System.out.println((int)’他');
}
}
2. public class E {
public static void main (String args[]){
char cStart=’α',cEnd=’ω’;
for(char c=cStart;c〈=cEnd;c++)
System。
out。
print(” ”+c);
}
}
习题3(第3章)
一、问答题
1.关系运算符的运算结果是怎样的数据类型?
2.if语句中的条件表达式的值是否可以是int型?3.while语句中的条件表达式的值是什么类型?4.switch语句中必须有default选项码?
5.在while语句的循环体中,执行break语句的效果是什么?6.可以用for语句代替while语句的作用吗?1.boolean
2.不可以
3.boolean
4。
不是必须的
5.结束while语句的执行
6.可以
二、选择题
1.下列哪个叙述是正确的?a
A。
5.0/2+10的结果是double型数据。
B.(int)5.8+1。
0的结果是int型数据。
C.'苹'+ ’果'的结果是char型数据。
D.(short)10+'a'的结果是short型数据.
2.用下列哪个代码替换程序标注的【代码】会导致编译错误?c
A.m-—>0 B.m++>0 C.m = 0 D.m>100&&true
public class E {
public static void main (String args[]) {
int m=10,n=0;
while(【代码】) {
n++;
}
}
}
3.假设有int x=1;以下哪个代码导致“可能损失精度,找到int需要char"这样的编译错误。
c A.short t=12+'a'; B.char c =’a'+1; C.char m =’a'+x;D.byte n ='a'+1; 1.A. 2.C。
3.C。
三、阅读程序
1.下列程序的输出结果是什么?
public class E {
public static void main (String args[ ]) {
char x=’你’,y='e',z='吃’;
if(x〉’A'){
y='苹';
z='果';
}
else
y=’酸’;
z='甜';
System。
out。
println(x+”,"+y+”,”+z);
}
}
2.下列程序的输出结果是什么?
public class E {
public static void main (String args[ ]) {
char c = '\0’;
for(int i=1;i<=4;i++){
switch(i){
case 1: c = ’J';
System。
out。
print(c);
case 2: c = ’e’;
System。
out.print(c);
break;
case 3: c = 'p';
System。
out.print(c);
default:System。
out。
print(”好");
}
}
}
}
3.下列程序的输出结果是什么?
public class E {
public static void main (String []args){int x = 1,y = 6;
while (y-—〉0){
x-—;
}
System.out.print("x="+x+",y=”+y);
}
}
x=0,y=5
x=-1,y=4
x=—2,y=3
x=—3,y=2
x=-4,y=1
x=—5,y=0
x=-5,y=-1
1.你,苹,甜
2.Jeep好好
3.x=-5,y=—1
四、编程序题
1.编写应用程序求1!+2!+…+10!.
2.编写一个应用程序求100以内的全部素数。
3.分别用do-while和for循环计算1+1/2!+1/3!+1/4!……的前20项和。
4.一个数如果恰好等于它的因子之和,这个数就称为“完数"。
编写应用程序求1000之内的所有完数。
5.编写应用程序,使用for循环语句计算8+88+888…前10项之和。
6.编写应用程序,输出满足1+2+3…+n<8888的最大正整数n.
1.public class Xiti1 {
int i=1;
while(i〈=20) {
sum=sum+a;
i++;
a=a*i;
}
System。
out。
println(”sum="+sum);
}
}
2.public class Xiti2 {
public static void main(String args[]) {
int i,j;
for(j=2;j〈=100;j++) {
for(i=2;i<=j/2;i++){
if(j%i==0)
break;
}
if(i>j/2){
System。
out.print(” ”+j);
}
}
}
}
3.class Xiti3 {
public static void main(String args[]){
double sum=0,a=1,i=1;
do { sum=sum+a;
i++;
a=(1.0/i)*a;
}
while(i〈=20);
System.out。
println("使用do—while循环计算的sum=”+sum);
for(sum=0,i=1,a=1;i<=20;i++) {
a=a*(1。
0/i);
sum=sum+a;
}
System。
out.println(”使用for循环计算的sum="+sum);
}
}
4.public class Xiti4 {
public static void main(String args[]) {
int sum=0,i,j;
for(i=1;i〈=1000;i++) {
for(j=1,sum=0;j<i;j++){
if(i%j==0)
sum=sum+j;
}
if(sum==i)
System.out。
println(”完数:”+i);
}
}
public static void main(String args[]){
int m=8,item=m,i=1;
long sum=0;
for(i=1,sum=0,item=m;i<=10;i++) {
sum=sum+item;
item=item*10+m;
}
System。
out.println(sum);
}
}
6.public class Xiti6 {
public static void main(String args[]) {
int n=1;
long sum=0;
while(true) {
sum=sum+n;
n++;
if(sum>=8888)
break;
}
System。
out。
println("满足条件的最大整数:”+(n-1));
}
}
习题4(第4章)
一、问答题
1.面向对象语言有哪三个特性?
2.类名应当遵守怎样的编程风格?
3.变量和方法的名字应当遵守怎样的编程风格?
4.类体内容中声明成员变量是为了体现对象的属性还是行为?
5.类体内容中定义的非构造方法是为了体现对象的属性还是行为?
6.什么时候使用构造方法?构造方法有类型吗?
7.类中的实例变量在什么时候会被分配内存空间?
8.什么叫方法的重载?构造方法可以重载吗?
9.类中的实例方法可以操作类变量(static变量)吗?类方法(static方法)可以操作实例变量吗?可以。
10.类中的实例方法可以用类名直接调用吗?
8.一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。
可以.
9.
10.不可以。
11.简述类变量和实例变量的区别。
12.this关键字代表什么?this可以出现在类方法中吗?
1。
封装、继承和多态。
2.当类名由几个单词复合而成时,每个单词的首字母使用大写。
3.名字的首单词的首字母使用小写,如果变量的名字由多个单词组成,从第2个单词开始的其它单词的首字母使用大写.
4.属性
5.行为
6.用类创建对象时.没有类型
7.用类创建对象时.
8.一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同.可以。
9.可以。
不可以。
10.不可以。
11.一个类通过使用new运算符可以创建多个不同的对象,不同的对象的实例变量将被分配不同的内存空间。
所有对象的类变量都分配给相同的一处内存,对象共享类变量。
12.代表调用当前方法的对象。
不可以。
1.下列哪个叙述是正确的?b
A.Java应用程序由若干个类所构成,这些类必须在一个源文件中.
B.Java应用程序由若干个类所构成,这些类可以在一个源文件中,也可以分布在若干个源文件中,其中
必须有一个源文件含有主类。
C.Java源文件必须含有主类。
D.Java源文件如果含有主类,主类必须是public类。
2.下列哪个叙述是正确的? d
A.成员变量的名字不可以和局部变量的相同.
B.方法的参数的名字可以和方法中声明的局部变量的名字相同。
C.成员变量没有默认值。
D.局部变量没有默认值。
3.对于下列Hello类,哪个叙述是正确的?d
A.Hello类有2个构造方法。
B.Hello类的int Hello()方法是错误的方法.
C.Hello类没有构造方法.
D.Hello无法通过编译,因为其中的hello方法的方法头是错误的(没有类型).
class Hello {
Hello(int m){
}
int Hello() {
return 20;
}
}
}
4.对于下列Dog类,哪个叙述是错误的?d
A.Dog(int m)与Dog(double m)互为重载的构造方法。
B.int Dog(int m)与void Dog(double m)互为重载的非构造方法。
C.Dog类只有两个构造方法,而且没有无参数的构造方法。
D.Dog类有3个构造方法。
class Dog {
Dog(int m){
}
Dog(double m){
}
int Dog(int m){
return 23;
}
void Dog(double m){
}
}
构造方法是一种特殊的方法,与一般的方法不同是:
1.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有.
2.构造方法的调用是在创建一个对象时使用new操作进行的。
构造方法的作用是初始化对象.
3.不能被static、final、synchronized、abstract和native修饰。
构造方法不能被子类继承。
5.下列哪些类声明是错误的?cd
A)class A
B)public class A
C)protected class A
D)private class A
6.下列A类中【代码1】~【代码5】哪些是错误的?1 4
class Tom {
private int x = 120;
protected int y = 20;
int z = 11;
private void f() {
x = 200;
void g() {
x = 200;
System.out。
println(x);
}
}
public class A {
public static void main(String args[]){
Tom tom = new Tom();
tom.x = 22; //【代码1】
tom.y = 33;//【代码2】
tom。
z = 55; //【代码3】
tom.f(); //【代码4】
tom.g();//【代码5】
}
}
7.下列E类的类体中哪些【代码】是错误的。
4
class E {
int x; //【代码1】
long y = x; //【代码2】
public void f(int n){
int m; //【代码3】
int t = n+m; //【代码4】
}
}
1.B。
2.D.3.D。
4.D。
5.CD。
6.【代码1】【代码4】。
7.【代码4】。
三、阅读程序
1.说出下列E类中【代码1】~【代码3】的输出结果。
class Fish {
int weight = 1;
}
class Lake {
Fish fish;
void setFish(Fish s){
void foodFish(int m) {
fish。
weight=fish.weight+m;
}
}
public class E {
public static void main(String args[]){
Fish redFish = new Fish();
System。
out。
println(redFish.weight); //【代码1】
Lake lake = new Lake();
lake。
setFish(redFish);
lake。
foodFish(120);
System。
out。
println(redFish.weight);//【代码2】
System.out。
println(lake。
fish.weight); //【代码3】}
}
2.请说出A类中System。
out。
println的输出结果.
class B {
int x = 100,y = 200;
public void setX(int x) {
x = x;
}
public void setY(int y){
public int getXYSum() {
return x+y;
}
}
public class A {
public static void main(String args[]) {
B b = new B();
b.setX(-100);
b。
setY(-200);
System.out。
println("sum="+b。
getXYSum());
}
}
3.请说出A类中System。
out。
println的输出结果。
class B {
int n;
static int sum=0;
void setN(int n) {
this.n=n;
}
int getSum() {
for(int i=1;i〈=n;i++)
sum=sum+i;
}
public class A {
public static void main(String args[]) {
B b1=new B(),b2=new B();
b1。
setN(3);
b2。
setN(5);
int s1=b1.getSum();
int s2=b2.getSum();
System。
out。
println(s1+s2);
}
}
4.请说出E类中【代码1】,【代码2】的输出结果n的输出结果. class A {
double f(int x,double y) {
return x+y;
}
int f(int x,int y){
return x*y;
}
}
public class E {
public static void main(String args[]){
System。
out。
println(a.f(10,10)); //【代码1】
System。
out。
println(a。
f(10,10。
0));//【代码2】
}
}
5.上机实习下列程序,了解可变参数。
public class E {
public static void main(String args[]) {
f(1,2);
f(-1,—2,—3,—4);//给参数传值时,实参的个数很灵活
f(9,7,6);
}
public static void f(int .。
. x){//x是可变参数的代表,代表若干个int型参数for(int i=0;i<x。
length;i++){//x.length是x代表的参数的个数System.out.println(x[i]);//x[i]是x代表的第i个参数(类似数组) }
}
}
6.类的字节码进入内存时,类中的静态块会立刻被执行.实习下列程序,了解静态块. class AAA {
static {//静态块
System.out.println(”我是AAA中的静态块!”);
}
}
public class E {
static { //静态块
System.out.println("我是最先被执行的静态块!");
}
public static void main(String args[]){
AAA a= new AAA(); //AAA的字节码进入内存
System.out。
println("我在了解静态(static)块");
}
1.【代码1】:1,【代码2】:121,【代码3】:121。
2.sum=—100。
3。
27.
4.【代码1】:100,【代码2】:20.0。
5.上机实习题目,解答略。
6。
上机实习题目,解答略。
四、编程题
用类描述计算机中CPU的速度和硬盘的容量。
要求Java应用程序有4个类,名字分别是PC,CPU和HardDisk和Test,其中Test是主类.
●PC类与CPU和HardDisk类关联的UML图(图4.33)
其中,CPU类要求getSpeed()返回speed的值;要求setSpeed(int m)方法将参数m的值赋值给speed.HardDisk类要求getAmount()返回amount的值,要求setAmount(int m)方法将参数m的值赋值给amount.PC类要求setCUP(CPU c) 将参数c的值赋值给cpu,要求setHardDisk (HardDisk h)方法将参数h的值赋值给HD,要求show()方法能显示cpu的速度和硬盘的容量。
●主类Test的要求
①main方法中创建一个CPU对象cpu,cpu将自己的speed设置为2200,
②main方法中创建一个HardDisk对象disk,disk将自己的amount设置为200,
③main方法中创建一个PC对象pc,
④pc调用setCUP(CPU c)方法,调用时实参是cpu,
⑤pc调用setHardDisk (HardDisk h)方法,调用时实参是disk,
public class CPU {
int speed;
int getSpeed(){
return speed;
}
public void setSpeed(int speed){
this。
speed = speed;
}
}
HardDisk。
java
public class HardDisk {
int amount;
int getAmount() {
return amount;
}
public void setAmount(int amount){
this.amount = amount;
}
}
PC.java
public class PC {
CPU cpu;
HardDisk HD;
void setCPU(CPU cpu) {
this.cpu = cpu;
}
void setHardDisk(HardDisk HD){
this.HD = HD;
}
void show(){
System。
out.println("CPU速度:”+cpu。
getSpeed());
System.out.println("硬盘容量:”+HD。
getAmount());
}
}
Test。
java
public class Test {
public static void main(String args[]){
CPU cpu = new CPU();
HardDisk HD=new HardDisk();
cpu。
setSpeed(2200);
HD.setAmount(200);
PC pc =new PC();
pc.setCPU(cpu);
pc。
setHardDisk(HD);
pc.show();
}
}
习题5(第5章)
一、问答题
1.子类可以有多个父类吗?
2.java。
lang包中的Object类是所有其他类的祖先类吗?
3.如果子类和父类不在同一个包中,子类是否继承父类的友好成员?
4.子类怎样隐藏继承的成员变量?
5.子类重写方法的规则是怎样的?重写方法的目的是什么?
6.父类的final方法可以被子类重写吗?
7.什么类中可以有abstract方法?
8.对象的上转型对象有怎样的特点?
9.一个类的各个子类是怎样体现多态的?
10.面向抽象编程的目的和核心是什么?
1.不可以。
2.是。
3.不继承。
4.声明与父类同名的成员变量。
5.子类重写的方法类型和父类的方法的类型一致或者是父类的方法的类型的子类型,重写的方法的名字、参数个数、参数的类型和父类的方法完全相同。
重写方法的目的是隐藏继承的方法,子类通过方法的重写可
以把父类的状态和行为改变为自身的状态和行为。
6.不可以.
7.abstract类.
8.上转型对象不能操作子类新增的成员变量,不能调用子类新增的方法。
上转型对象可以访问子类继承或隐藏的成员变量,可以调用子类继承的方法或子类重写的实例方法。
9.通过重写方法。
10.面向抽象编程目的是为了应对用户需求的变化,核心是让类中每种可能的变化对应地交给抽象类的一个子类类去负责,从而让该类的设计者不去关心具体实现。
二、选择题
1.下列哪个叙述是正确的?c
E.子类继承父类的构造方法。
F.abstract类的子类必须是非abstract类。
G.子类继承的方法只能操作子类继承和隐藏的成员变量。
H.子类重写或新增的方法也能直接操作被子类隐藏的成员变量。
2.下列哪个叙述是正确的?d
A.final 类可以有子类.
B.abstract类中只可以有abstract方法。
C.abstract类中可以有非abstract方法,但该方法不可以用final修饰.
D.不可以同时用final和abstract修饰同一个方法。
E.允许使用static修饰abstract方法。
用final修饰的类是不允许被继承的,A错误
abstract类中也可以有普通成员方法,B错误
abstract类中的非abstract方法是可以用final修饰的,而abstract方法是不可以被final修饰的,C错误
D同上,所以正确
不允许使用static修饰abstract方法,E错误。
3.下列程序中注释的哪两个代码(A,B,C,D)是错误的(无法通过编译)?cd
class Father {
private int money =12;
float height;
int seeMoney(){
return money ; //A
}
}
class Son extends Father {
int height;
int lookMoney() {
int m = seeMoney();//B
return m;
}
}
class E {
public static void main(String args[]) {
Son erzi = new Son();
erzi.money = 300;//C
erzi。
height = 1。
78F;//D
}
}
4.假设C是B的子类,B是A的子类,cat是C类的一个对象,bird是B类的一个对象,下列哪个叙述是错误的?d
E.cat instanceof B的值是true。
F.bird instanceof A的值是true.
G.cat instanceof A的值是true.
H.bird instanceof C的值是true.
5.下列程序中注释的哪个代码(A,B,C,D)是错误的(无法通过编译)?b
class A {
static int m;
static void f(){
m = 20 ;//A
}
}
class B extends A {
void f() //B
{m = 222 ;//C
}
}
class E {
public static void main(String args[]) {
A。
f();// D
}
}
6。
下列代码中标注的(A,B,C,D)中,哪一个是错误的?b
abstract class Takecare {
protected void speakHello() {}//A
public abstract static void cry();//B
static int f(){return 0 ;}//C
abstract float g(); //D
}
7.下列程序中注释的哪个代码(A,B,C,D)是错误的(无法通过编译)?d abstract class A {
abstract float getFloat ();//A
void f() //B
{}
}
public class B extends A {
private float m = 1.0f;//C
private float getFloat () //D
{return m;
}
}
8.将下列哪个代码(A,B,C,D)放入程序中标注的【代码】处将导致编译错误?b A。
public float getNum(){return 4。
0f;}
B。
public void getNum(){ }
C。
public void getNum(double d){ }
D。
public double getNum(float d){return 4。
0d;}
class A {
public float getNum(){
return 3.0f;
}
}
public class B extends A {
【代码】
}
9.对于下列代码,下列哪个叙述是正确的?a
A. 程序提示编译错误(原因是A类没有不带参数的构造方法)
B。
编译无错误,【代码】输出结果是0。
C。
编译无错误,【代码】输出结果是1。
D。
编译无错误,【代码】输出结果是2。
class A {
public int i=0;
A(int m) {
i = 1;
}
}
public class B extends A {
B(int m){
i = 2;
}
public static void main(String args[]){
B b = new B(100);
System。
out。
println(b。
i);//【代码】
}
}
1.C。
2.D。
3.CD。
4.D。
5.B。
6.B。
7.D。
8.B。
9.A.
三、阅读程序
1.请说出E类中【代码1】,【代码2】的输出结果。
class A {
double f(double x,double y){
return x+y;
}
}
class B extends A {
double f(int x,int y){
return x*y;
}
}
public class E {
public static void main(String args[]){
B b=new B();
System。
out。
println(b.f(3,5));//【代码1】
System。
out。
println(b。
f(3。
0,5。
0));//【代码2】}
}
2.说出下列B类中【代码1】,【代码2】的输出结果。
class A {
public int getNumber(int a){
return a+1;
}
}
class B extends A {
public int getNumber (int a) {
return a+100;
}
public static void main (String args[]) {
A a =new A();
System.out.println(a.getNumber(10));//【代码1】
a = new B();
System。
out。
println(a.getNumber(10));//【代码2】}
}
3.请说出E类中【代码1】~【代码4】的输出结果。
class A {
double f(double x,double y){
return x+y;
}
static int g(int n){
return n*n;
}
}
class B extends A {
double f(double x,double y) {
double m = super。
f(x,y);
return m+x*y;
}
static int g(int n) {
int m = A。
g(n);
return m+n;
}
}
public class E {
public static void main(String args[]){
B b = new B();
System。
out.println(b。
f(10.0,8。
0)); //【代码1】
System.out.println(b。
g(3)); //【代码2】
A a = new B();
System.out.println(a。
f(10.0,8.0)); //【代码3】
System。
out。
println(a.g(3));//【代码4】
}
}
4.请说出E类中【代码1】~【代码3】的输出结果。
class A {
int m;
int getM() {
return m;
}
int seeM() {
return m;
}
}
class B extends A {
int m ;
int getM() {
return m+100;
}
}
public class E {
public static void main(String args[]){
B b = new B();
b.m = 20;
System.out.println(b.getM()); //【代码1】
A a = b;
a。
m = -100; // 上转型对象访问的是被隐藏的m
System。
out。
println(a。
getM()); //【代码2】上转型对象调用的一定是子类重写的getM()方法
System。
out。
println(b。
seeM());//【代码3】子类继承的seeM()方法操作的m是被子类隐藏的m }
}
1.【代码1】:15.0。
【代码2】:8。
0.
2.【代码1】:11。
【代码2】:11。
3.【代码1】:98。
0。
【代码2】:12.【代码3】:98.0。
【代码4】:9.
4.【代码1】:120。
【代码2】:120。
【代码3】:-100.
四、编程题
设计一个动物声音“模拟器",希望模拟器可以模拟许多动物的叫声。
要求如下:
编写抽象类Animal
Animal抽象类有2个抽象方法cry()和getAnimaName(),即要求各种具体的动物给出自己的叫声和种
类名称。
●编写模拟器类Simulator
该类有一个playSound(Animal animal)方法,该方法的参数是Animal类型。
即参数animal可以调用Animal的子类重写的cry()方法播放具体动物的声音、调用子类重写的getAnimalName()方法显示动物种类的名称。
●编写Animal类的子类:Dog,Cat类
图5.18是Simulator、Animal、Dog、Cat的UML图。
●编写主类Application(用户程序)
在主类Application的main方法中至少包含如下代码:
Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator。
playSound(new Cat());
Animal。
java
public abstract class Animal {
public abstract void cry();
public abstract String getAnimalName();
}
Simulator.java
public class Simulator {
public void playSound(Animal animal){
System。
out.print("现在播放”+animal。
getAnimalName()+"类的声音:”);
animal.cry();
}
}
Dog.java
public class Dog extends Animal {
public void cry() {
System。
out。
println("汪汪。
汪汪");
}
public String getAnimalName() {
return ”狗";
}
}
Cat.java
public class Cat extends Animal {
public void cry() {
System。
out。
println(”喵喵..。
喵喵”);
}
public String getAnimalName(){
return "猫”;
}
}
Application。
java
public class Example5_13 {
public static void main(String args[]){
Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());
}
}
习题6(第6章)
一、问答题
1.接口中能声明变量吗?
2.接口中能定义非抽象方法吗?
3.什么叫接口的回调?
4.接口中的常量可以不指定初值吗?
5.可以在接口中只声明常量,不声明抽象方法吗?
1.不能.
2.不能。
3.可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中.那么该接口变量就可以调用被类实现的接口中的方法.
4.不可以。
5.可以。
二、选择题
1.下列哪个叙述是正确的d
A。
一个类最多可以实现两个接口.
B.如果一个抽象类实现某个接口,那么它必须要重写接口中的全部方法。
C.如果一个非抽象类实现某个接口,那么它可以只重写接口中的部分方法。
D.允许接口中只有一个抽象方法。
非抽象类实现接口必须要重写接口中的全部方法,否则要把该类设置为抽象类,换句话说抽象类实现一个接口是可以不用重写接口中的全部方法的。
2。
下列接口中标注的(A,B,C,D)中,哪两个是错误的?ab
interface Takecare {
protected void speakHello();//A
public abstract static void cry(); //B
int f();//C
abstract float g();//D
}
A中抽象方法的访问修饰符只能用public。
B中abstract和static不能共存。
3.将下列(A,B,C,D)哪个代码替换下列程序中的【代码】不会导致编译错误。
a
A.public int f(){return 100+M;}
B.int f(){return 100;}
C.public double f(){return 2.6;}。
D.public abstract int f();
interface Com {
int M = 200;
int f();
}
class ImpCom implements Com {
【代码】
}
接口中的抽象方法默认是public类,那么类在重写接口方法时不仅要去掉abstract修饰符,给出方法体,而且方法的访问权限一定要明显地用public来修饰(不能降低访问权限).
C选项改变了返回值类型,不属于方法重写
1.D.2.AB.3.B。
三、阅读程序
1.【代码1】:15。
0。
【代码2】:8。
1.请说出E类中【代码1】,【代码2】的输出结果。
interface A {
double f(double x,double y);
}
class B implements A {
public double f(double x,double y) {
return x*y;
}
int g(int a,int b) {
return a+b;
}
}
public class E {
public static void main(String args[]) {
A a = new B();
System.out.println(a.f(3,5)); //【代码1】
B b = (B)a;
System。
out.println(b.g(3,5));//【代码2】
}
}
2.请说出E类中【代码1】,【代码2】的输出结果。
interface Com {
int add(int a,int b);
}
abstract class A {
abstract int add(int a,int b);
}
class B extends A implements Com{
public int add(int a,int b) {
return a+b;
}
}
public class E {
public static void main(String args[]) {
B b = new B();
Com com = b;
System。
out.println(com.add(12,6)); //【代码1】
A a = b;
System.out。
println(a。
add(10,5));//【代码2】
}
}
2.【代码1】:18。
【代码2】:15。
四、编程题
该题目和第5章习题5的编程题类似,只不过这里要求使用接口而已。
设计一个动物声音“模拟器",希望模拟器可以模拟许多动物的叫声。
要求如下:
●编写接口Animal
Animal接口有2个抽象方法cry()和getAnimaName(),即要求实现该接口的各种具体动物类给出自己的叫声和种类名称。
●编写模拟器类Simulator
该类有一个playSound(Animal animal)方法,该方法的参数是Animal类型。
即参数animal可以调用实现Animal接口类重写的cry()方法播放具体动物的声音、调用重写的getAnimalName()方法显示动物种类的名称。
●编写实现Animal接口的Dog类和Cat类
图6。
14是Simulator、Animal、Dog、Cat的UML图.
●编写主类Application(用户程序)
在主类Application的main方法中至少包含如下代码:
Simulator simulator = new Simulator();
simulator。
playSound(new Dog());
simulator.playSound(new Cat());
Animal {
public abstract void cry();
public abstract String getAnimalName();
}
Simulator。
java
public class Simulator {
public void playSound(Animal animal){
System。
out。
print(”现在播放”+animal。
getAnimalName()+"类的声音:");
animal.cry();
}
}
Dog.java
public class Dog implements Animal {
public void cry() {
System.out。
println(”汪汪...汪汪”);
}
public String getAnimalName() {
return "狗";
}
}
Cat.java
public class Cat implements Animal {
public void cry() {
System.out.println(”喵喵。
..喵喵");
}
public String getAnimalName() {
return "猫";
}
}
Application.java
public class Example5_13 {
public static void main(String args[]) {
Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());
}
}
习题7(第7章)
一、问答题
1.内部类的外嵌类的成员变量在内部类中仍然有效吗?2.内部类中的方法也可以调用外嵌类中的方法吗?3.内部类的类体中可以声明类变量和类方法吗?不可以4.匿名类一定是内部类吗?
1.有效。
2.可以。
3.不可以。
4.一定是.
二、选择题
1.下列代码标注的(A,B,C,D)中哪一个是错误的?c class OutClass {
int m = 1;
static float x;//A
class InnerClass {
int m =12; //B
static float n =20.89f; //C
InnerClass(){
}
void f() {
m = 100;
}
}
void cry() {
InnerClass tom = new InnerClass(); //D
}
}
2.下列哪一个叙述是正确的?c
A.和接口有关的匿名类可以是抽象类.
B.和类有关的匿名类还可以额外地实现某个指定的接口。
C.和类有关的匿名类一定是该类的一个非抽象子类。
D.和接口有关的匿名类的类体中可以有static成员变量。
1.C。
2.C。
三、阅读程序
1.大家好,祝工作顺利!
2.p是接口变量.
3.你好fine thanks。
4.属于上机实习程序,解答略。
四、编程题
第3章例子9的程序允许用户在键盘依次输入若干个数字(每输入一个数字都需要按回车键确认),程序将计算出这些数的和以及平均值。
请在第3章的例子9中增加断言语句,当用户输入的数字大于100或小于0时,程序立刻终止执行,并提示这是一个非法的成绩数据。
import java.util。
*;
public class E {
public static void main (String args[ ]){
Scanner reader = new Scanner(System。
in);
double sum = 0;
int m = 0;
while(reader.hasNextDouble()){
double x = reader。
nextDouble();
assert x< 100:”数据不合理";
m = m+1;
sum = sum+x;
}
System.out。
printf("%d个数的和为%f\n”,m,sum);
System。
out.printf(”%d个数的平均值是%f\n”,m,sum/m);
}
}
习题8(第8章)
一、问答题
1.”\hello”是正确的字符串常量吗?
2.”你好KU”.length()和"\n\t\t”.length()的值分别是多少?
3."Hello”.equals("hello")和”java”。
equals(”java”)的值分别是多少?
4.”Bird"。
compareT o(”Bird fly")的值是正数还是负数?
负数.String对象调用compareTo(String s)方法,按字典序与指定的String对象s的字符序列比较大小。
如果当前String对象的字符序列与s的相同,该方法返回0;如果大于s的字符序列,该方法返回正值,如果小于s的字符序列,该方法返回负值。
5.”I love this game”。
contains(”love”)的值是true吗?
6."RedBird”.indexOf("Bird")的值是多少?"RedBird”。
indexOf(”Cat”)的值是多少?
String 对象的字符序列索引位置从0开始。
String对象调用方法indexOf(String str)从当前String对象的字符序列的0索引位置开始检索首次出现str的字符序列的位置,并返回该位置.如果没有检索到,该方法返回的值是—1。
7.执行Integer。
parseInt(”12。
9”);会发生异常吗?
1.不是。
"\\hello"是。
2.4和3。
3.false和true。
4.负数。
5.是true.
6.3和—1。
7.会发生NumberFormatException异常。
二、选择题
1.下列哪个叙述是正确的?a
A. String 类是final 类,不可以有子类.
B. String 类在java.util包中.
C. "abc"=="abc”的值是false .
D. "abc".equals("Abc”)的值是true
String类在java。
lang包中;”abc”==”abc"的值是true,字符常量存储在常量池中,他们的引用是相同的;而”abc"。
equals(“Abc”)的值是false,区分大小写的。
2.下列哪个表达式是正确的(无编译错误)?b
A。
int m =Float.parseFloat(”567");
B。
int m =Short。
parseShort("567")
C。
byte m =Integer。
parseInt("2");
D。
f loat m =Float。
parseDouble(”2。
9”)
parseXXX(String s)方法是将由“数字"字符组成的字符序列转化成对应的数据类型.
A中不能将float类型赋值给int
C中不能讲int赋值给byte
D中Float类不存在parseDouble方法
3.对于如下代码,下列哪个叙述是正确的?b
A. 程序编译出现错误。
B. 程序标注的【代码】的输出结果是bird。
C。
程序标注的【代码】的输出结果是fly。
D。
程序标注的【代码】的输出结果是null.
public class E{
public static void main(String[]args){
String strOne=”bird";
String strTwo=strOne;
strOne=”fly”;
System。
out。
println(strTwo);。