scala习题八——继承
来源:互联网 发布:知乎跳转淘宝链接 编辑:程序博客网 时间:2024/05/29 02:22
1.扩展如下的bankaccount类,新类checkingacount对每次存款和取款都收取1美元手续费
class BankAccount(initialBalance:Double){ private var balance=initialBalance; def deposit(amount:Double)={ balance+=amount;balance; } def withdraw(amount:Double)={ balance-=amount;balance; } } class CheckingAccount(initialBalance:Double) extends BankAccount(initialBalance){ private var balance=initialBalance; override def deposit(amount:Double)={ balance+=(amount-1);balance; } override def withdraw(amount:Double)={ balance-=(amount+1);balance; } def show=balance; }``2.扩展前一个练习的BankAccount类,新类SavingAccount每个月都有利息产生(earnMonthlyInterest方法被调用),并且有每月三次免手续费的存款或取款,在earnMonthlyInterest方法中重置交易计数,
class SavingAccount(initialBalance:Double) extends BankAccount(initialBalance){
private var balance=initialBalance;
private var traceCount=3;
private val lixi=0.003;
import java.util.Date;
val date=new Date();
private var lastMonth=date.getMonth();//初始化是记录月份
override def deposit(amount:Double)={
if(traceCount>0){
traceCount-=1;
balance+=(amount);
}else{
balance+=(amount-1);
}
balance;
}
override def withdraw(amount:Double)={
if(traceCount>0){
traceCount-=1;
balance-=(amount);
}else{
balance-=(amount+1);
}
balance;
}
def earnMonthlyInterest():Unit={
val nowdate=new Date();
val nowmonth=nowdate.getMonth();
if(nowmonth!=lastMonth){
lastMonth=nowmonth;
traceCount=3;
balance=balance*(1+lixi);
}
}
3.翻开你喜欢的C++或者java教科书,一定会找到用来继承层级的示例,可能是员工,动物,图形或类似的东西,用scala来生成这个示例动物示例
class animal{
def speak:Unit={println(“I am a Animal”)};
}
class Cat extends animal{
override def speak:Unit={
println(“I am a Cat”);
}
}
class Tiger extends Cat{
override def speak:Unit={
println(“I am a Tiger”);
}
}
4.定义一个抽象类Item,加入方法price和description,SimpleItem是一个构造器中给出价格好描述的物件。利用val可以重写def这个事实。Bundle是一个可以包含其他物件的物件,其价格是打包中所有物件的价格之和,同时提供一个将物件添加到打包中的机制,以及一个合适的description方法def返回类型与之后的重写类型必须一致
abstract class item{ def price:Double; def description:String; override def toString="Description="+description()+"price="+price(); } class SimpleItem(Price:Double,Description:String) extends item{ override val price:Double=Price; override val description:String=Description; } class Bundle extends item{ import scala.collection.mutable.ArrayBuffer; val itemArray=new ArrayBuffer[SimpleItem](); var totalPrice:Double=0; override def price:Double={ for(i<- (0 until itemArray.length)){ totalPrice=totalPrice+itemArray(i).price; } totalPrice; } override val description:String={ itemArray.mkString(","); } def addItem(item:SimpleItem){ itemArray+=item; } }
5.设计一个Point类,其X坐标和Y坐标可以通过构造器提供,提供一个子类LabledPoint,其构造器接受一个标签值和x,y,比如new LabeledPoint("Black Thursday"),1929,30);
class Point(X:Double,Y:Double){
val x=X;
val y=Y;
}
class LabledPoint(label:String,X:Double,Y:Double) extends Point(X,Y){
private val Label=label;
override def toString=”Label=”+Label+”X=”+X+”Y=”+Y;
}
6.定义一个抽象类Shape,一个抽象方法centerPoint,以及该抽象类的子类Rectangle和Circle,为子类提供合适的构造器,并重写centerPoint方法
abstract class Shape{
def centerPoint:(Double,Double);
}
class Cicrle(x:Double,y:Double,Radius:Double) extends Shape{
override def centerPoint={(x,y)};
}
class Rectangle(x:Double,y:Double,len:Double,width:Double) extends Shape{
override def centerPoint={
(x+len/2,y+width/2);
};
}
7.提供一个square类,扩展自java.awt.Rectangle并且有三个构造器,一个以给定的端点和宽度构造正方形,一个以(0,0)为端点,0为宽度的构造的正方形,一个以0,0为端点,给定的宽度来构造正方形
import java.awt.{Point => Po,Rectangle=>Rect}
class Square(point:Po,len:Int) extends Rect(point.x,point.y,len,len){
def this(){
this(new Po(0,0),0);
}
def this(len:Int){
this(new Po(0,0),len);
}
}
8.编译8.6节的Person和SecretAgent类并使用javap分析类文件。总共有多少name的构造方法?他们分别取什么值(提示,可以用-c和private选项)
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
C:\Users\pengchen>javap C:\Users\pengchen\workspace\hello\bin\person.class
Compiled from “person.scala”
public class person {
public java.lang.String name();
public java.lang.String toString();
public person(java.lang.String);
}
C:\Users\pengchen>javap C:\Users\pengchen\workspace\hello\bin\SecretAgent.class
Compiled from “person.scala”
public class SecretAgent extends person {
public java.lang.String name();
public java.lang.String toString();
public SecretAgent(java.lang.String);
}
C:\Users\pengchen>javap -c C:\Users\pengchen\workspace\hello\bin\SecretAgent.cla
ss
Compiled from “person.scala”
public class SecretAgent extends person {
public java.lang.String name();
Code:
0: aload_0
1: getfield #14 // Field name:Ljava/lang/String;
4: areturn
public java.lang.String toString();
Code:
0: aload_0
1: getfield #18 // Field toString:Ljava/lang/String;
4: areturn
public SecretAgent(java.lang.String);
Code:
0: aload_0
1: aload_1
2: invokespecial #22 // Method person.””:(Ljava/lan
g/String;)V
5: aload_0
6: ldc #24 // String secret
8: putfield #14 // Field name:Ljava/lang/String;
11: aload_0
12: ldc #24 // String secret
14: putfield #18 // Field toString:Ljava/lang/String;
17: return
}
C:\Users\pengchen>javap -private C:\Users\pengchen\workspace\hello\bin\SecretAge
nt.class
Compiled from “person.scala”
public class SecretAgent extends person {
private final java.lang.String name;
private final java.lang.String toString;
public java.lang.String name();
public java.lang.String toString();
public SecretAgent(java.lang.String);
}
C:\Users\pengchen>
“`
两个值,一个是传入的codename,另一个是“secret”
9.在8.10节的creature类中,将val range替换成一个def,如果你在Ant子类中也用def的话会有什么效果,如果子类中也用val的话又会有什么效果?为甚么
用def的话并无副作用,但子类使用val的话编译无法通过,因为val只能重写val或者不带参数的def,而此时的def会带上Int参数
10.文件scala/collection/immutable/Stack.scala包含如下定义
class Stack[A] protected {protected val elems:List[A]}
请解释protected关键词的含义(提示:回顾我们在第5章关于私有构造器的讨论)
此构造方法只能被其子类调用,其他类不能调用
- scala习题八——继承
- 快学Scala习题解答—第八章 继承
- 快学Scala习题解答—第八章 继承
- Scala学习(八)---Scala继承
- Javase—继承习题
- scala习题(十)——特质
- scala习题(十三)——集合
- scala 学习(十二)——继承
- 《快学Scala》习题详解 第8章 继承
- scala习题九——文件和正则表达式
- scala习题(11)——操作符
- scala习题(12)——高阶函数
- scala习题(14)——模式匹配和样例类
- 快学scala第十六章习题——XML处理
- 快学Scala习题解答—第一章 基础
- 快学Scala习题解答—第五章 类
- 快学Scala习题解答—第六章 对象
- 快学Scala习题解答—第十章 特质
- 浩辰电气表格和天正电气表格
- appium在MAC上环境搭建
- 黑马程序员——OC之NSString
- 小学三年级题目 five+one+two=eight
- python-变量命名规范
- scala习题八——继承
- 在阿里云ECS下安装java运行环境
- leetcode Sum Root to Leaf Numbers
- oVirt试验迁移虚拟机总结小记
- android常见错误
- C语言学习笔记(20) 数组参数和指针参数分析
- 用idea编写appium用例
- Android layer type与WebView白屏以及WebView不随动画而动的问题
- LaTeX新人教程,30分钟从完全陌生到基本入门