快学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之间)。

不要改变公有接口。也就是说,client代码不应因你的改动而受影响

 
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."":()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

转载于:https://www.cnblogs.com/lxjshuju/p/7286104.html

你可能感兴趣的:(快学scala习题解答--第五章 类)