首页 java习题答案第7章习题答案

java习题答案第7章习题答案

举报
开通vip

java习题答案第7章习题答案习题 1. 类之间的关系除了聚合和关联外,还有继承,请用 UML 符号描述下述类之间的关 系。 1) 2) 3) 4) 5) 账户和存款帐户 学生和人 水果和橙子 教师和课程 班级和学生 答:1)继承关系; 2)继承关系; 3)继承关系; 4)关联关系; 5)聚合关系。 2. 简述 Object 的意义,以及在判断相等时,子类需要如何重写超类的方法。 答:Object 的类。它是所有 Java 类(JDK 提供的,第三方类库、用户自定义的)的根类 一个类如果在声明时没有明确使用 extends 来标记自己派生于某个...

java习题答案第7章习题答案
习题 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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_693683
暂无简介~
格式:doc
大小:534KB
软件:Word
页数:9
分类:工学
上传时间:2018-09-10
浏览量:183