2023年11月29日发(作者:)

4-Java语言与面向对象作

业习题与答案

4 Java语言与面向对象作业习题与答案

一、简答题

1.什么是对象?什么是类?

对象是一种抽象数据类型。它包含了事物的静

态特征(属性)和动态特征(行为)两大特征。

类是一组同种对象的集合与抽象。即是具有相

同属性和方法的一组对象集合。

2Java语言的单继承是指什么?

一个类可以派生出多个子类,但子类只允许有

一个父类,而不允许存在多个父类。

3.在一个共有类中的数据成员及方法成员的访

问控制符为缺省,则这个类可供什么样的包引

用?

当一个类的访问控制符为public共有时,表明

这个类作为整体对其它类是可见和可引用的;但

其数据成员和方法成员访问控制符为缺省时,它

们只能被包中类(含当前类)引用。

4.抽象类的用途

1设计在更高的层次上进行,不考虑具体对

象,从而大大简化了处理问题的复杂性;

2)设计出的类也具有更加良好的可扩展性。

5.什么是非静态的成员变量?

非静态成员即为实例成员变量(没有加static

修饰的变量)

6.异常Exception和错误Error有什么不同?

Java如何处理它们?

答:错误通常是指程序本身存在非法情形,

常常是因为代码存在问题而引起的,如造成

系统崩溃、虚拟机粗错、动态链接失败等,

这一类错误无法恢复或不可能捕获,并将导

致应用程序中断。

异常表示另外一种“非同寻常”的错误。这

种错误通常是不可预测,但可以被捕获且可以

恢复。常见的异常情况包括内存不足、找不到

所需文件等。

对于错误,编程人员可以通过对程序进行更

仔细的检查,以避免这种错误。

对于异常,可以使用捕获机制进行捕获,再

编写出相应的处理程序。

7.简单陈述Java的异常处理机制。

答:Java采取“抛出捕获”的方式,一旦

一个异常想象产生,Runnable环境和应用程

序会抛出各种标准类型和自己定义的异常,

系统就可以捕获这些异常,并一定有相应的

机制来处理它,确保不会产生司机、死循环

或其它对操作系统的损害,从而保证了整个

程序运行的安全性。

8.简单陈述throw语句和throws关键字之间的

差别。

答:throw语句是在一个方法中用来直接抛出

异常对象,其格式是:

throw 异常对象;

throws关键字是用一个方法声明首部,用来

指出这个方法中可能产生若干种异常,其格式:

[方法修饰符] 返回类型 方法名(参数表)

throws 异常类型表

{ /*方法体*/ }

二、填空题

1所有Java应用程序都必须包含的一个类方法

main()

2.面向对象程序设计语言的三种重要特性是

装性、继承性和多态性

3.方法重载与方法覆盖的不同有:方法重载是

指允许在同一个类中定义多个同名方法,它们通

过形参的个数或形参参数的类型来区别;方法覆

盖是指在子类中重新定义了与父类中的方法同名

的方法

4.面向对象程序设计语言的多态的事项方法主

要有三种:方法重载、方法覆盖和接口

5.对象之间的信息通过消息传递机制来完成。

6.成员变量的修饰符有(写出6种)public,

friendly, protected, private, final, static

7.整个类共同拥有的方法是static修饰的方

法或叫类成员方法;它具有统计一个类的实例个

数等用途。

8引用父类中的成员用super引用当前的类或

对象用this

9.在面向对象中,继承有两种含义,分别指

1

类的层次结构中,子类自动继承父类的特性

一类的所有实例对象都具有所属类的特征

10.在Java语言中,所有类都是Object类的子

类。

11.多继承问题指的是一个类有多个父类问题;

Java语言中通过接口方法解决多继承问题。

12接口是一种特殊的类,它只能定义一些抽象

方法和常量

13.在Java语言中,一组类和接口的集合通常

被称为类库或API包或应用程序接口

14.给出引用包的两种方法是:使用包名、类名

做前缀;使用import语句

15Java语言异常处理三种方式是:捕获异常、

声明异常和自定义异常

16程序设计过程中可能会出现的两种错误是

译错误和运行错误

17程序设计过程后的运行错误大致有三类。

们是逻辑错误、用户输入不合法和硬件设备出错

18Java语言中,try-catch-final结构来捕

获并处理异常。

19.用户程序使用throw new 异常类名;抛出

自己的异常。

20.自定义异常类必须继承Exception类。

三、选择题

1.下述声明中哪一种可以防止该类产生子类?

Astatic class DEF{} Bprivate

calss DEF{}

Cabstract class DEF{} Dfinal

public class DEF{}

Efinal abstract class DEF{}

答案:D

Final防止有子类继承,因此可选择DE。但

final不可以和abstract连用,因此E也错。

2.如果要求子类可以在任何包中访问父类的成

员,下面哪一个修饰符可以达到这个目标的最为

严格的修饰符?

Apublic Bprivate Cprotected

D.无修饰符

2

答案:C

AC都可以做到这点,A更为宽松,不仅

仅是任何包中的子类,而且任何包中和包外的类

