习题
1.
类之间的关系除了聚合和关联外,还有继承,请用 UML 符号描述下述类之间的关
系。
1)
2)
3)
4)
5)
账户和存款帐户
学生和人
水果和橙子
教师和课程
班级和学生
答:1)继承关系; 2)继承关系; 3)继承关系; 4)关联关系; 5)聚合关系。
2.
简述 Object 的意义,以及在判断相等时,子类需要如何重写超类的方法。
答:Object 的类。它是所有 Java 类(JDK 提供的,第三方类库、用户自定义的)的根类
一个类如果在声明时没有明确使用 extends 来标记自己派生于某个类,那么编译器将自动将
Object 类作为该类的超类,因此,所有的类最终都来自 Object,按照继承的特性,所有的
类都继承了 Object 类中的所有方法。Object 提供了一个对象基本的行为定义,例如,两个
对象的相同比较(equals(…))、对象的字符串表示(toString())、对象的复制(clone())等等。这
些没有用 final 修饰的方法其行为一般都需要在子类中重新定义。
在判断相等时,子类需要重写 Object 类中的 equals 方法,定义自身判断相等的原则。
3.
超类的构造方法是否可以被子类覆盖(重写)?
答:不会,子类并不继承超类的构造方法作为自己的构造方法,因为构造方法用来构
造类的对象,子类和父类并非同一类型,因此子类不能直接继承父类的构造方法,必须有
自己的构造方法,但是子类的构造方法并不会覆盖超类的构造方法。虽然不能继承超类的
构造方法,但子类可以通过 super 关键字来调用父类已定义的构造方法。
4.
试述 super 的作用和使用规则。
答:1)显式的调用父类的方法当从一个类继承时,子类和父类都有一个同名方法,也就
是子类覆盖了父类的方法,可是又想调用父类的方法,那么就要用 super。
2)在构造方法中,与 this 用法类似,利用 super 可以调用父类的构造方法。
5. 什么是多态?简述 Java 中多态的实现机制。
答:多态性是面向对象的核心特征之一,类的多态性提供类中成员设计的灵活性和方法
执行的多样性。在 JAVA 中多态性表现如下:
(1)方法重载
重载表现为同一个类中方法的多态性.一个类生命多个重载方法就是为一种功能提供多
种实现.编译时,根据方法实际参数的数据类型\个数和次序,决定究竟应该执行重载方法中的
哪一个.
(2)子类重定义从父类继承来的成员
当子类从父类继承来的成员不适合子类时,子类不能删除它们,但可以重定义它们,子
类重定义父类成员,同名成员在父类与子类之间表现出多态性,父类对象引用父类成员,
- 128 -
子类对象引用子类成员,不会产生冲突和混乱.
子类可重定义父类的同名成员变量,称子类隐藏父类成员变量。子类也可以重定义父类
的同名成员方法,当子类方法的参数列表与父类方法参数列表完全相同时,称为子类方法
覆盖(override)父类方法。覆盖父类方法时,子类方法的访问权限不能小于父类方法的权
限。
从编译运行的角度,在 JAVA 中多态有两种形式:
1)编译时多态性
对于多个同名方法,如果在编译时能够确定执行同名方法中的哪一个,则称为编译时多
态性.
2)运行时多态性
如果在编译时不能确定,只能在运行时才能确定执行多个同名方法中的哪一个,则称
为运行时多态性。
6. 简述继承和实现接口的区别。
答:简单来看,抽象类和接口都可以允许定义子类必须实现的方法。但实际上两者在
语义和用途上有着很大的差别。
从语法规定来看它们的区别很明显。Java 支持一个类只能继承一个超类,但支持一个
类实现多个接口,一个接口可以继承多个接口;另外,接口中的方法仅是抽象方法的声
明,而抽象类中可以包含方法的具体实现;
最重要的,抽象类本身是一类型系统中的超类,而接口仅是抽象方法的集合。因此抽
象类更多的用在描述问题的类的层次结构中,而接口更多的用在描述系统(或组件)所提供
的公共服务中。
7. 假定银行的一个存取款系统有两类客户,一类是现金用户,一类是信用卡用户,每种
客户都可以实现存、取、和查询余额和交易历史(信用卡用户还可以查询透支情况和信
用情况)要求。对于现金用户,每次取款操作只能在账户实际额度内操作,而信用卡用
户则根据其信用级别有一定的透支限额,请根据你的理解,运用所学的抽象、接口、
继承等面向对象的概念建立模型。
abstract class Account {
String name;
String aid;
double balance;
public Account(String name, String aid, double balance) {
// 请把构造函数补充完整
this.name = name;
this.aid = aid;
this.balance = balance;
}
public void deposit(double amount) {
// 请把存款方法补充完整
this.balance += amount;
}
public abstract void withdraw(double amount);
- 129 -
public double getBalance() {
// 请把查询余额方法补充完整
return balance;
}
public String toString() {
return name + "," + aid + "," + balance;
}
}
class CashAccount extends Account {
String type;// 工资卡、借记卡、理财卡
public CashAccount(String name, String aid, double balance,
String type) {
super(name, aid, balance);
this.type = type;
}
@Override
public void withdraw(double amount) {
// TODO Auto-generated method stub
if (balance < amount) {
System.out.println("余额不足,不能取款");
} else {
System.out.println(name + "取了" + amount);
balance -= amount;
}
}
public String toString() {
String str;
str = super.toString();
str += "," + type;
return str;
}
}
class CreditAccount extends Account {
char creditLevel;// 信用级别
double lineOfCredit;// 信用额度
public CreditAccount(String name, String aid, double balance,
char creditLevel) {
super(name, aid, balance);
this.creditLevel = creditLevel;
calcLineOfCredit();
}
// 计算信用额度
public void calcLineOfCredit() {
switch (creditLevel) {
case 'A':
lineOfCredit = 10000;
break;
case 'B':
lineOfCredit = 5000;
break;
case 'C':
lineOfCredit = 2000;
break;
case 'D':
lineOfCredit = 1000;
break;
}
}
- 130 -
// 取款
@Override
public void withdraw(double amount) {
// TODO Auto-generated method stub
double temp = balance - amount;
if (temp >= 0)// 没透支
{
System.out.println(name + "没透支,你取了" +
amount);
balance -= amount;
} else// 透支
{
temp = -temp;
if (temp <= lineOfCredit)// 小于透支额度
{
System.out.println(name + "透支了,取了" +
amount + ",透支了" + temp);
balance -= amount;
} else// 超过透支额度
{
System.out.println(name + "透支额度不允许此次
操作");
}
}
}
public String toString() {
String str;
str = super.toString();
str += "," + creditLevel + "," + lineOfCredit;
return str;
}
}
8. 在一个源程序中,定义四个类:
1)
第一个类是图形类(shape),含有一个成员变量 color(字符串类型),一个没有
参数的构造方法,以及一个有一个字符串类型参数的构造方法来初始化颜色变
量,还有一个打印颜色变量的成员方法 show;
2)
第二个类是圆形类(circle)继承了图形类,自己又含有一个变量半径 r,有一个
有两个参数的构造方法,来初始化颜色和半径,还有一个打印两个成员变量的成
员方法 show;
3)
第三个类是矩形类(rectangle)继承了图形类,自己又含有两个变量长 a 和宽
b,有一个有三个参数的构造方法,来初始化颜色、长和宽,还有一个打印三个
成员变量的成员方法 show;
4)
答:
class Shape {
String color;
public Shape() {
super();
}
第四个类是测试类(TestShape),分别定义圆形类和矩形类的实例对象,并用
show 方法来测试自己的定义。
- 131 -
public Shape(String color) {
super();
this.color = color;
}
public void show() {
System.out.println("color:" + color);
}
}
class Circle extends Shape{
private double r;
public Circle(String color,double r) {
super(color);
this.r = r;
}
public void show()
{
System.out.println("color:"+color+",r:"+r);
}
}
class Rectangle extends Shape{
private double height;
private double width;
public Rectangle(String color,double height, double width) {
super(color);
this.height = height;
this.width = width;
}
public void show()
{
System.out.println("color:"+color+",width:"+width+",height"+heigh
t);
}
}
class TestShape{
public static void main(String[] args) {
Circle c=new Circle("red",2.5);
Rectangle r=new Rectangle("green",3.5,2.6);
c.show();
r.show();
}
}
9.
如果有两个类 A、B(注意不是接口),你想同时使用这两个类的功能,那么你会如何
编写这个 C 类呢?
答:可以在 C 这个类中定义两个 A, B 类型的对象变量,然后调用这两个类中方法,完
成特定的功能。
10. 有一个抽象父类 Car,内有属性:
int maxSpeed
构造方法:Car(int maxSpeed)
抽象方法:void stop();
有两个子类 Ford, QQ 继承父类
请调用父类构造方法,初始化赋值 maxSpeed
- 132 -
请重写 stop()方法,要求
Ford 当 maxSpeed >= 300; 打印语句“停车”
QQ 当 maxSpeed >= 120; 打印语句“停车”
abstract class Car {
int maxSpeed;
public Car(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
public abstract void stop();
}
class Ford extends Car {
public Ford(int maxSpeed) {
super(maxSpeed);
// TODO Auto-generated constructor stub
}
@Override
public void stop() {
// TODO Auto-generated method stub
if (maxSpeed >= 300)
System.out.println("停车");
}
}
class QQ extends Car {
public QQ(int maxSpeed) {
super(maxSpeed);
}
@Override
public void stop() {
if(maxSpeed>=120)
System.out.println("停车");
}
}
11. 下面程序运行后的输出是什么?
class ThisClass{
public static void main(String[] args){
Object o=(Object)new ThisClass();
Object s=new Object();
if(o.equals(s))
System.out.println("true");
}
}
答:没有任何输出,因为 o.equals(s)的结果为 false,这是两个不同的对象。
12. 指出下面程序运行后的结果?
class C1{
static int j=0;
public void method(int a){
j++;
}
}
class Test extends C1{
public int method(){
return j++;
}
public void result(){
- 133 -
method(j);
System.out.println(j+method());
}
public static void main(String[] args){
new Test().result();
}
}
答:结果是 2。
13. 下面程序编译运行的结果是什么?
interface Action{
int i=10;
}
class Happy implements Action {
public static void main(String[] args) {
Happy h=new Happy();
int j;
j = Action.i;
j = Happy.i;
j = h.i;
}
}
答:j 的值为 10.
14. 在 java.util 包中有一接口 Comparator,提供了比较器的功能。请根据此接口定义的比
较方法,针对 Account 中的 id 和余额两个字段,完成两个比较器类的定义,并改写程
序 7-4,验证你的设计是否正确。
//一个实现了Comparable接口的Account类,按ID进行比较
import java.util.Arrays;
public class Account2 implements Comparable {
private String id;// 账户id,唯一性的标识
private String name;// 账户拥有人的姓名
private int balance;// 余额
public Account2(String id, String name, int balance) {
this.id = id;
this.name = name;
this.balance = balance;
}
// 取款的方法,返回本次取出的金额,如果为0,表示余额不足
public int withdraw(int amount) {
int result = 0;
if (this.balance >= amount) {
this.balance = this.balance - amount;
result = amount;
}
return result;
}
public int getBalance() {
return this.balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
- 134 -
public String getId() {
return id;
}
// toString方法覆盖了来自根类Object的方法
@Override
public String toString() {
return "Account[id:" + id + ",name:" + name + ",balance:" +
balance
+ "]";
}
// compareTo方法覆盖了来自接口的方法
@Override
public int compareTo(Object o) {
int result = 0;
// 这里忽略了o的类型不是Account的情况
Account2 t = (Account2) o;
// 利用字符串对象自身的compareTo()方法作为账户大小的比较
return this.id.compareTo(t.getId());
}
public static void main(String[] args) {
Account2[] accounts = new Account2[5];
accounts[0] = new Account2("001", "王峰", 1000);
accounts[1] = new Account2("002", "张静", 1500);
accounts[2] = new Account2("004", "翟宇", 660);
accounts[3] = new Account2("003", "鲁宁", 800);
accounts[4] = new Account2("005", "刘新", 1700);
Arrays.sort(accounts);
for (int i = 0; i < accounts.length; i++) {
System.out.println(accounts[i]);
}
}
}
////一个实现了Comparable接口的Account类,按余额进行比较
import java.util.Arrays;
public class Account3 implements Comparable {
private String id;// 账户id,唯一性的标识
private String name;// 账户拥有人的姓名
private int balance;// 余额
public Account3(String id, String name, int balance) {
this.id = id;
this.name = name;
this.balance = balance;
}
// 取款的方法,返回本次取出的金额,如果为0,表示余额不足
public int withdraw(int amount) {
int result = 0;
if (this.balance >= amount) {
this.balance = this.balance - amount;
result = amount;
}
return result;
}
public int getBalance() {
return this.balance;
- 135 -
}
public void setBalance(int balance) {
this.balance = balance;
}
public String getId() {
return id;
}
// toString方法覆盖了来自根类Object的方法
@Override
public String toString() {
return "Account[id:" + id + ",name:" + name + ",balance:" +
balance
+ "]";
}
// compareTo方法覆盖了来自接口的方法
@Override
public int compareTo(Object o) {
int result = 0;
// 这里忽略了o的类型不是Account的情况
Account3 t = (Account3) o;
// 利用字符串对象自身的compareTo()方法作为账户大小的比较
return this.balance-t.getBalance();
}
public static void main(String[] args) {
Account3[] accounts = new Account3[5];
accounts[0] = new Account3("001", "王峰", 1000);
accounts[1] = new Account3("002", "张静", 1500);
accounts[2] = new Account3("004", "翟宇", 660);
accounts[3] = new Account3("003", "鲁宁", 800);
accounts[4] = new Account3("005", "刘新", 1700);
Arrays.sort(accounts);
for (int i = 0; i < accounts.length; i++) {
System.out.println(accounts[i]);
}
}
}
- 136 -
本文档为【java习题答案第7章习题答案】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。