您好,欢迎来到乌哈旅游。
搜索
您的当前位置:首页Java2实用教程第5版习题解答

Java2实用教程第5版习题解答

来源:乌哈旅游


Java-2解答

实用教程(第版)习题5

习题解答

习题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 = '\쫾'; F. char ch = '\တ0'

5.下列程序中哪些【代码】是错误的?2345 public class E {

public static void main(String args[]) {

int x = 8;

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};

b = a;

System.out.println(\"数组度:\"+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】 } }

[] //

b的长

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+\ } }

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+\ } }

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<88881.的最大正整数n。 public class Xiti1 {

public static void main(String args[]) {

double sum=0,a=1; 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;jif(sum==i)

System.out.println(\"完数:\"+i); } } }

5.public class Xiti5 {

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;

} hello() { } }

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;

System.out.println(x); } 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){ 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) { this.y = 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; return sum; } }

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[]) {

A a=new A();

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是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)方法,调

用时实参是法。⑥ pc调用diskshow(), 方CPU PC speed:int cpu:CPU setSpeed(int):void HD:HardDisk getSpeed():int setCPU(CPU):void setHardDisk(HardDisk):void HardDisk show():void amount:int

setAmount(int):void getAmount():int 图4.33 PC与CPU和HardDisk关联UML图 CPU.java 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图。 Animal Simulator cry():void playSound(Animal):void getAnimalName():String

 编写主类Application(用户程序)

在主类Application的main方法中至少包含如下代码:

cry():void e 图5.18 UML类图 Dog Cat cry():void

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】,结果。

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】2】的输出【代码

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());

Simulator playSound(Animal):void <> Dog cry():void e 图6.14 UML类图 Animal cry():void getAnimalName():String Cat cry():void Animal.java

public interface 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\ System.out.printf(\"%d个数的平均值是%f\\n\ } }

习题8(第8章)

一、问答题

1.\"\\hello\"是正确的字符串常量吗?

2.\"你好KU\".length()和\"\\n\\\".length()的值分别是多少? 3

\"Hello\".equals(\"hello\")

\"java\".equals(\"java\")的值分别是多少? 4.\"Bird\".compareTo(\"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. float 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);

} }

4.对于如下代码,下列哪个叙述是正确的?a A. 程序出现编译错误。

B.无编译错误,在命令行执行程序:“java E I love this game”,程序输出this。

C.无编译错误,在命令行执行程序:“java E let us go”,程序无运行异常。

D.无编译错误,在命令行执行程序:“java E 0 1 2 3 4 5 6 7 8 9”程序输出3。 public class E {

public static void main (String args[]) { String s1 = args[1]; String s2 = args[2]; String s3 = args[3]; System.out.println(s3); } }

B选项输出的实际是game,因为下标从0开始;

C选项发生数组下标越界异常,因为并没有给arg[3]赋值

5.下列哪个叙述是错误的?c

A. \"9dog\".matches(\"\\\\ddog\")的值是true。 B.\"12hello567\".replaceAll(\"[123456789]+\\")返回的字符串是@hello@。

C. new Date(1000)对象含有的时间是公元后1000小时的时间

D. \"\\\\hello\\n\"是正确的字符串常量。

String对象调用public boolean matches(String regex)方法可以判断当前String对象的字符序列是否和参数regex指定的正则表达式匹配。\\d代表0-9中的任何一个数字。所以A选项是匹配的。

replaceAll(String regex,String replacement)方法返回一个新的String对象,把当前String对象的字符序列中所有和参数regex匹配的

子字符序列,用参数replacement的字符序列替换后得到字符序列。

B选项中将1-9数字序列替换为@,返回的字符串就是@hello@。

C选项1000表示公元后1000毫秒的时间,公元时间是1970-01-01 0时。

1.A。2.C。3.B。4.D。5.C。 三、阅读程序 1.【代码】:苹果。 2.【代码】:Love:Game。

3.【代码1】:15。【代码2】:abc我们。 4.【代码】:13579。 5.【代码】:9javaHello。 6.属于上机实习程序,解答略。 7.属于上机实习程序,解答略。

四、编程题 1.字符串调用public String toUpperCase()方法返回一个字符串,该字符串把当前字符串中的

