《快学scala第二版》第五章 练习答案

2023-11-01 06:48

本文主要是介绍《快学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第二版》第五章 练习答案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/321217

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

poj 3104 二分答案

题意: n件湿度为num的衣服,每秒钟自己可以蒸发掉1个湿度。 然而如果使用了暖炉,每秒可以烧掉k个湿度,但不计算蒸发了。 现在问这么多的衣服,怎么烧事件最短。 解析: 二分答案咯。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <c

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

【附答案】C/C++ 最常见50道面试题

文章目录 面试题 1:深入探讨变量的声明与定义的区别面试题 2:编写比较“零值”的`if`语句面试题 3:深入理解`sizeof`与`strlen`的差异面试题 4:解析C与C++中`static`关键字的不同用途面试题 5:比较C语言的`malloc`与C++的`new`面试题 6:实现一个“标准”的`MIN`宏面试题 7:指针是否可以是`volatile`面试题 8:探讨`a`和`&a`