chapter 6 对象
标签:快学scala
一、笔记
- 如果一个对象从未被使用,那么其构造器也不会被执行。对象本质上可以拥有类的所有特性,它甚至可以扩展其他类或特质。但不能提供构造器参数。
java中通常用到既有实例方法又有静态方法的类,scala中可以通过类与类同名的“伴生”对象来达到同样目的。类与其伴生对象可以互相访问私有特性,必须在同一源文件中。 - 一个apply方法返回伴生类的对象。Array(100)调用apply(100),输出一个单元素(整数100)的Array[Int]; new Array(100)调用的是构造器this(100),结果时Array[Nothing],包含100个null元素。
class Account private(val id: Int, initialBalance: Double){private var balance = initialBalance...}object Account{ //伴生对象def apply(initialBalance: Double) = {new Account(newUniqueNumber(), initialBalance)...}}val acct = Account(1000, 0) //调用,构造账户
应用程序对象,扩展App特质,加入命令行参数判断
object Hello extends App{if(args.length > 0)println("Hello, " + args(0))elseprintln("Hello , world !")}$ scala -Dscala.time Hello FreadHello, Fread[total 2ms] //显示运行时间
- scala标准库一个Enumeration助手类,用于产生枚举。
object TrafficLightColor extends Enumeration{val Red, Yellow, Green = Value}
二、习题答案
6.1 编写一个 Conversions 对象,加入 inchesToCentimeters,gallonsToLiters 和 milesToKilometers 方法
object Conversions{def inchesToCentimeters(value: Double)={ value * 2.54}def gallonsToLiters(value: Double)= {value * 3.785411}def milesToKilometers(value: Double){value * 1.609344}}
6.2 前一个练习不是很面向对象。提供一个通用的超类 UnitConversion并定义扩展该超类的 InchesToCentimeters,GallonsToLiters 和 MilesToKilometers 对象
class UnitConversion(val factor: Double){def convert(value: Double): Double = factor * value}object InchesToSantimeters extends UnitConversion(2.54)object GallonsToLiters extends UnitConversion(3.78541178)object MilesToKilometers extends UnitConversion(1.609344)val temperate = InchesToSantimeters(30.0) //调用伴生对象
6.3 定义一个扩展自 java.awt.Point 的 Origin对象。为什么说这实际上不是个好主意?(仔细看 Point 类的方法)Point 中的 getLocation 方法返回的是 Point 对象,如果想返回 Origin 对象,需要 Origin 类才行
import java.awt.Pointobject Origin extends Point with App{override def getLocation: Point = super.getLocationOrigin.move(2,3)println(Origin.toString)}
6.4 定义一个 Point 类和一个伴生对象,使得我们可以不用 new 而直接用 Point(3,4)来构造 Point 实例 apply 方法的使用
class Point(x:Int,y:Int){override def toString():String = "x = "+x +" y =" +y}object Point extends App{def apply(x: Int, y: Int) = new Point(x,y)val p = Point(1,2)println(p)}
6.5 编写一个 Scala 应用程序,使用 App 特质,以反序打印命令行参数,用空格隔开。举例来说,scala Reverse Hello World 应该打印 World Hello
object Reverse extends App{println(args.reverse.mkString(" "))}
6.6 编写一个扑克牌 4 种花色的枚举,让其 toString 方法分别返回♣,♦,♥,♠
object Suits extends Enumeration{type Suits = Valueval Spade = Value("♠")val Club = Value("♣")val Heart = Value("♥")val Diamond = Value("♦")override def toString():String={Suits.values.mkString(",")}}println(Suits.Club)println(Suits)
6.7 实现一个函数,检查某张牌的花色是否为红色
object suits extends Enumeration with App{type suits = Valueval Spade = Value("♠")val Club = Value("♣")val Heart = Value("♥")val Diamond = Value("♦")def isRed(card: suits) = card == Heart || card == DiamondisRed(suits.Club)println(isRed(suits.Club))}
6.8 编写一个枚举,描述 RGB 立方体的 8 个角。ID 使用颜色值(例如 :红色是 0xff0000)
object RGBCube extends Enumeration {val black = Value(0x000000, "Black")val red = Value(0xff0000, "Red")val green = Value(0x00ff00, "Green")val blue = Value(0x0000ff, "Blue")val yellow = Value(0xffff00, "Yellow")val magenta = Value(0xff00ff, "Magenta")val cyan = Value(0x00ffff, "Cyan")val white = Value(0xffffff, "White")}for( c <- RGBCube.values ) println("0x%06x: %s".format(c.id, c))
本文探讨Scala中对象与伴生对象的概念及应用,包括如何使用伴生对象替代Java中的静态方法,创建枚举类型,并通过多个实例演示如何正确利用这些特性。
2580

被折叠的 条评论
为什么被折叠?



