快学scala 第6章 对象 读书笔记及习题答案代码

本文探讨Scala中对象与伴生对象的概念及应用,包括如何使用伴生对象替代Java中的静态方法,创建枚举类型,并通过多个实例演示如何正确利用这些特性。

chapter 6 对象

标签:快学scala


一、笔记

  1. 如果一个对象从未被使用,那么其构造器也不会被执行。对象本质上可以拥有类的所有特性,它甚至可以扩展其他类或特质。但不能提供构造器参数。 
    java中通常用到既有实例方法又有静态方法的类,scala中可以通过类与类同名的“伴生”对象来达到同样目的。类与其伴生对象可以互相访问私有特性,必须在同一源文件中。
  2. 一个apply方法返回伴生类的对象。Array(100)调用apply(100),输出一个单元素(整数100)的Array[Int]; new Array(100)调用的是构造器this(100),结果时Array[Nothing],包含100个null元素。
  1. class Account private(val id: Int, initialBalance: Double){
  2. private var balance = initialBalance
  3. ...
  4. }
  5. object Account{ //伴生对象
  6. def apply(initialBalance: Double) = {
  7. new Account(newUniqueNumber(), initialBalance)
  8. ...
  9. }
  10. }
  11. val acct = Account(1000, 0) //调用,构造账户

应用程序对象,扩展App特质,加入命令行参数判断

  1. object Hello extends App{
  2. if(args.length > 0)
  3. println("Hello, " + args(0))
  4. else
  5. println("Hello , world !")
  6. }
  7. $ scala -Dscala.time Hello Fread
  8. Hello, Fread
  9. [total 2ms] //显示运行时间
  1. scala标准库一个Enumeration助手类,用于产生枚举。
  1. object TrafficLightColor extends Enumeration{
  2. val Red, Yellow, Green = Value
  3. }

二、习题答案

6.1 编写一个 Conversions 对象,加入 inchesToCentimeters,gallonsToLiters 和 milesToKilometers 方法

  1. object Conversions{
  2. def inchesToCentimeters(value: Double)={ value * 2.54}
  3. def gallonsToLiters(value: Double)= {value * 3.785411}
  4. def milesToKilometers(value: Double){value * 1.609344}
  5. }

6.2 前一个练习不是很面向对象。提供一个通用的超类 UnitConversion并定义扩展该超类的 InchesToCentimeters,GallonsToLiters 和 MilesToKilometers 对象

  1. class UnitConversion(val factor: Double){
  2. def convert(value: Double): Double = factor * value
  3. }
  4. object InchesToSantimeters extends UnitConversion(2.54)
  5. object GallonsToLiters extends UnitConversion(3.78541178)
  6. object MilesToKilometers extends UnitConversion(1.609344)
  7. val temperate = InchesToSantimeters(30.0) //调用伴生对象

6.3 定义一个扩展自 java.awt.Point 的 Origin对象。为什么说这实际上不是个好主意?(仔细看 Point 类的方法)Point 中的 getLocation 方法返回的是 Point 对象,如果想返回 Origin 对象,需要 Origin 类才行

  1. import java.awt.Point
  2. object Origin extends Point with App{
  3. override def getLocation: Point = super.getLocation
  4. Origin.move(2,3)
  5. println(Origin.toString)
  6. }

6.4 定义一个 Point 类和一个伴生对象,使得我们可以不用 new 而直接用 Point(3,4)来构造 Point 实例 apply 方法的使用

  1. class Point(x:Int,y:Int){
  2. override def toString():String = "x = "+x +" y =" +y
  3. }
  4. object Point extends App{
  5. def apply(x: Int, y: Int) = new Point(x,y)
  6. val p = Point(1,2)
  7. println(p)
  8. }

6.5 编写一个 Scala 应用程序,使用 App 特质,以反序打印命令行参数,用空格隔开。举例来说,scala Reverse Hello World 应该打印 World Hello

  1. object Reverse extends App{
  2. println(args.reverse.mkString(" "))
  3. }

6.6 编写一个扑克牌 4 种花色的枚举,让其 toString 方法分别返回♣,♦,♥,♠

  1. object Suits extends Enumeration{
  2. type Suits = Value
  3. val Spade = Value("♠")
  4. val Club = Value("♣")
  5. val Heart = Value("♥")
  6. val Diamond = Value("♦")
  7. override def toString():String={
  8. Suits.values.mkString(",")
  9. }
  10. }
  11. println(Suits.Club)
  12. println(Suits)

6.7 实现一个函数,检查某张牌的花色是否为红色

  1. object suits extends Enumeration with App{
  2. type suits = Value
  3. val Spade = Value("♠")
  4. val Club = Value("♣")
  5. val Heart = Value("♥")
  6. val Diamond = Value("♦")
  7. def isRed(card: suits) = card == Heart || card == Diamond
  8. isRed(suits.Club)
  9. println(isRed(suits.Club))
  10. }

6.8 编写一个枚举,描述 RGB 立方体的 8 个角。ID 使用颜色值(例如 :红色是 0xff0000)

  1. object RGBCube extends Enumeration {
  2. val black = Value(0x000000, "Black")
  3. val red = Value(0xff0000, "Red")
  4. val green = Value(0x00ff00, "Green")
  5. val blue = Value(0x0000ff, "Blue")
  6. val yellow = Value(0xffff00, "Yellow")
  7. val magenta = Value(0xff00ff, "Magenta")
  8. val cyan = Value(0x00ffff, "Cyan")
  9. val white = Value(0xffffff, "White")
  10. }
  11. for( c <- RGBCube.values ) println("0x%06x: %s".format(c.id, c))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值