都可以访问它。D只能被同一个包内的类访问,

所以D不符合要求。而BD更为严格。

3.程序的封装性是如何实现的?

A.由应用程序的设计者实现 B由应

用程序的使用者实现

C.由应用程序的设计和使用者实现

D.由操作系统实现

答案:A

4.下列哪个选项是错误的?

A.子类对象可以转化成父类对象

B.父类对象一般不转化成子类对象

C.子类对象与父类对象之间不能转化

D.子类对象转化为父类对象后,对于子类与

父类共有的方法,仍然调用子类的方法。

答案:C

5.下列哪个选项能体现Java语言的多态性?

A.匿名类 B.内布类 C方法重载

D.方法覆盖

答案:C

6.下列哪个选项正确?

AError类是一个RuntimeException异常

B.任何抛出一个RuntimeException异常的语

句必须包含在try块内。

C.任何抛出一个Error对象的语句必须包含

try块内。

D任何抛出一个Exception异常的语句必须包

含在try块内。

答案:D

Error

Exception类同在一个层次,RuntimeException

Exception的子类,所以Error类不可能是一

RuntimeException类型的异常;抛出一个

RuntimeException异常不一定要在try块内,它

是由JVM正常抛出,不需要throwthrows

句,因而也不一定要有catch语句去捕获,所以

可以不出现在try块中;Error类型的问题是不可

3

恢复的,多以没有规定要去捕获Error,因而也

可以不出现在try块中;对于抛出一个Exception

对象的语句,如果没有包含在try块之内,有可

能编译不能通过,因此选项D是必须的。

7.有如下程序,给出程序运行结果?

import .*;

public class ExceptionTest

{ public static void main(String args[])

{ try

{ methodA(); }

catch(IOException e){

n(Caught Exception);

}

public void methcdA()

{ throw new IOException(); }

}

}

A.代码不能编译 B.输出:

Caught Exception

C.输出:CaughtIO Exception

D.程序正常运行后无任何信息输出

答案:A

首先,methcdA是非静态方法,不能出现在

main中;其次,就算methcdA是静态方法,

IOException是可检测异常,必须被catch捕获或

是被throws声明,但程序中没有声明throws

try语句块不可能抛出IOException这个异常,

catch也就谈不到捕获它了,所以两个条件都

没有满足,编译同样错误。

methcdA方法定义语句的前面加static,后

面加上throws IOException,程序就可以调试通

过了。

8有如下程序,在程序的point x处增加如下哪

个选项程序才能通过编译?

public class ExceptionTest

{ calss TestException extends Exception{}

public void runTest() throws

TestException{}

public void test() //point x

4

{ runTest(); }

}

Athrows Exception

Bcatch(Exception)

Cthrows RuntimeException

Dcatch(TestException)

答案:A

没有try就不能有catch,所以BD错;而

C里边的RuntimeExceptionException的子

类,不能用捕“小鱼”的工具去捕“大鱼”,所

以错误;由于runTest()抛出的是TestExcption

TestExcption又是Excption的子类,因此用

runTest方法就必须抛出Excption异常。

9.有如下程序,该程序的运行结果是?

public class Exc_4

{ public static void main(String args[])

{ try{ return; }

finally{ n(Finally);

}

}

}

A.程序无输出 B程序输出

Finally

C.代码可以通过编译但执行时产生异常

D.因为缺少catch块所以编译出错

答案:B

序中有catch则必须有try但反之不成立,

所以D不对;关于try-catch-finally的问题,

程序中如果遇到return,则finally块先被执

行,然后再执行return,而finally块后面的

语句将不被执行。如果遇到(1)

则退出JVM,整个程序退出,当然finally

块其后的语句都不执行。

10methodA()

IOException异常,该程序的运行结果是?

class Exc_5

{ public static void main(String args[])

{ try{ methodA(); }

catch(IOException e){

5

n(caught IOException); }

catch(Exception

e){ n(caught Exception);} }

}

}

答案:caught IOException

如果methodA()抛出IOException异常,被

语句5捕获,输出“caught IOException

四、编程题

1.试编写出要创建一个员工类Employee。这

empNum姓名Name其操作方法一个是用来设

set员工的工号,另一个操作方法是用来取得

