JAVA语言与面向对象程序设计课后习题答案

更新时间:2024-06-05 16:53:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第1章 面向对象软件开发概述

1.简述面向过程问题求解和面向对象问题求解的异同。试列举出面向对象和面向过程的编程语言各两种。

答:面向过程问题求解,以具体的解题过程为研究和实现的主体,其思维特点更接近于计算机;面向对象的问题求解,则是以―对象‖为主体,―对象‖是现实世界的实体或概念在计算机逻辑中的抽象表示,更接近于人的思维特点。

面向过程的编程语言:C,Pascal, Foratn。 面向对象的编程语言:C++, Java,C#。

2.简述对象、类和实体及它们之间的相互关系。尝试从日常接触到的人或物中抽象出对象的概念。

答:面向对象技术中的对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现。类是同种对象的集合与抽象。类是一种抽象的数据类型,它是所有具有一定共性的对象的抽象,而属于类的某一个对象则被称为是类的一个实例,是类的一次实例化的结果。如果类是抽象的概念,如―电视机‖,那么对象就是某一个具体的电视机,如―我家那台电视机‖。

3.对象有哪些属性?什么是状态?什么是行为?二者之间有何关系?设有对象―学生‖,试为这个对象设计状态与行为。

答:对象都具有状态和行为。

对象的状态又称为对象的静态属性,主要指对象内部所包含的各种信息,也就是变量。每个对象个体都具有自己专有的内部变量,这些变量的值标明了对象所处的状态。

行为又称为对象的操作,它主要表述对象的动态属性,操作的作用是设置或改变对象的状态。

学生的状态:姓名、性别、年龄、所在学校、所在系别、通讯地址、电话号码、入学成绩等;

学生的行为:自我介绍、入学注册、选课、参加比赛等。

4.对象间有哪三种关系?对象―班级‖与对象―学生‖是什么关系?对象―学生‖与对象―大学生‖是什么关系?

答:对象间可能存在的关系有三种:包含、继承和关联。 对象―班级‖与对象―学生‖是包含关系。 对象―学生‖与对象―大学生‖是继承关系。

5.有人说―父母‖和―子女‖之间是继承的关系。这种说法是否正确?为什么?

答:―父母‖和―子女‖之间不是面向对象意义上的―继承‖关系。因为这里的继承关系是―is a‖的关系,―男人‖与―人‖之间可以说是继承关系。

6.面向对象的软件开发包括哪些过程?OOA模型包括哪三个层次?OOD模型在OOA模型的基础上引入了哪些工作?

答:面向对象的软件开发过程可以大体划分为面向对象的分析(Object Oriented analysis,OOA)、面向对象的设计(Object oriented design,OOD)、面向对象的实现(Object oriented programming,OOP)三个阶段。

面向对象的分析的主要作用是明确用户的需求,并用标准化的面向对象的模型规范地表述这一需求,最后将形成面向对象的分析模型。

面向对象的设计将在OOA模型的基础上引入界面管理、任务管理和数据管理三部分的内容。

7.面向对象的程序设计方法有哪些优点?

答:由于对象的概念能够以更接近实际问题的原貌和实质的方式来表述和处理这些问题,所以面向对象的软件开发方法比以往面向过程的方法有更好的灵活性、可重用性和可扩展性,

使得上述―分析—设计—实现‖的开发过程也更加高效、快捷。

第2章 Java概述

1. 简述Java编译和运行的基本方法。

答:编译可以使用JDK中的工具javac.exe。例如:

javac HelloWorldApp.java

运行Java程序则可以使用JDK提供的解释器是java.exe。例如:

java HelloWorldApp

2. 下载并安装JDK软件包,3. 尝试查看其中的JDK文档。 答: Java编程的基本工具包是JDK(Java Development Kit)。JDK是Sun公司免费提供的开发、运行Java程序的基本软件,它可以在Windows及Unix两种平台下使用。常用的版本是JDK1.2.2, JDK1.3.0,JDK1.4等。可以从http://java.sun.com网站下载较新的版本,如JDK1.5(也称为JDK5.0)。

JDK文档也可以从网上下载。

3.编写一个Java Application,利用JDK软件包中的工具编译并运行这个程序,在屏幕上输出―Welcome to Java World!‖。

