本文主要是介绍《快学scala第二版》第五章 练习答案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
5.1 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数
class Counter{private var value = 0def increment(): Unit ={if (value < Int.MaxValue){value += 1} else {value}}def current = value
}
5.2 编写一个
BankAccount类,加入deposit和withdraw方法,和一个只读的balance属性
class BankAccount(val balance: Int) {def deposit(){}def withdraw(){}
}
5.3 编写一个Time类,加入只读属性hours和minutes,和一个检查某一时刻是否早于另一时刻的方法before(other:Time):Boolean。Time对象应该以new Time(hrs,min)方式构建。其中hrs以军用时间格式呈现(介于0和23之间) ·
object HelloScala {def main(args: Array[String]): Unit = {var time1 = new Time(3,5)var time2 = new Time(4,8)var time3 = new Time(3,2)println(time1.before(time2))println(time1.before(time3))}}class Time(val hours : Int = 0, val minutes : Int = 0){def before(other: Time) : Boolean = {if (hours < other.hours) {true} else if (hours == other.hours){if (minutes < other.minutes) {true}false} else {false}}override def toString: String = {return hours + ":" + minutes}
}
5.4 重新实现前一个类中的Time类,将内部呈现改成午夜起的分钟数(介于0到24*60-1之间)。不要改变公有接口。也就是说,客户端代码不应因你的修改而受影响
override def toString: String = {return hours * 60 + minutes}
5.5 创建一个Student类,加入可读写的JavaBeans属性name(类型为String)和id(类型为Long)。有哪些方法被生产?(用javap查看。)你可以在Scala中调用JavaBeans的getter和setter方法吗?应该这样做吗?
创建文件 h.sc :
class Student{import scala.beans.BeanProperty@BeanProperty var name : String = ""@BeanProperty var id : Long = 0L
}
命令行调用: scalac h.sc 生成 Student.class:
调用 javap -c Student.class:
Compiled from "h.sc"
public class Student {public java.lang.String name();Code:0: aload_01: getfield #15 // Field name:Ljava/lang/String;4: areturnpublic void name_$eq(java.lang.String);Code:0: aload_01: aload_12: putfield #15 // Field name:Ljava/lang/String;5: returnpublic long id();Code:0: aload_01: getfield #23 // Field id:J4: lreturnpublic void id_$eq(long);Code:0: aload_01: lload_12: putfield #23 // Field id:J5: returnpublic long getId();Code:0: aload_01: invokevirtual #28 // Method id:()J4: lreturnpublic java.lang.String getName();Code:0: aload_01: invokevirtual #31 // Method name:()Ljava/lang/String;4: areturnpublic void setId(long);Code:0: aload_01: lload_12: invokevirtual #34 // Method id_$eq:(J)V5: returnpublic void setName(java.lang.String);Code:0: aload_01: aload_12: invokevirtual #37 // Method name_$eq:(Ljava/lang/String;)V5: returnpublic Student();Code:0: aload_01: invokespecial #41 // Method java/lang/Object."<init>":()V4: aload_05: ldc #43 // String7: putfield #15 // Field name:Ljava/lang/String;10: aload_011: lconst_012: putfield #23 // Field id:J15: return
}
把它拖到IDEA里查看解析后的信息:
class Student() extends scala.AnyRef {@scala.beans.BeanPropertyvar name : _root_.scala.Predef.String = { /* compiled code */ }def getName() : _root_.scala.Predef.String = { /* compiled code */ }def setName(x$1 : _root_.scala.Predef.String) : scala.Unit = { /* compiled code */ }@scala.beans.BeanPropertyvar id : scala.Long = { /* compiled code */ }def getId() : scala.Long = { /* compiled code */ }def setId(x$1 : scala.Long) : scala.Unit = { /* compiled code */ }
}
5.6 在5.2节的Person类中提供一个主构造器,将负年龄转换为0
class Person(var age : Int){age = if(age < 0) 0 else age
}
5.7 编写一个Person类,其主构造器接受一个字符串,该字符串包含名字,空格和姓,如new Person(“Fred Smith”)。提供只读属性firstName和lastName。主构造器参数应该是var,val还是普通参数?为什么?
看同一个对象的参数值是否需要改变,var变量可变,而val不可变。
5.8 创建一个Car类,以只读属性对应制造商,型号名称,型号年份以及一个可读写的属性用于车牌。提供四组构造器。每个构造器fc都要求制造商和型号为必填。型号年份和车牌可选,如果未填,则型号年份为-1,车牌为空串。你会选择哪一个作为你的主构造器?为什么?
class Car(val maker : String, val typeName : String){val typeYear = -1var plate = ""def this(typeYear : Int){this(maker,typeName)}def this(plate : String){this(maker,typeName)this.plate = plate}def this(typeYear : Int,plate : String){this(typeYear)this.plate = plate}
}
5.9 在Java,C#或C++重做前一个练习。Scala相比之下精简多少?
/*** @author weiyuwang* @since 2019/7/23 23:52*/
public class Car {private final String maker;private final String typeName;private final Integer typeYear;private String plate = "";public Car(String maker, String typeName, Integer typeYear, String plate) {this.maker = maker;this.typeName = typeName;this.typeYear = typeYear;this.plate = plate;}public Car(String maker,String typeName,Integer typeYear){this.maker = maker;this.typeName = typeName;this.typeYear = typeYear;}public Car(String maker,String typeName,String plate){this.maker = maker;this.typeName = typeName;this.plate = plate;this.typeYear = -1;}public Car(String maker,String typeName){this.maker = maker;this.typeName = typeName;this.typeYear = -1;}public String getMaker() {return maker;}public String getTypeName() {return typeName;}public Integer getTypeYear() {return typeYear;}public String getPlate() {return plate;}public void setPlate(String plate) {this.plate = plate;}
}
5.10 考虑如下的类
class Employ(val name:String,var salary:Double){
def this(){this(“John Q. Public”,0.0)}
}
重写该类,使用显示的字段定义,和一个缺省主构造器。你更倾向于使用哪种形式?为什么?
class Employ{ val name:String = "John Q. Public" var salary:Double = 0.0
}
这篇关于《快学scala第二版》第五章 练习答案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!