小写字母变成大写字母;.字符串调用public String toLowerCase()方法返回一个字符串,该字符串把当前字符串中的大写字母变成小写字母。String类的public String concat(String str)方法返回一个字符串,该字符串是把调用该方法的字符串与参数指定的字符串连接。编写一个程序,练习使用这3个方法。

2.String类的public char charAt(int index)方法可以得到当前字符串index位置上的一个字符。编写程序使用该方法得到一个字符串中的第一个和最后一个字符。

3.计算某年、某月、某日和某年、某月、某日之间的天数间隔。要求年、月、日使用main方法的参数传递到程序中(见例子4)。 4.编程练习Math类的常用方法。

5.编写程序剔除一个字符串中的全部非数字字符,例如,将形如“ab123you”的非数字字符全部剔除,得到字符串“123”(参看例子10)。 6.使用Scanner类的实例解析字符串:\"数学87分,物理76分,英语96分\"中的考试成绩,并计算出总成绩以及平均分数(参看例子14)。

1.public class E {

public static void main (String args[ ]) { String s1,s2,t1=\"ABCDabcd\"; s1=t1.toUpperCase(); s2=t1.toLowerCase(); System.out.println(s1); System.out.println(s2); String s3=s1.concat(s2); System.out.println(s3); } }

2. public class E {

public static void main (String args[ ]) { String s=\"ABCDabcd\"; char cStart=s.charAt(0);

char cEnd = s.charAt(s.length()-1); System.out.println(cStart); System.out.println(cEnd); } }

3. import java.util.*;

public class E {

public static void main (String args[ ]) { int year1,month1,day1,year2,month2,day2; try{ year1=Integer.parseInt(args[0]); month1=Integer.parseInt(args[1]); day1=Integer.parseInt(args[2]); year2=Integer.parseInt(args[3]); month2=Integer.parseInt(args[4]); day2=Integer.parseInt(args[5]); }

catch(NumberFormatException e) { year1=2012; month1=0; day1=1; year2=2018; month2=0; day2=1; }

Calendar calendar=Calendar.getInstance(); calendar.set(year1,month1-1,day1); long timeYear1=calendar.getTimeInMillis(); calendar.set(year2,month2-1,day2); long timeYear2=calendar.getTimeInMillis();

long 相隔天数=Math.abs((timeYear1-timeYear2)/(1000*60*60*24)); System.out.println(\"\"+year1+\"年\"+month1+\"月\"+day1+\"日和\"+

year2+\"年\"+month2+\"月\"+day2+\"日相隔\"+相隔天数+\"天

\"); } }

4. import java.util.*;

public class E {

public static void main (String args[ ]) { double a=0,b=0,c=0; a=12; b=24;

c=Math.asin(0.56); System.out.println(c); c=Math.cos(3.14); System.out.println(c); c=Math.exp(1); System.out.println(c); c=Math.log(8); System.out.println(c); } }

5.public class E {

public static void main (String args[ ]) { String str = \"ab123you你是谁?\"; String regex = \"\\\\D+\"; str = str.replaceAll(regex,\"\"); System.out.println(str); }

}

6. import java.util.*;

public class E {

public static void main(String args[]) {

String cost = \"数学87分,物理76分,英语96分\"; Scanner scanner = new Scanner(cost); scanner.useDelimiter(\"[^0123456789.]+\"); double sum=0; int count =0;

while(scanner.hasNext()){

try{ double score = scanner.nextDouble(); count++; sum = sum+score; System.out.println(score); }

catch(InputMismatchException exp){ String t = scanner.next(); } }

System.out.println(\"总分:\"+sum+\"分\"); System.out.println(\"平均分:\"+sum/count+\"分\"); } }

习题9(第9章)

一、问答题

1.JFrame类的对象的默认布局是什么布局? 2.一个容器对象是否可以使用add方法添加一

个JFrame窗口?

3.JTextField可以触发什么事件?

4.JTextArea中的文档对象可以触发什么类型的事件?

5.MouseListener接口中有几个方法? 6.处理鼠标拖动触发的MouseEvent事件需使用哪个接口?

1.Frame容器的默认布局是BorderLayout布局。 2.不可以。 3.ActionEvent。 4.DocumentEvent。 5.5个。

6.MouseMotionListener。 二、选择题

1.下列哪个叙述是不正确的?c

A.一个应用程序中最多只能有一个窗口。 B.JFrame创建的窗口默认是不可见的。 C.不可以向JFrame窗口中添加JFame窗口。 D.窗口可以调用setTitle(String s)方法设置窗口的标题。

2.下列哪个叙述是不正确的?a A.JButton

对象可以使用使用

addActionLister(ActionListener l)方法将没有实现ActionListener接口的类的实例注册为自己的监视器。

B.对于有监视器的JTextField文本框,如果该文本框处于活动状态(有输入焦点)时,用户即使不输入文本,只要按回车(Enter)键也可以触发ActionEvent事件

C.监视KeyEvent事件的监视器必须实现KeyListener接口。

D.监视WindowEvent事件的监视器必须实现WindowListener接口。 3.下列哪个叙述是不正确的?a

A.使用FlowLayout布局的容器最多可以添加5个组件。

B.使用BorderLayout布局的容器被划分成5个区域。

C.JPanel的默认布局是FlowLayout布局。 D.JDialog的默认布局是BorderLayout布局。 1.C。2.A。3.A。4.D。5.C。

三、编程题

1.编写应用程序,有一个标题为“计算”的窗口,窗口的布局为FlowLayout布局。窗口中添加两个文本区,当我们在一个文本区中输入若干个数时,另一个文本区同时对你输入的数进行求和运算并求出平均值,也就是说随着你输入的变化,另一个文本区不断地更新求和及平均值。

2.编写一个应用程序,有一个标题为“计算”的窗口,窗口的布局为FlowLayout布局。设计四个按钮,分别命名为“加”、“差”、“积、”、“除”,另外,窗口中还有三个文本框。单击相应的按钮,将两个文本框的数字做运算,在第三个文本框中显示结果。要求处理NumberFormatException异常。 3.参照例子15编写一个体现MVC结构的GUI程序。首先编写一个封装梯形类,然后再编写一个窗口。要求窗口使用三文本框和一个文本区为梯形对象中的数据提供视图,其中三个文本框用来显示和更新梯形对象的上底、下底和高;文本区对象用来显示梯形的面积。窗口中有一个按钮,用户单击该按钮后,程序用3个文本框中的数据分别作为梯形对象的上底、下底和高,并将计算出的梯形的面积显示在文本区中。

1. import java.awt.*;

import javax.swing.event.*; import javax.swing.*; import java.awt.event.*; public class E {

public static void main(String args[]) { Computer fr=new Computer(); } }

class Computer extends JFrame implements DocumentListener { JTextArea text1,text2; int count=1;

double sum=0,aver=0; Computer() {

setLayout(new FlowLayout()); text1=new JTextArea(6,20); text2=new JTextArea(6,20); add(new JScrollPane(text1)); add(new JScrollPane(text2)); text2.setEditable(false);

(text1.getDocument()).addDocumentListener(this); setSize(300,320); setVisible(true); validate();

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); }

public void changedUpdate(DocumentEvent e) { String s=text1.getText();

String []a =s.split(\"[^0123456789.]+\"); sum=0; aver=0;

for(int i=0;itry { sum=sum+Double.parseDouble(a[i]); }

catch(Exception ee) {} }

aver=sum/count; text2.setText(null); text2.append(\"\\n和:\"+sum); text2.append(\"\\n平均值:\"+aver); }

public void removeUpdate(DocumentEvent e){ changedUpdate(e); }

public void insertUpdate(DocumentEvent e){ changedUpdate(e); } 2. }

import java.awt.*;

import javax.swing.event.*; import javax.swing.*; import java.awt.event.*; public class E {

public static void main(String args[]) {

ComputerFrame fr=new ComputerFrame(); } }

class ComputerFrame extends JFrame implements ActionListener { JTextField text1,text2,text3;

JButton buttonAdd,buttonSub,buttonMul,buttonDiv; JLabel label;

public ComputerFrame() { setLayout(new FlowLayout()); text1=new JTextField(10); text2=new JTextField(10); text3=new JTextField(10);

label=new JLabel(\" \ label.setBackground(Color.green); add(text1); add(label); add(text2); add(text3);

buttonAdd=new JButton(\"加\"); buttonSub=new JButton(\"减\"); buttonMul=new JButton(\"乘\"); buttonDiv=new JButton(\"除\"); add(buttonAdd); add(buttonSub); add(buttonMul); add(buttonDiv);

buttonAdd.addActionListener(this); buttonSub.addActionListener(this); buttonMul.addActionListener(this); buttonDiv.addActionListener(this); setSize(300,320); setVisible(true); validate();

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

}

public void actionPerformed(ActionEvent e) { double n;

if(e.getSource()==buttonAdd) { double n1,n2;

try{ n1=Double.parseDouble(text1.getText()); n2=Double.parseDouble(text2.getText()); n=n1+n2;

text3.setText(String.valueOf(n)); label.setText(\"+\"); }

catch(NumberFormatException ee) { text3.setText(\"请输入数字字符\"); } }

else if(e.getSource()==buttonSub) { double n1,n2;

try{ n1=Double.parseDouble(text1.getText()); n2=Double.parseDouble(text2.getText()); n=n1-n2;

text3.setText(String.valueOf(n)); label.setText(\"-\"); }

catch(NumberFormatException ee) { text3.setText(\"请输入数字字符\"); } }

else if(e.getSource()==buttonMul) {double n1,n2;

try{ n1=Double.parseDouble(text1.getText()); n2=Double.parseDouble(text2.getText()); n=n1*n2;

text3.setText(String.valueOf(n)); label.setText(\"*\"); }

catch(NumberFormatException ee) { text3.setText(\"请输入数字字符\"); } }

else if(e.getSource()==buttonDiv) {double n1,n2;

try{ n1=Double.parseDouble(text1.getText()); n2=Double.parseDouble(text2.getText()); n=n1/n2;

text3.setText(String.valueOf(n)); label.setText(\"/\"); }

catch(NumberFormatException ee) { text3.setText(\"请输入数字字符\"); } } validate(); } 3.}

import java.awt.*;

import java.awt.event.*; import javax.swing.*; public class E {

public static void main(String args[]){ Window win = new Window(); win.setTitle(\"使用MVC结构\"); win.setBounds(100,100,420,260); } }

class Window extends JFrame implements ActionListener { Lader lader; //模型

JTextField textAbove,textBottom,textHeight; //视图 JTextArea showArea; //视图 JButton controlButton; //控制器 Window() { init();

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }

void init() {

lader = new Lader();

textAbove = new JTextField(5); textBottom = new JTextField(5); textHeight = new JTextField(5); showArea = new JTextArea(); controlButton=new JButton(\"计算面积\"); JPanel pNorth=new JPanel(); pNorth.add(new JLabel(\"上底:\")); pNorth.add(textAbove);

pNorth.add(new JLabel(\"下底:\")); pNorth.add(textBottom); pNorth.add(new JLabel(\"高:\")); pNorth.add(textHeight);

pNorth.add(controlButton);

controlButton.addActionListener(this); add(pNorth,BorderLayout.NORTH);

add(new JScrollPane(showArea),BorderLayout.CENTER); }

public void actionPerformed(ActionEvent e) { try{

double above = Double.parseDouble(textAbove.getText().trim()); double bottom = Double.parseDouble(textBottom.getText().trim()); double height = Double.parseDouble(textHeight.getText().trim()); lader.setAbove(above) ; lader.setBottom(bottom); lader.setHeight(height);

double area = lader.getArea(); showArea.append(\"面积:\"+area+\"\\n\"); }

catch(Exception ex) {

showArea.append(\"\\n\"+ex+\"\\n\"); } } }

class Lader {

double above,bottom,height; public double getArea() {

double area = (above+bottom)*height/2.0; return area; }

public void setAbove(double a) { above = a; }

public void setBottom(double b) { bottom = b; }

public void setHeight(double c) { height = c; } }

习题10(第10章)

一、问答题

1. 如果准备按字节读取一个文件的内容,应当使用FileInputStream流还是FileReader流?

2. FileInputStream流的read方法和FileReader流的read方法有何不同? 3. BufferedReader流能直接指向一个文件吗? 4. 使

ObjectInputStream

ObjectOutputStream类有哪些注意事项? 5. 怎样使用输入、输出流克隆对象?

1.使用FileInputStream。

2.FileInputStream按字节读取文件,FileReader按字符读取文件。 3.不可以。

4.使用对象流写入或读入对象时,要保证对象是序列化的。

5.使用对象流很容易得获取一个序列化对象的

克隆,只需将该对象写入到对象输出流,那么用对象输入流读回的对象一定是原对象的一个克隆。 二、选择题

1.下列哪个叙述是正确的? c A.创建File对象可能发生异常。

B.BufferedRead流可以指向FileInputStream流。

C.BufferedWrite流可以指向FileWrite流。 D.RandomAccessFile流一旦指向文件,就会刷新该文件。

2.为了向文件hello.txt尾加数据,下列哪个是正确创建指向hello.txt的流? b

A.try { OutputStream out = new FileOutputStream (\"hello.txt\"); }

catch(IOException e){}

B.try { OutputStream out = new FileOutputStream (\"hello.txt\ }

catch(IOException e){}

C.try { OutputStream out = new FileOutputStream (\"hello.txt\ }

catch(IOException e){}

D.try { OutputStream out = new OutputStream (\"hello.txt\ }

catch(IOException e){}

1.C。2.B。 三、阅读程序

1.【代码1】:51。【代码2】:0。

2.【代码1】:3。【代码2】:abc。【代码3】:1。【代码4】:dbc。 3.上机实习题,解答略。

四、编程题

1.文件E.java的长度是51个字节,请说出E类中标注的【代码1】,【代码2】的输出结果。 import java.io.*; public class E {

public static void main(String args[]) { File f = new File(\"E.java\");

try{ RandomAccessFile in = new RandomAccessFile(f,\"rw\");

System.out.println(f.length()); //【代码1】

FileOutputStream out = new FileOutputStream(f);

System.out.println(f.length()); //【代码2】 }

catch(IOException e) {

System.out.println(\"File read Error\"+e); } } }

2.请说出E类中标注的【代码1】~【代码4】的输出结果。 import java.io.*; public class E {

public static void main(String args[]) { int n=-1;

File f =new File(\"hello.txt\"); byte [] a=\"abcd\".getBytes(); try{ FileOutputStream out=new FileOutputStream(f); out.write(a); out.close(); FileInputStream in=new FileInputStream(f);

byte [] tom= new byte[3]; int m = in.read(tom,0,3);

System.out.println(m); //【代码1】

String s=new String(tom,0,3);

System.out.println(s); //【代码2】

m = in.read(tom,0,3);

System.out.println(m); //【代码3】

s=new String(tom,0,3);

System.out.println(s); //【代码4】 }

catch(IOException e) {} } }

3.了解打印流。我们已经学习了数据流,其特点是用Java的数据类型读写文件,但使用数据流写成的文件用其它文件阅读器无法进行阅读(看上去是乱码)。PrintStream类提供了一个过滤输出流,该输出流能以文本格式显示Java的数据类型。上机实习下列程序: import java.io.*; public class E {

public static void main(String args[]) { try{ File file=new File(\"p.txt\"); FileOutputStream out=new FileOutputStream(file); PrintStream ps=new PrintStream(out);

ps.print(12345.6789);

ps.println(\"how are you\"); ps.println(true); ps.close(); }

catch(IOException e){} } }

四、编写程序

1.使用RandomAccessFile流将一个文本文件倒置读出。

2.使用Java的输入、输出流将一个文本文件的内容按行读出,每读出一行就顺序添加行号,并写入到另一个文件中。

3.参考例子16,解析一个文件中的价格数据,并计算平均价格,比如该文件的内容如下:

商品列表:电视机洗衣机,2567

冰箱,3562元元//台台

,6573元/台 1. import java.io.*;

public class E {

public static void main(String args[]) { File f=new File(\"E.java\");;

try{ RandomAccessFile random=new RandomAccessFile(f,\"rw\"); random.seek(0); long m=random.length(); while(m>=0) { m=m-1; random.seek(m); int c=random.readByte(); if(c<=255&&c>=0)

System.out.print((char)c); else { m=m-1; random.seek(m); byte cc[]=new byte[2]; random.readFully(cc);

System.out.print(new String(cc)); } } }

catch(Exception exp){} } }

2. import java.io.*;

public class E {

public static void main(String args[ ]) { File file=new File(\"E.java\"); File tempFile=new File(\"temp.txt\");

try{ FileReader inOne=new FileReader(file);

BufferedReader inTwo= new BufferedReader(inOne); FileWriter tofile=new FileWriter(tempFile); BufferedWriter out= new BufferedWriter(tofile); String s=null; int i=0;

s=inTwo.readLine(); while(s!=null) { i++;

out.write(i+\" \"+s); out.newLine(); s=inTwo.readLine(); }

inOne.close(); inTwo.close(); out.flush(); out.close(); tofile.close(); }

catch(IOException e){} } 3.}

import java.io.*;

import java.util.*; public class E {

public static void main(String args[]) { File file = new File(\"a.txt\"); Scanner sc = null; double sum=0; int count = 0;

try { sc = new Scanner(file);

sc.useDelimiter(\"[^0123456789.]+\"); while(sc.hasNext()){

try{ double price = sc.nextDouble(); count++; sum = sum+price; System.out.println(price); }

catch(InputMismatchException exp){ String t = sc.next(); } }

System.out.println(\"平均价格:\"+sum/count); }

catch(Exception exp){ System.out.println(exp); } } }

习题11(第11章)

一、问答题

1.问答题

(1)怎样启动Mysql数据库服务器? 1.在MySQL安装目录的bin子目录下键入mysqld或mysqld -nt 启动MySQL数据库服务器。

(2)JDBC-MySQL数据库驱动的jar文件因该拷贝到哪个目录中? (3)预处理语句的好处是什么? 3.减轻数据库内部SQL语句解释器的负担。

(4)什么叫事务,事务处理步骤是怎样的? 2.编程题

1.参照例子3,按出生日期排序mess表的记录。

2.借助例子6中的Query类,编写一个应用程序来查询MySQL数据库,程序运行时用户从命令行输入数据库名和表名,例如: java 主类 数据库 表

2.复制到JDK的扩展目录中(即JAVA_HOME环境变量指定的JDK,见第1章的1.3.3),比如:E:\\jdk1.8\\jre\\lib\\ext。

4.事务由一组SQL语句组成,所谓事务处理是指:应用程序保证事务中的SQL语句要么全部都执行,要么一个都不执行。事务处理步骤是调用:(1)连接对象用setAutoCommit()方法关闭自动提交模式,(2)连接对象用commit()方法处理事务,(3)连接对象用rollback()方法处理事务失败。 二、编程题

1. 同时用到了例子2中的GetDBConnection类。

import java.sql.*; import java.sql.*; public class BianCheng1 {

public static void main(String args[]) { Connection con; Statement sql; ResultSet rs;

con = GetDBConnection.connectDB(\"students\ if(con == null ) return; String sqlStr =

\"select * from mess order by birthday\"; try {

sql=con.createStatement(); rs = sql.executeQuery(sqlStr); while(rs.next()) {

String number=rs.getString(1); String name=rs.getString(2); Date date=rs.getDate(3); float height=rs.getFloat(4); System.out.printf(\"%s\\ System.out.printf(\"%s\\ System.out.printf(\"%s\\ System.out.printf(\"%.2f\\n\ }

con.close(); }

catch(SQLException e) { System.out.println(e); } } }

2. 同时用到了例子6中的Query类。import javax.swing.*; public class BianCheng2 {

public static void main(String args[]) { String [] tableHead;

String [][] content; JTable table ;

JFrame win= new JFrame(); Query findRecord = new Query(); findRecord.setDatabaseName(args[0]); findRecord.setSQL(\"select * from \"+args[1]); content = findRecord.getRecord(); tableHead=findRecord.getColumnName(); }

table = new JTable(content,tableHead); win.add(new JScrollPane(table)); win.setBounds(12,100,400,200); win.setVisible(true);

win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- wuhaninfo.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务