答:见程序。 public class Ex2_3 { public static void main(String[] args) { System.out.println(\ } } 4.编写一个Java Applet,使之能够在浏览器中显示―Welcome to Java Applet World!‖的字符串信息。

答:见程序。import java.awt.*; import java.applet.*;

public class Ex2_4 extends Applet { //an applet public void paint(Graphics g){ g.drawString (\ World!\ } }

5.编写一个HTML文件,将上题中生成的Applet字节码嵌入其中,并用WWW浏览器观看这个HTML文件规定的Web页面。

答:与上一题同。

6.编写一个程序,能够从键盘上接收两个数字,然后计算这两个数的积。 答:见程序。import java.io.*; public class Ex2_6 { public static void main(String[] args) { String s = \ double c = 0; double d = 0; try{ BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) ); System.out.print(\请输入一个数: \ s = in.readLine();

c = Double.parseDouble( s ); System.out.print(\请输入另一个数: \ s = in.readLine(); d = Double.parseDouble( s ); }catch(IOException e){} System.out.println(\这两个数的积为: \ } }

7.编写一个程序,从两个文本框中接收两个数字,然后计算这两个数的积。 答:见程序。import java.applet.*; import java.awt.*;

import java.awt.event.*;

public class Ex2_7 extends Applet { TextField in1 = new TextField(10); TextField in2 = new TextField(10); Button btn = new Button(\求两个数的积\ Label out = new Label(\用于显示结果的标签\ public void init() { setLayout( new FlowLayout() ); add( in1 ); add( in2 ); add( btn ); add( out ); btn.addActionListener( new BtnActionAdapter() ); } class BtnActionAdapter implements ActionListener { public void actionPerformed( ActionEvent e ) { String s1 = in1.getText(); double d1 = Double.parseDouble( s1 ); String s2 = in2.getText(); double d2 = Double.parseDouble( s2 ); double result = d1 * d2; out.setText( d1 + \ } } }

8.常用的集成开发工具有哪些?各有什么特点?

答:常用的集成开发工具包括:Borland公司出品的Jbuilder, Sun公司出品的Java Workshop, IBM公司的Visual Age for Java,Oracle公司的Java Develop,等等。另外,Symantec公司的Visual Café 也是著名的Java开发工具。近来,Eclipse也是使用很广的集成开发工具。

第3章 数据运算、流控制、数组

1.简述Java程序的构成。如何判断主类?下面的程序有几处错误?如何改正,这个程序的源代码应该保存成什么名字的文件? public class MyJavaClass

{

public static void main() {

System.out.printIn(\;

}

System.out.printIn(\程序结束。\;

}

答:一个复杂的程序可由一个至多个Java源程序文件构成,每个文件中可以有多个类定义。一般的Java源程序文件由以下三部分组成:

package 语句; (0句—1句) import 语句; (0句—多句) 类定义 (1个—多个类定义)

这里所说的主类是指程序中含有main()方法的类。

上面的示例程序中的错误主要在于拼写,如:点及分号应该用西文的;printIn中的大写字母I应改为小写字母l;另外,main()方法应该带参数,改为:

public static void main(String [] argvs) import java.applet.*; import java.awt.*;

import java.awt.event.*;

public class Ex2_7 extends Applet { TextField in1 = new TextField(10); TextField in2 = new TextField(10); Button btn = new Button(\求两个数的积\ Label out = new Label(\用于显示结果的标签\ public void init() { setLayout( new FlowLayout() ); add( in1 ); add( in2 ); add( btn ); add( out ); btn.addActionListener( new BtnActionAdapter() ); } class BtnActionAdapter implements ActionListener { public void actionPerformed( ActionEvent e ) { String s1 = in1.getText(); double d1 = Double.parseDouble( s1 ); String s2 = in2.getText(); double d2 = Double.parseDouble( s2 ); double result = d1 * d2; out.setText( d1 + \ } } }

2.Java有哪些基本数据类型?写出int型所能表达的最大、最小数据。 答:Java中定义了4类/8种基本数据类型: (1)逻辑型——boolean

(2)整数型——byte, short, int, long (3)浮点数型——float, double (4)字符型——char

其中整型int占4个字节,其范围为 -2147483648-2147483647。

3.Java的字符采用何种编码方案?有何特点?写出五个常见的转义符。

答:char(字符型)是用Unicode编码表达的字符,在内存中占两个字节。由于Java的字符类型采用了一种新的国际标准编码方案——Unicode编码,这样便于东方字符和西方字符处理,这样与其他语言相比,Java处理多语种的能力大大加强。

常见的转义符,如: \\' 单引号字符 \\'' 双引号字符 \\\\ 反斜杠字符 \\r 回车 \\n 换行

4. Java对标识符命名有什么规定,下面这些标识符哪些是对的?哪些是错的?错在哪里?

(1)MyGame (2)_isHers (3)2JavaProgram (4)Java-Visual-Machine (5)_$abc

答:标识符可以由编程者自由指定,但是需要遵循—定的语法规定。标识符要满足如下的规定:

(1)标识符可以由字母、数字和下划线(_)、美元符号($)组合而成。 (2)标识符必须以字母、下划线或美元符号开头,不能以数字开头。

在实际应用标识符时,应该使标识符能一定程度上反映它所表示的变量、常量、对象或类的意义,这样程序的可读性会更好。

题中的标识符中的(3)不对,因为用数字开头了,(4)也不对,因为其中用了减号。 5.什么是常量?什么是变量?字符变量与字符串常量有何不同?

答:常量是在程序运行的整个过程中保持其值不改变的量。变量是在程序的运行过程中数值可变的数据,通常用来记录运算中间结果或保存数据。

字符变量中存放一个字符,字符串常量中存放一串字符。

6.什么是强制类型转换?在什么情况下需要用到强制类型转换?

答:强制类型的基本方式是指用以下方式显式地进行数据类型的转换:

(类型)表达式

一般地说,在赋值运算符两侧的类型不一致的情况下,则需要进行自动或强制类型转换。变量从占用内存较少的短数据类型转化成占用内存较多的长数据类型时,可以不做显式的类型转换,Java会自动转换;而将变量从较长的数据类型转换成较短的数据类型时,则必须做强制类型转换。

7.Java有哪些算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符?试列举单目和三目运算符。

答:在Java中,按照运算符功能来分,基本的运算符有下面几类:

1.算术运算符(+,-,*,/,%,++,--) 2.关系运算符(>,<,>=,<=,==,!=) 3.布尔逻辑运算符(!,&&,||,&,|) 4.位运算符(>>,<<,>>>,&,|,^,~) 5.赋值运算符(=,及其扩展赋值运算符如+=) 6.条件运算符( ?:)

7.其他 (包括分量运算符·,下标运算符 [],实例运算符instanceof,内存分配运算符new,强制类型转换运算符 (类型),方法调用运算符 () 等) 其中,单目运算符如-,!,而三目运算符只有一个,即条件运算符(?: )。

8.编写一个字符界面的Java Application程序,接受用户输入的一个浮点数,把它的整数部

分和小数部分分别输出。

答:见程序。/* 原来的程序 public class MyJavaClass {

public static void main() {

System.out.printIn(\; }

System.out.printIn(\程序结束。\; } */

public class Ex3_1 {

public static void main(String [] args) { System.out.println(\ System.out.println(\程序结束。\ } }

9.编写一个字符界面的Java Application程序,接受用户输入的10个整数,比较并输出其中的最大值和最小值。

答:见程序。import java.io.*; public class Ex3_9 { public static void main(String[] args) { int N = 10; int [] a = new int[N]; //声明数组并分配空间 try{ BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) ); for( int i=0; i a[i] ) min = a[i]; } System.out.println( \最大数为: \ System.out.println( \最小数为: \ }catch(IOException e){} } }

10.编写一个字符界面的Java Application程序,接受用户输入的字符,以―#‖标志输入的结束;比较并输出按字典序最小的字符。

答:见程序。import java.io.*;

public class Ex3_10 { public static void main(String[] args) { char min = '\?'; System.out.print(\请输入一串字符,以#结束:\ while( true ) { char c = ' '; try{ c = (char) System.in.read(); }catch(IOException e){} if( c == '#' ) break; if( min > c ) min = c; } System.out.println(\其中最小的字符是: \ } }

11.结构化程序设计有哪三种基本流程?分别对应Java中的哪些语句?

答:任何程序都可以且只能由三种基本流程结构构成,即顺序结构、分支结构和循环结构。顺序结构直接书写,分支结构用if及switch语句书写,循环结构用for、while及do语句来书写。

12.编写一个Java程序,接受用户输入的一个l-12之间的整数(如果输入的数据不满足这个条件,则要求用户重新输入),利用switch语句输出对应月份的天数。

答:见程序。import java.io.*; public class Ex3_12 { public static void main(String[] args) { try{ BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) ); int a = 0; do{ System.out.print(\请输一个1~12的整数: \ String s = in.readLine(); a = Integer.parseInt( s ); }while( a <1 || a > 12 ); switch( a ){ case 1: System.out.println(\一月\ case 2: System.out.println(\二月\ case 3: System.out.println(\三月\ case 4: System.out.println(\四月\ case 5: System.out.println(\五月\ case 6: System.out.println(\六月\ case 7: System.out.println(\七月\

case 8: System.out.println(\八月\ case 9: System.out.println(\九月\ case 10: System.out.println(\十月\ case 11: System.out.println(\十一月\ case 12: System.out.println(\十二月\ default: break; } }catch(IOException e){} } }

13.在一个循环中使用break,continue和return语句有什么不同的效果?

答:break是结束循环;continue是直接进行下一次循环;return则是结束整个函数的调用。 14.编写图形界面下的Java Applet程序,接受用户输入的两个数据为上、下限,然后10个一行输出上、下限之间的所有素数。

import java.applet.*; import java.awt.*;

import java.awt.event.*;

public class Ex3_14 extends Applet { TextField in1 = new TextField(10); TextField in2 = new TextField(10); Button btn = new Button(\求两个数之间的素数\ TextArea out = new TextArea(10,100); //用于输出 public void init() { setLayout( new FlowLayout() ); add( in1 ); add( in2 ); add( btn ); add( out ); btn.addActionListener( new BtnActionAdapter() ); } class BtnActionAdapter implements ActionListener { public void actionPerformed( ActionEvent e ) { String s1 = in1.getText(); int a1 = Integer.parseInt( s1 ); String s2 = in2.getText(); double a2 = Integer.parseInt( s2 ); String result = \结果 int cnt = 0; //计算素数的个数 for( int i = a1; i<=a2; i++ ){ if( isPrime( i ) ){ result += (\如果是素数,则加入 cnt ++; if( cnt % 10 == 0 ) result += \ else result += \ }

} out.setText( result); } public boolean isPrime( int a )//判断一个数是否是素数 { if( a <= 1 ) return false; for( int i=2; i

15.编写程序输出用户指定数据的所有素数因子。 答:见程序。import java.io.*; public class Ex3_15 { public static void main(String[] args) { try{ BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) ); System.out.print(\请输入一个正整数: \ String s = in.readLine(); int a = Integer.parseInt( s ); System.out.println( a + \的所有素因子包括: \ for( int i=2; i<=a; i++ ){ if( a%i==0 && isPrime(i) ){ System.out.println( i ); } } }catch(IOException e){} } public static boolean isPrime( int a )//判断一个数是否是素数 { if( a <= 1 ) return false; for( int i=2; i

16.什么是数组?数组有哪些特点?Java中创建数组需要使用哪些步骤?如何访问数组的一个元素?数组元素的下标与数组的长度有什么关系?

答:数组是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和下标来惟一地确定数组中的元素。

数组要进行定义和分配空间后才能使用。 一维数组的定义方式为:

type arrayName[ ];

或 type [ ] arrayName;

分配内存空间则要用到运算符new,其格式如下:

arrayName = new type[arraySize];

当定义了一个数组,并用运算符new为它分配了内存空间后,就可以引用数组中的每一个元素了。数组元素的引用方式为:

arrayName[index]

数组元素的下标从0开始,一直到数组的长度减1。

17.数组元素怎样进行缺省的初始化?

答:数组元素可以在定义数组的同时进行初始化。例如:

int a[ ] = {1,2,3,4,5};

用逗号(,)分隔数组的各个元素,系统自动为数组分配一定的空间。

18.编程求一个整数数组的最大值、最小值、平均值和所有数组元素的和。 答:见程序。import java.io.*; public class Ex3_18 { public static void main(String[] args) { int N = 100; int [] a = new int[N]; for( int i=0; i a[i] ) min = a[i]; } System.out.println( \最大值:\ System.out.println( \最小值:\ System.out.println( \总和:\ System.out.println( \平均值:\ } }

19.求解―约瑟夫问题‖:12个人排成一圈,从1号报数,凡是数到5的人就出队列(出局),然后继续报数,试问最后一人出局的是谁。

答:import java.io.*; public class Ex3_19 { public static void main(String[] args) { int N = 12; boolean [] a = new boolean[N]; //队列状态 for( int i=0; i

int i =0; //当前报数的人的下标 int s = 0; //当前报的数字 int cnt = 0; //已有多少人出局 while(true){ if( a[i] ) s++; //如果在队列中,则报数 if( s == 5 ){//如果数到5 System.out.println( (i+1) ); //显示该人的序号 a[i] = false; //该人出局 s = 0; //报的数归0 cnt ++; if( cnt == N )break; //全部的人都出局,结束 } i++; //到下一个人 if( i==N) i=0; //因为队伍是一个圆圈 } } }

20.用―埃氏筛法‖求2-100以内的素数。2-100以内的数,先去掉2的倍数,再去掉3的倍数,再去掉4的倍数,以此类推……最后剩下的就是素数。

答:见程序。import java.io.*; public class Ex3_20 { public static void main(String[] args) { int N = 100; boolean [] a = new boolean[N+1]; for( int i=0; i<=N; i++ ) a[i]=true; for( int i=2; i<=N; i++ ){ for( int j=2*i; j<=N; j += i ){ a[j] = false; } } for( int i=2; i<=N; i++ ){ if( a[i] ) System.out.println( i ); } } }

第4章 类、包和接口

1.使用抽象和封装有哪些好处?

答:抽象可以提供事物的本质特征。封装(Encapsulation)是这样一种编程机制,它把代码和其操作的数据捆绑在一起,从而防止了外部对数据和代码的干扰和滥用,保证了数据和代码的安全性。

2.编写一个Java程序片断定义一个表示学生的类student,包括域―学号‖、‖班号‖、―姓名‖、―性别‖、―年龄‖;方法―获得学号‖、―获得班号‖、―获得性别‖、―获得年龄‖、―修改年龄‖。class

public class exercise7 { public static void main(String args[]) {

Student stu = new Student(\班\ System.out.println(stu.toString()); } }

class Student{

private String stuNumber; private String stuClass; private String stuName; private int stuAge;

Student(String name,String number, int age, String cls) { stuName = name; stuNumber = number; stuClass = cls; stuAge = age; }

public String getStuNumber() { return stuNumber; }

public String getStuClass() { return stuClass; }

public String getStuName() { return stuName; }

public int getStuAge() { return stuAge; }

public void setStuAge(int age) { stuAge = age; }

public String toString() { String infor = \学生姓名:\ \学生年龄:\ \学生班级:\ \学生学号:\ return infor; } } 3.为student类定义构造方法初始化所有的域,增加一个方法public String toString()把Sttldent类对象的所有域信息组合成一个字符串。编写Application程序检验新增的功能。

答:见程序。class Ex4_3 { public static void main(String[] args)

{ Student s = new Student( \软件专业班\ \李明\ System.out.println( s ); } }

class Student { //\学号\、\班号\、\姓名\、\性别\、\年龄\ String id; String classId; String name; boolean sex; int age; public String getId() { return id; } public String getClassId() { return classId; } public String getName() { return name; } public boolean getSex() { return sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student( String id, String classId, String name, boolean sex, int age ) { this.id = id; this.classId = classId; this.name = name; public String toString() this.age = age; this.sex = sex; } { return name + id + classId + + age + \岁,\ (sex ? \男\女\ } }

4.什么是最终类,如何定义最终类?试列举最终类的例子。

答:最终类是指类被final修饰符所修饰和限定的类,最终类不能被继承,即不可能有子类。如Java中的String类就是最终类。

5.如何定义静态域?静态域有什么特点?如何访问和修改静态域的数据?

答:对域使用static修饰,则定义了静态域。静态域最本质的特点是:它们是类的域,不属于任何一个类的具体对象实例。它不保存在某个对象实例的内存区间中,而是保存在类的内存区域的公共存储单元。

在Java中,静态域(类变量)可以通过类名直接访问,也可以通过实例对象来访问,两种方法的结果是相同的。

6.什么是静态初始化器?它有什么特点? 与构造方法有什么不同?

静态初始化器是由关键字static引导的一对大括号{}括起的语句组。它的作用与类的构造方法有些相似,都是用来完成初始化的工作,但是静态初始化器在三点上与构造方法有根本的不同:

(1) 构造方法是对每个新创建的对象初始化,而(2) 静态初始化器是对类自身进行初始化。 (3) 构造方法是在用new运算符产生新对象时由系统自动执行;而(4) 静态初始化器一般不

(5) 能由程序来调用,(6) 它是在所属的类加载入内存时由系统调用执行。 (3)不同于构造方法,静态初始化器不是方法,没有方法名、返回值和参数列表。 (4)同static方法一样,它不能访问实例域和实例方法。

7.如何定义方法?在面向对象程序设计中方法有什么作用?

答:方法是类的动态属性,标志了类所具有的功能和操作,用来把类和对象的数据封装在 一起。Java的方法与其他语言中的函数或过程类似,是一段用来完成某种操作的程序片断。方法由方法头和方法体组成,其一般格式如下:

修饰符1 修饰符2 …… 返回值类型 方法名(形式参数列表) throws异常列表{

方法体各浯句; }

8.什么是抽象方法?它有何特点?如何定义抽象方法?如何使用抽象方法?

答:被abstract所修饰的方法叫抽象方法,抽象方法的作用在为所有子类定义一个统一的接口。对抽象方法只需声明,而不需实现,即用分号(;)而不是用{},格式如下:

abstract returnType abstractMethod( [paramlist] );

9.如何定义静态方法?静态方法有何特点?静态方法处理的域有什么要求? 答:用static修饰符修饰的方法是仅属于类的静态方法,又称为类方法。与此相对,不用static修饰的方法,则为实例方法。类方法的本质是该方法是属于整个类的,不是属于某个实例的。

静态方法中,不能访问实例变量。在类方法中不能使用this 或super。

10.什么是访问控制符?有哪些访问控制符?哪些可以用来修饰类?哪些用来修饰域和方法?试述不同访问控制符的作用。

答:访问控制符是指public/private/protected等表示访问控制(Access Control)的修饰符,其作用是更好地控制类及其域、方法的存取权限,更好地实现信息的封装与隐藏,

方法的访问控制符包括private, protected, public和―默认访问控制符‖。

类中限定为private的成员(域或方法)只能被这个类本身访问,即私有访问控制。

类中的成员缺省访问控制符时,称为缺省访问控制。缺省访问控制的成员可以被这个类本身和同一个包中的类所访问,即包访问控制。

类中限定为protected的成员可以被这个类本身,它的子类(包括同一个包中以及不同包中的子类)以及同一个包中所有其他的类访问。

类中限定为public的成员可以被所有的类访问。

Java中还有一种访问控制符为private proteced,它限定能被本类及其子类可以访问,而包中的其他非子类的类不能访问。

类的访问控制符或者为public,或者缺省。(但内部类可以有private、protected等访问控制符。)

如果类用public修饰,则该类可以被其他类所访问;若类缺省访问控制符,则该类只能被同包中的类访问。

11.修饰符是否可以混合使用?混合使用时需要注意什么问题?

答:修饰符可以混合使用,如public static。但也要注意一些规则,如final及abstract不能修饰同一个方法。

12.什么是继承?什么是父类?什么是子类?继承的特性给面向对象编程带来什么好处?什么是单重继承?什么是多重继承?

答:继承(Inheritance)是一个对象获得另一个对象的属性的过程。它的重要性源于它支持按层次分类概念。这与现实世界是一致的,大多数知识因为层次化分类而变得容易掌握(即从上至下)。

在类的层次关系中,被继承的类称为父类,继承其他类的类称为子类。

使用继承,一个对象可以从它父类继承所有的通用属性,而只需定义它特有的属性。所以,正是继承机制可以使一个对象成为一个更通用类的一个特例成为可能。

一个类只有一个直接父类,称为单重继承;一个类有多个直接父类,则是多重继承。Java语言中采用单重继承。

13.如何定义继承关系? 为―学生‖类派生出―小学生‖、―中学生‖、―大学生‖、―研究生‖四个类,其中―大学生‖类再派生出―一年级学生‖、二年级学生‖、 ―三年级学生‖、―四年级学生‖四个子类,―研究生‖类再派生出―硕士生’’和―博土生’’两个子类。

答:在Java中,通过extends关键字来定义继承关系。 具体示例见源程序。class Ex4_13 { public static void main(String[] args) { }

class Student{}

class Pupil extends Student{}

class MiddleSchollStudent extends Student{} class UnderGraduateStudent extends Student{} class Graduate extends Student{}

class Freshman extends UnderGraduateStudent{}

class Master extends Graduate{} class PhD extends Graduate{} { }; }

14.―子类的域和方法的数目一定大于等于父类的域和方法的数目‖,这种说法是否 正确?为什么?

答:如果考虑到可以子类既可以继承父类的方法,而不能继承私有的方法,那么这种说法是不正确的。

15.什么是域的隐藏?

答:在子类中定义与父类同名的域,称为域的隐藏。

16.什么是方法的覆盖?方法的覆盖与域的隐藏有何不同?与方法的重载有何不同?

答:子类重新定义与父类同名的方法,称为对父类方法的覆盖(Overriding)。子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即应与父类有完全相同的方法名、返回值和参数类型列表。

方法的重载是指定义几个同名的方法,但它们的参数类型列表不同。 17.解释this和super的意义和作用。

第7章 工具类及常用算法

1.在所有的Java系统类中,Object类有什么特殊之处?它在什么情况下使用?

答:Object类是Java程序中所有类的直接或间接父类,也是类库中所有类的父类。正因为Object类是所有Java类的父类,而且可以和任意类型的对象匹配,所以在有些场合可以使用它作为形式参数的类型。使用Object类可以使得该方法的实际参数为任意类型的对象,从而扩大了方法的适用范围。

2.数据类型包装类与基本数据类型有什么关系?

答:Java的基本数据类型用于定义简单的变量和属性将十分方便,但为了与面向对象的环境一致,Java中提供了基本数据类型的包装类(wrapper),它们是这些基本类型的面向对象的代表。与8种基本数据类型相对应,基本数据类型的包装类也有8种,分别是:Character,Byte, Short, Integer, Long, Float, Double, Boolean。

3.Math类用来实现什么功能?设x,y是整型变量,d是双精度型变量,试书写表达式完成下面的操作:

(1)求x的y次方; (2)求x和y的最小值; (3)求d取整后的结果;

(4)求d的四舍五入后的结果; (5)求atan(d)的数值。 答:相应的表达式为: (1) Math.pow(x, y) (2) Math.min(x, y) (3) Math.floor(d) (4) Math.rint(d) (5) Math.atan(d)

4.Math.random()方法用来实现什么功能?下面的语句起到什么作用? (int)(Math.random()*6)+1

答:Math.random()用于产生随机数(0到1之间,包含0,但不包含1)。 上面的表达式表示1到6之间的一个随机整数(包含1及6)。

5.编程生成100个l~6之间的随机数,统计1—6之间的每个数出现的概率;修改程 序,使之生成1 000个随机数并统计概率;比较不同的结果并给出结论。

答:见程序。class Ex7_5 { public static void main(String[] args) { statistics( 100 ); statistics(1000 ); //结论:次数越大,6个数出现的机率越接近 } public static void statistics( int times ) { int [] cnt = new int[6]; for( int i=0; i

{ int r = rnd( 6 ); //得到一个随机数 cnt[ r-1 ] ++; //计数 } System.out.println(\出现的次数分别为\ for( int i=0; i<6; i++ ) { System.out.print( cnt[i] + \ } System.out.println(); } public static int rnd( int max ) { return (int)(Math.random() * max ) + 1; } }

结论是次数越多越均匀。

6.什么是字符串?Java中的字符串分为哪两类?

答:字符串是是字符的序列,在Java中,字符串,无论是常量还是变量,都是用类的对象来实现的。

字符串可以分为两大类,一类是创建之后不会再做修改和变动的字符串常量;另一类是创建之后允许再做更改和变化的字符串。前者是String类,后者是StringBuffer类。

7.编写Applet程序,接受用户输入的一个字符串和一个字符,把字符串中所有指定的字符删除后输出。

答:import java.applet.*; import java.awt.*;

import java.awt.event.*;

public class Ex7_7 extends Applet { TextField in1 = new TextField(10); TextField in2 = new TextField(10); Button btn = new Button(\删除字符串的指定字符\ Label out = new Label(\用于显示结果的标签\ public void main int() { setLayout( new FlowLayout() ); add( in1 ); add( in2 ); add( btn ); add( out ); btn.addActionListener( new BtnActionAdapter() ); } class BtnActionAdapter implements ActionListener

{ public void actionPerformed( ActionEvent e ) { String s1 = in1.getText(); String s2 = in2.getText(); char c2 = s2.charAt(0); StringBuffer sb = new StringBuffer(); for( int i=0; i

8.编程判断一个字符串是否是回文。 答:import java.io.*; public class Ex7_8 { public static void main(String[] args) { try{ BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) ); System.out.print(\请输入一串字符: \ String s = in.readLine(); boolean flg = true; int len = s.length(); for( int i=0; i

9.String类的concat()方法与StringBuffer类的append()方法都可以连接两个字符串,它们之间有何不同?

答:String的concat()方法不改变原字符串本身,而是产生一个新的字符串。 StringBuffer的append()方法则改变其中的字符串内容,而不产生一个新的对象。

10.什么是递归方法?递归方法有哪两个基本要素?编写一个递归程序求一个一维数组所有元素的乘积。

答:简单地说,递归方法就是直接或间接调用自己的方法。递归方法有两个要素:一个是求得范围缩小的同性质问题的结果;另一是利用这个已得到的结果和一个简单的操作求得问题的最后解答。class Ex7_10

{ public static double multi( double [] a ) { return mul( a, 0 ); //从第0个元素开始乘 } //下面的mul是一个辅助函数,它表示从第p个元素开始乘 public static double mul( double [] a, int p ) { if( p >= a.length ) return 1; else return a[p] * mul(a, p+1 ); //递归调用 } public static void main( String [] args ) { double [] a = { 1, 6, 7, 9 }; System.out.println( multi(a) ); } }

具体程序见源文件。

11.你了解几种排序算法?它们各自有什么优缺点?分别适合在什么情况下使用?

答:常见的排序算法有:冒泡排序、选择排序、快速排序等。前二者较简单,适合于元素个数较少的场合,而快速排序法则速度较快,适合于各种场合。

12.向量与数组有何不同?它们分别适合于什么场合?

答:向量的元素个数可以动态地增减,而数组则不行。前者适合于元素个数动态改变的场合,后者则适合于元素个数不变的场合。

13.Java中有几种常用的集合类及其区别如何?怎样获取集合中的各个元素。

答:常用的集合有向量、堆栈、队列等。它们可以使用枚举等方法来获集合中的元素,有的还可使用elemnetAt()等方法来获取其中的元素。

14.队列和堆栈各有什么特点?

答:队列和堆栈都是线性数据结构,队列遵循―先进先出‖(FIFO)原则,堆栈遵循―后进先出‖(LIFO)原则。

15.求解―鸡兔同笼问题‖:鸡和兔在一个笼里,共有腿100条,头40个,问鸡兔各有几只。 答://Ex 7-15: 鸡兔同笼 class Ex7_15 { public static void main(String[] args) {

int chicken, rabbit; for( chicken=1; chicken<=40; chicken++ ) { rabbit = 40-chicken; //共40头 if( rabbit *4 + chicken *2 == 100 )//共100支脚 { System.out.println(\鸡有\,兔有\ } } } }

16.求解―百鸡问题‖。已知公鸡每只3元,母鸡每只5元,每3只小鸡1元。用100元钱买100只鸡,问每种鸡应各买多少。

答:见程序。class Ex7_16 { public static void main(String[] args) { int a, b, c; //三种鸡的只数 for( a=1; a<=100; a++ ){ for( b=1; b<100-a; b++ ){ c = 100 - a - b; if( c>0 && c%3==0 && 3*a+5*b+c/3==100 ){ System.out.println(\找到解:\ + a +\ } } } } }

17.求四位的水仙花数。即满足这样条样的四位数:各位数字的4次方和等于该数自身。 答:见程序。class Ex7_17 { public static void main(String[] args) { int a, b, c, d; //各位数 for( a=1; a<=9; a++ ){ for( b=0; b<=9; b++ ){ for( c=0; c<=9; c++ ){ for( d=0; d<=9; d++ ){ int s = 1000*a+100*b+10*c+d; int q = a*a*a*a+b*b*b*b+c*c*c*c+d*d*d*d; if( s == q ) System.out.println( s ); } } } } } }

} }

26.有一个n*m的矩阵,编写程序,找出其中最大的那个元素所在的行和列,并输出其值及行号和列号。class Ex7_26

{ public static void main(String[] args) { int n = 5; int m = 6; int [][] a = new int[n][m]; for( int i=0; i

第8章 Java的多线程

1.程序中怎样创建线程?

答:创建线程对象有两种方法,一是通过继承Thread类,一是向Thread类传递一个Runnable对象。

2.程序中怎样控制线程?

答:启动一个线程:调用start()方法。

终止或暂停一个线程:一般采取给线程设定一个标记变量的方法,来决定线程是否应该终止或暂停。

设定线程的优先级:使用Thread对象的setPriority( int priority)方法。

3.多线程之间怎样进行同步?

答:可以通过使用关键字synchronized,使用对象的wait()、notify()方法来实现线程间的同步。

4.编写一个程序,用一个线程显示时间,一个线程用来计算(如判断一个大数是否是质数),当质数计算完毕后,停止时间的显示。

答:见程序。import java.math.BigInteger; import java.util.Random;

public class Ex8_4 { public static void main(String args[]) { new Ex8_4().test(); }

public void test() { MyTask mytask = new MyTask(); Thread thread = new Thread(mytask); thread.start(); new Thread( new Clock() ).start(); }

boolean finished = false;

class MyTask implements Runnable { public void run() { for( int i=0; i<10; i++ ){ doOnce(); Thread.yield(); } finished = true; } public void doOnce() { Random rnd = new Random(); BigInteger prime =BigInteger.probablePrime(800,rnd); System.out.println(\随机数是:\ boolean bo=prime.isProbablePrime( 10000 ); //验证 System.out.println(bo?\很可能是质数\不是质数\

} }

class Clock implements Runnable { public void run() { System.out.println(\ while( ! finished ){ System.out.print( \ try{ Thread.sleep(1000); } catch( InterruptedException e ){} Thread.yield(); } } } }

第9章 流、文件及基于文本的应用

1.字节流与字符流有什么差别?

答:按处理数据的类型,流可以分为字节流与字符流,它们处理的信息的基本单位分别是字节(byte)与字符(char)。

2.节点流与处理流有什么差别?

答:节点流(Node Stream): 直接与特定的地方(如磁盘、内存、设备等)相连,可以从/向一个特定的地(节点)读写数据。如文件流FileReader。

处理流(Processing Stream): 是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读/写功能。处理流又称为过滤流。如缓冲处理流BufferedReader。

3.输入流与输出流各有什么方法?

答:输入流InputStream类最重要的方法是读数据的read()方法。read()方法功能是逐字节地二进制的原始方式读入数据。另外,它还有skip(long n)、reset()、available()、close()方法等。

输出流OutputStream类的重要方法是write(),它的功能是将字节写入流中。另外,它还有flush()及close()方法。

4.怎样进行文件及目录的管理?

答:Java支持文件管理和目录管理,它们都是由专门的java.io.File类来实现。每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相 关信息,如名称、长度、所含文件个数等,调用它的方法则可以完成对文件或目录的常用管 理操作,如创建、删除等。

5.编写一个程序,从命令上行接收两个实数,计算其乘积。 答:参见程序。import java.io.*; public class Ex9_5 { public static void main(String[] args) { String s = \ double c = 0; double d = 0; try{

BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) ); System.out.print(\请输入一个数: \ s = in.readLine(); c = Double.parseDouble( s ); System.out.print(\请输入另一个数: \ s = in.readLine(); d = Double.parseDouble( s ); System.out.println(\这两个数的积为: \ }catch(IOException e){} } }

6.编写一个程序,从命令行上接收两个文件名,比较两个文件的长度及内容。 答:参见程序。import java.io.*; public class Ex9_6 { public static void main(String[] args) { try{ BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) ); System.out.print(\请输入一个文件名: \ String name1 = in.readLine(); System.out.print(\请输入另一个文件名: \ String name2 = in.readLine(); File file1 = new File( name1 ); File file2 = new File( name2 ); long len1 = file1.length(); long len2 = file2.length(); if( len1 != len2 ){ System.out.println( \这两个文件的长度不一样\ return; } String text1 = readFileToEnd( file1 ); String text2 = readFileToEnd( file2 ); System.out.println( text1 ); System.out.println( text2 ); if( text1.equals(text2) ){ System.out.println( \这两个文件的内容相同\ }else{ System.out.println( \这两个文件的内容不一样\ } }catch(IOException e){

e.printStackTrace(); } } public static String readFileToEnd( File file ){ StringBuffer text = new StringBuffer(); try { BufferedReader in = new BufferedReader( new FileReader(file)); String s = in.readLine(); while ( s != null ) { text.append( s + \ s = in.readLine(); } in.close(); } catch (IOException e2) { e2.printStackTrace(); } return text.toString(); } }

7.编写一个程序,能将一个Java源程序中的空行及注释去掉。 答:参见程序。import java.io.*; public class Ex9_7 { public static void main (String[] args) { String infname = \ String outfname = \ if( args.length >= 1 ) infname = args[0]; if( args.length >= 2 ) outfname = args[1]; try { File fin = new File(infname); File fout = new File(outfname); BufferedReader in = new BufferedReader(new FileReader(fin)); PrintWriter out = new PrintWriter(new FileWriter(fout)); int cnt = 0; // 行号 String s = in.readLine(); while ( s != null ) { cnt ++; s = deleteComments(s); //去掉以//开始的注释 if( s.length() != 0 ){ out.println( s ); //写出非空行 } s = in.readLine(); //读入 } in.close(); // 关闭缓冲读入流及文件读入流的连接. out.close();

}

}

} catch (FileNotFoundException e1) { System.err.println(\} catch (IOException e2) { e2.printStackTrace(); }

static String deleteComments( String s ) //去掉以//开始的注释 { if( s==null ) return s; int pos = s.indexOf( \ if( pos<0 ) return s; return s.substring( 0, pos ); }

第10章 图形用户界面

1.试列举出图形用户界面中你使用过的组件。 答:常用的容器组件如:边框窗体(Frame)、对话框(Dialog)、面板(Panel)、及滚动面板(ScrollPane)等。常用的非容器组件,如按钮(Button),标签(Label),文本类组件(TextField及TextArea),复选按钮(Checkbox),单选按钮组(CheckboxGroup),Choice(下拉列表),List(列表),滚动条(Scrollbar),画布(Canvas)等。

2.Java中常用的布局管理各有什么特点?

答:常用的布局管理有5种,即FlowLayout,BorderLayout,CardLayout,GridLayout和GridBagLayout,它们的特点如下:

FlowLayout是容器Panel和它的子类Applet缺省使用的布局管理器,它将将其中的组件按照加入 的先后顺序从左向右排列,一行排满之后就下转到下一行继续。

BorderLayout是容器Frame和Dialog缺省使用的布局管理器,它把容器内的空间简单地划分为东、西、南、北、中五个区域。

CardLayout的容器表面上可以容纳多个组件,但是实际上同一时刻容器只能从这些组件中选出一个来显示,就像一叠―扑克牌‖每次只能显示最上面的一张一样,这个被显示的组件将占据所有的容器空间。

GridLayout是使用较多的布局管理器,其基本布局策略是把容器的空间划分成若干 行乘若干列的网格区域,组件就位于这些划分出来的小格中。

在GridBagLayout中,可以为每个组件指定其包含的网格个数,可以保留组件原来的大小,可以以任意顺序随意加入容器的任意位置,从而可以真正自由地安排容器中每个组件的大小和位置。

3.简述Java的事件处理机制。

答:在Java中通过实现事件监听器(Eventistener)来实现对事件的处理。事件监听器是一些事件的接口,这些接口是 java.awt.AWTEventListener的子类。接口中含有相关的方法,每个方法中可以编程来处理相关的事件。

每个界面对象在需要处理某种事件时,先进行事件的注册。注册的过程就是将界面对象与事件监听器联系在一起的过程。

4.什么是事件源?什么是监听者?

答:事件源是指发出事件的界面对象。监听者是指处理这些事件的对象,它实现了一些相关事件处理方法的接口,在一定意义上监听者是具体处理这些事件的程序。

5.列举java.awt.event包中定义的事件类,并写出它们的继承关系。

答:在java.awt.event包中有一系列的事件类,如KeyEvent及MouseEvent等。这些事件类都是从AWTEvent类派生而来的。事件类之间的继承关系如下图所示。

6.列举GUI的各种标准组件和它们之间的层次继承关系。

答:组件(Component)分为容器(Container)类和非容器类组件两大类。容器本身也是组件,但容器中可以包含其他组件,也可以包含其他容器。非容器类组件的种类较多,如按钮(Button),标签(Label),文本类组件TextComponent等等。

容器又分为两种顶层容器和非顶层容器两大类。顶层容器是可以独立的窗口,顶层容器的类是Window,Window的重要子类是Frame和Dialog。非顶层容器,不是独立的窗口,它们必须位于窗口之内,非顶层容器包括Panel及ScrollPane等, Panel的重要子类是Applet。其中,Panel和Applet的容器都是无边框的;ScrollPanel一组是可以自动处理滚动操作的容器;Window,Frame,Dialog和FileDialog是一组大都含有边框,并可以移动、放大、缩小、关闭的功能较强的容器。

AWT组件的分类如下图所示:

Label, TextComponent,......?Button,???Frame?Component??Window???Dialog?Container?Panel,ScrollPane?,.......??

组件间的继承关系,如下图所示:

7.Component类有何特殊之处?其中定义了哪些常用方法?

答:Component类是所有组件和容器的抽象父类,其中定义了一些每个容器和组件都可能用到的方法,较常用的有:

(1)public void add(PopupMenu popup):在组件上加入一个弹出菜单,当用户用鼠标右键单击组件时将弹出这个菜单。

(2)public Color getBackground():获得组件的背景色。 (3)public Font getFont():获得组件使用的字体。

(4)public Color getForeground():获得组件的前景色。

(5)public Graphics getGraphics():获得在组件上绘图时需要使用的Graphics对象。

(6)public void repaint(int x,int y,int width,int height):以指定的坐标点(x,y)为左上角,重画组件中指定宽度(width)、指定高度(height)的区域。

(7)public void setBackground(Color c):设置组件的背景色。

(8)public voidsetEnabled(boolean b):设置组件的使能状态。参数b为真则组件使能,否则组件不使能。只有使能状态的组件才能接受用户输入并引发事件。

(9)public void setFont(Font f):设置组件使用的字体。

(10)public void setSize(int width,int height):设置组件的大小。

(11)public void setVisible(boolean b):设置组件是否可见的属性。参数b为真时,组件在包括它的容器可见时也可见;否则组件不可见。

(12)public void setForeground(Color c):设置组件的前景色。 (13)public void requestFocus():使组件获得注意的焦点。

8.将各种常用组件的创建语句、常用方法、可能引发的事件、需要注册的监听者和监听者需要重载的方法综合在一张表格中画出。

答:常用的组件与事件的关系如下表所示: Act Adj Cmp 组 件 Button Y Y Canvas Y Checkbox Y CheckboxMenuItem Choice Y Component Y Comtainer Y Dialog Y Frame Y Label Y List Y Y MenuItem Y Panel Y Scrollbar Y Y ScrollPane Y TextArea Y TextField Y Y Window Y 注: Act: Action 行动事件 Adj: Adjustment调整 Cmp: Component组件事件 Cnt: Container容器事件 Foc: Focus 焦点事件 Itm: Item 条目事件 Key: Key键盘事件

Mou: Mouse 鼠标事件 MM: Mouse Motion鼠标移动事件 Txt: Text 文本事件 Win: Window 窗口事件

Cnt Y Y Y Y Y Y Foc Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Itm Y Y Y Y Key Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Mou Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y MM Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Txt Y Y Win Y Y Y

9.编写Applet包括一个标签、一个文本框和一个按钮,当用户单击按钮时,程序把文本框中的内容复制到标签中。

答:见程序。

10.编写Applet程序,画出一条螺旋线。 答:见程序。import java.awt.*; import java.awt.event.*; import java.applet.*;

public class Ex10_10 extends Applet { public void paint(Graphics g){ double w = getSize().width/2; double h = getSize().height/2; g.setColor( Color.blue ); for( double th =0; th

double x = r * Math.cos( th ) + w; double y = r * Math.sin( th ) + h; g.drawLine( (int)x, (int)y, (int)x, (int)y); } } }

11.编写Applet程序,用paint()方法显示一行字符串,Applet包含两个按钮―放大‖和―缩小‖,当用户单击―放大‖时显示的字符串字体放大一号,单击―缩小‖时显示的字符串字体缩小一号。

答:见程序。import java.applet.*; import java.awt.*;

import java.awt.event.*;

public class Ex10_11 extends Applet { Button btn1 = new Button(\放大\ Button btn2 = new Button(\缩小\ public void init() { setLayout( new FlowLayout() ); add( btn1 ); add( btn2 ); btn1.addActionListener( new BtnActionAdapter() ); btn2.addActionListener( new BtnActionAdapter() ); } private int fontSize = 12; public void paint(Graphics g){ double w = getSize().width/2; double h = getSize().height/2; g.setColor( Color.blue ); g.setFont( new Font( \宋体\ g.drawString( \文字的大小\ } class BtnActionAdapter implements ActionListener { public void actionPerformed( ActionEvent e ) { if( e.getSource() == btn1 ) fontSize += 2; if( e.getSource() == btn2 ) fontSize -= 2; if( fontSize <= 5 ) fontSize = 5; Ex10_11.this.repaint(); } } }

12.编写Applet程序,包含三个标签,其背景分别为红、黄、蓝三色。 答:见程序。import java.applet.*; import java.awt.*;

import java.awt.event.*;

public class Ex10_12 extends Applet { Label lb1 = new Label(\红\ Label lb2 = new Label(\黄\ Label lb3 = new Label(\蓝\ public void init() { setLayout( new FlowLayout() ); add( lb1 ); add( lb2 ); add( lb3 ); lb1.setBackground( Color.red ); lb2.setBackground( Color.yellow ); lb3.setBackground( Color.blue ); } }

13.使用Checkbox标志按钮的背景色,使用CheckboxGroup标志三种字体风格,使用Choice选择字号,使用List选择字体名称,由用户确定按钮的背景色和前景字符的显示效果。

答:见程序。import java.applet.*; import java.awt.*;

import java.awt.event.*;

public class Ex10_13 extends Applet implements ActionListener { Checkbox chkBack = new Checkbox(\背景为黄色\ CheckboxGroup cbgStyle = new CheckboxGroup(); Choice chcSize = new Choice(); List lstName = new List(4, false); Button btnOk = new Button(\确定\ public void init() { add( chkBack ); add(new Checkbox(\常规\ add(new Checkbox(\粗体\ add(new Checkbox(\斜体\ chcSize.add( \ chcSize.add( \

本文来源:https://www.bwwdw.com/article/4sh6.html

Top