get员工工号。(建议按两步完成设计:一步是写

出类的头结构;另外一步是完成成员声明。

class Employee

{ public empNum;

public Name;

public int setNum(int _empNum)

{

int empNum=_empNum;

return empNum;

}

int void getNum()

{

Employee A;

int empNum=(2001);

n("员工工号为:" +

empNum);

}

}

2创建一个名为List的显示类,它可以存储任

何类型的对象,并可以在任何时候增加或删除对

象。

class List

{ private int maxItems=100;

6

private int numItems=0;

private Object[] list=null;

public List()

{ list=new Object[maxItems]; }

public List(int _maxItems)

{

maxItems=_maxItems;

list=new Object[maxItems];

}

public void add(Object obj)

{

list[numItems]=obj;

numItems++;

}

public void delete(int pos)

{

for(int i=pos+1; i<numItems; i++)

{ list[i-1]=list[i]; }

numItems--;

}

public Object get(int pos)

{ return list[pos]; }

public int getSize()

{ return numItems; }

public boolean isFull()

{ return (numItems>=maxItems); }

public String toString()

{ String s=new String();

for(int i=0; i<numItems; i++)

{ s+="n"+list[i].toString(); }

return s+"n";

}

}

public class ListTest

{ public static void main(String[] args)

{

List list=new List();

(new Double(10.0));

(new String("Java by Definition"));

7

(new Integer(-10));

System.out.println(list);

System.out.println("Position 0:"+(1));

(2);

(0);

System.out.println("List

Size:"+e());

}

}

程序运行结果:

10.0

Java by Definition

-10

Position 0:Java by Definition

List Size:1

3.创建帐号SavingsAccount类。用静态变量存

储年利率。该类的每个对象都有一个私有实例变

savingBalance用来显示帐号里的钱数。提供方

calculateMonthlyInterest计算月利息(按照年

利率乘以帐号里的钱数再除以12;该利息必须

modifyInterestRate设置年利率。写一个测试程序

CalculatorInterest来测试该类。建立两个该类对

象,saver1saver2,分别有人民币2000元和

3000元。设年利率为4%。计算每个帐号的月利

息及新的钱数。设年利率为5%。计算每个帐号

下月的利息及新钱数。

import .*;

public class CalculatorInterest

//测试程序

{ public static void main(String args[])

{ SavingsAccount saver1=new

SavingsAccount(2000); //声明两个对象

SavingsAccount saver2=new

SavingsAccount(3000);

SavingsAccount.modifyInterestRate(0.04);

8

//设置利率为4%

System.out.print("InterestRate");

//输出利率

();

System.out.print("saver1’s balance is:");

//输出用户1的总额

();

System.out.print("saver2’s balance is:");

//输出用户2的总额

();

SavingsAccount.modifyInterestRate(0.05);

//设置利率为5%

System.out.print("InterestRate");

//输出利率

();

System.out.print("saver1’s balance is:");

//输出用户1的总额

();

System.out.print("saver2’s balance is:");

//输出用户2的总额

();

}

}

class SavingsAccount

{ private double savingsBalance; //

声明实例变量

static double annualInterestRate;

//声明静态变量

public SavingsAccount(double

x){ savingsBalance=x; } //构造函数

9

public void add(double x)

{ savingsBalance= savingsBalance+x; }

//计算总存款

public static void modifyInterestRate(double x)

{ annualInterestRate=x; } //

年利率

public void printB()

{ System.out.println(savingsBalance*(1+annua

lInterestRate)); } //输出总额

public void printR()

{ System.out.println(annualInterestRate); }

//输出年利息

}

程序运行结果:

InterestRate0.04

saver1’s balance is:2080.0

saver2’s balance is:3120.0

InterestRate0.05

saver1’s balance is:2100.0

saver2’s balance is:3150.0

4.设计一个交通工具类vehicle,其中的属性包

括速度speed、种类kind;方法包括:设置颜色

setColor,取得颜色getColor。再设计一个子类

Car,增加属性passenger表示可容纳旅客人数,

添加方法取得最大速度getMaxSpeed()

import .*;

public class vehicle

{ private int speed;

private String kind;

private Color color;

public vehicle()

{ speed=2000;

kind= "TO";

color=Color.red;

10

}

public vehicle(int s, String k, Color c)

{ speed=s;

kind= k;

color=c;

}

public void setColor(Color cl)

{ color=cl; }

public void getColor(String)

{ if(equals(kind, k))

{ return color; }

}

}

class Car extends vehicle

{ super(2000,"DD",blue);

int passengers;

public int getMaxSpeed()

{

……

}

}

5.编写3个接口ABC,它们之间具有继承

关系。B接口继承与AC接口继承B;且每个

中包含一常量字符。试通过个类

ImpInterfaceABC

interfaceinheritanceTest类显示接口中常量字符

串来展示接口的继承性。

interface A

{ String a="接口A中的常量";

void showA();

}

interface B extends A

{ String b="接口B中的常量";

void showB();

}

interface C extends B

{ String c="接口C中的常量";

void showC();

}

11

class ImpInterfaceABC implements C

{ public void

showA(){System.out.println(a); }

public void showB(){System.out.println(b); }

public void showC(){System.out.println(c); }

}

class interfaceinheritanceTest

{ public static void main(String args[])

{ ImpInterfaceABC intf=new

ImpInterfaceABC();

();

();

();

}

}

程序运行结果:

接口A中的常量

接口B中的常量

接口C中的常量

** 学校学生图书管理应用程序。某国大学的

学生图书馆管理系统。因为正常借阅是免费的,

但超时借阅就要接受罚款处理,根据超时时间可

分类处罚,一是在超时在两个月内,每本书按其

价格的50%罚款;超过两个月的罚款按借阅图书

3倍处罚。处罚收费管理账单上包含有院系名

称、学生姓名、信用图书超时间以及处罚金额。

12