快学scala习题解答--第五章 类

5 类  

5.1 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数
 
Scala代码   收藏代码
  1. class Count{  
  2.   private var value = Int.MaxValue  
  3.   def increment(){if(value < Int.MaxValue) value + 1 else value }  
  4.   def current = value  
  5. }  


5.2 编写一个BankAccount类,加入deposit和withdraw方法,和一个只读的balance属性  
Scala代码   收藏代码
  1. class BankAccount(val balance:Int = 0){  
  2.   def deposit(){}  
  3.   def withdraw(){}  
  4. }  


5.3 编写一个Time类,加入只读属性hours和minutes,和一个检查某一时刻是否早于另一时刻的方法before(other:Time):Boolean。Time对象应该以new Time(hrs,min)方式构建。其中hrs以军用时间格式呈现(介于0和23之间)  
Scala代码   收藏代码
  1. class Time(val hours:Int,val minutes:Int){  
  2.   
  3.    def before(other:Time):Boolean={  
  4.      hours < other.hours || (hours == other.hours && minutes < other.minutes)  
  5.    }  
  6.   
  7.    override def toString():String={  
  8.      hours + " : " + minutes  
  9.    }  
  10. }  


5.4 重新实现前一个类中的Time类,将内部呈现改成午夜起的分钟数(介于0到24*60-1之间)。不要改变公有接口。也就是说,客户端代码不应因你的修改而受影响  
Scala代码   收藏代码
  1. class Time(val hours:Int,val minutes:Int){  
  2.   
  3.   def before(other:Time):Boolean={  
  4.     hours < other.hours || (hours == other.hours && minutes < other.minutes)  
  5.   }  
  6.   
  7.   override def toString():String={  
  8.      hours * 60 + minutes   
  9.   }  
  10. }  


5.5 创建一个Student类,加入可读写的JavaBeans属性name(类型为String)和id(类型为Long)。有哪些方法被生产?(用javap查看。)你可以在Scala中调用JavaBeans的getter和setter方法吗?应该这样做吗?
 
生成了name(),name_=(),id(),id_=(),setName(),getName(),setId(),getId() 编写代码如下 
Scala代码   收藏代码
  1. import scala.reflect.BeanProperty  
  2.   
  3. class Student{  
  4.   
  5.     @BeanProperty var name:String = _  
  6.     @BeanProperty var id:Long = _  
  7. }  


javap -c Student 后显示如下 

Javap代码   收藏代码
  1. Compiled from "Student.scala"  
  2. public class Student extends java.lang.Object implements scala.ScalaObject{  
  3. public java.lang.String name();  
  4.   Code:  
  5.    0:   aload_0  
  6.    1:   getfield        #13; //Field name:Ljava/lang/String;  
  7.    4:   areturn  
  8.   
  9. public void name_$eq(java.lang.String);  
  10.   Code:  
  11.    0:   aload_0  
  12.    1:   aload_1  
  13.    2:   putfield        #13; //Field name:Ljava/lang/String;  
  14.    5:   return  
  15.   
  16. public void setName(java.lang.String);  
  17.   Code:  
  18.    0:   aload_0  
  19.    1:   aload_1  
  20.    2:   putfield        #13; //Field name:Ljava/lang/String;  
  21.    5:   return  
  22.   
  23. public long id();  
  24.   Code:  
  25.    0:   aload_0  
  26.    1:   getfield        #19; //Field id:J  
  27.    4:   lreturn  
  28.   
  29. public void id_$eq(long);  
  30.   Code:  
  31.    0:   aload_0  
  32.    1:   lload_1  
  33.    2:   putfield        #19; //Field id:J  
  34.    5:   return  
  35.   
  36. public void setId(long);  
  37.   Code:  
  38.    0:   aload_0  
  39.    1:   lload_1  
  40.    2:   putfield        #19; //Field id:J  
  41.    5:   return  
  42.   
  43. public long getId();  
  44.   Code:  
  45.    0:   aload_0  
  46.    1:   invokevirtual   #25; //Method id:()J  
  47.    4:   lreturn  
  48.   
  49. public java.lang.String getName();  
  50.   Code:  
  51.    0:   aload_0  
  52.    1:   invokevirtual   #28; //Method name:()Ljava/lang/String;  
  53.    4:   areturn  
  54.   
  55. public Student();  
  56.   Code:  
  57.    0:   aload_0  
  58.    1:   invokespecial   #34; //Method java/lang/Object."<init>":()V  
  59.    4:   return  
  60.   
  61. }  


5.6 在5.2节的Person类中提供一个主构造器,将负年龄转换为0  
Scala代码   收藏代码
  1. class Person(var age:Int){  
  2.   age = if(age < 00 else age  
  3. }  


5.7 编写一个Person类,其主构造器接受一个字符串,该字符串包含名字,空格和姓,如new Person("Fred Smith")。提供只读属性firstName和lastName。主构造器参数应该是var,val还是普通参数?为什么?
 
必须为val。如果为var,则对应的此字符串有get和set方法,而Person中的firstName和lastName为只读的,所以不能重复赋值。如果为var则会重复赋值而报错 

5.8 创建一个Car类,以只读属性对应制造商,型号名称,型号年份以及一个可读写的属性用于车牌。提供四组构造器。每个构造器fc都要求制造商和型号为必填。型号年份和车牌可选,如果未填,则型号年份为-1,车牌为空串。你会选择哪一个作为你的主构造器?为什么?  
这个没太明白题意。。。 
Scala代码   收藏代码
  1. class Car(val maker:String,val typeName:String,val year:Int = -1,var carLice:String = ""){  
  2. }  



5.9 在Java,C#或C++重做前一个练习。Scala相比之下精简多少?
 
 

5.10 考虑如下的类 

class Employ(val name:String,var salary:Double){ 
    def this(){this("John Q. Public",0.0)} 


重写该类,使用显示的字段定义,和一个缺省主构造器。你更倾向于使用哪种形式?为什么?
 
Scala代码   收藏代码
  1. class Employ{  
  2.     val name:String = "John Q. Public"   
  3.     var salary:Double = 0.0  
  4. }  


个人更喜欢第二种方式,简单明了。 

博客原地址:
http://www.ivanpig.com/blog/?p=467
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值