《快学Scala》第5章 类 练习

1. 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数。

/**
 * Created by Ibuki Suika on 2014/5/26.
 */

class Counter {
  private var value = 0
  def increment() {
    if (value + 1 < Int.MaxValue) {
      value += 1
    }
  }
  def current = value
}

object ScalaApp {
  def main(args: Array[String]) {
    val counter = new Counter
    for (_ <- 1 to Int.MaxValue) {
      counter.increment()
    }
    println(counter.current)
  }
}
2. 编写一个BankAccount类,加入deposit和withdraw方法,和一个只读的balance属性。

/**
 * Created by Ibuki Suika on 2014/5/26.
 */

class BankAccount(val balance: Int) {
  def deposit {println("deposit")}
  def withdraw {println("withdraw")}
}

object ScalaApp {
  def main(args: Array[String]) {
    val account = new BankAccount(100)
    account.deposit
    account.withdraw
    println(account.balance)
  }
}
3. 编写一个Time类,加入只读属性hours和minutes,和一个检查某一时刻是否早于另一时刻的方法before(other: Time): boolean。Time对象应该以new Time(hrs, min)方式构建,其中hrs小时数以军用时间格式呈现(介于0和23之间)。

/**
 * Created by Ibuki Suika on 2014/5/26.
 */

class Time(private var hrs: Int, private var min: Int) {
  if (hours < 0 || hours >= 24) hrs = 0
  if (min < 0 || min >= 60) min = 0
  def before(other: Time) = {
    hours < other.hours || (hours == other.hours && minutes < other.minutes)
  }
  def hours = hrs
  def minutes = min
}

object ScalaApp {
  def main(args: Array[String]) {
    val time1 = new Time(9, 20)
    val time2 = new Time(10, 12)
    println(time1.before(time2))
  }
}
4. 重新实现前一个练习中的Time类,将内部呈现改成自午夜起的分钟数(介于0到24x60-1之间)。不要改变公有接口。也就是说,客户端代码不应因你的修改而受影响。

/**
 * Created by Ibuki Suika on 2014/5/26.
 */

class Time(hrs: Int, min: Int) {
  private var total = 0
  if (hrs >= 0 && hrs < 24) {
    total += hrs * 24
  }
  if (min > 0 && min < 60) {
    total += min
  }
  def before(other: Time) = {
    total < other.total
  }
  def hours = total / 60
  def minutes = total % 60
}

object ScalaApp {
  def main(args: Array[String]) {
    val time1 = new Time(9, 20)
    val time2 = new Time(10, 12)
    println(time1.before(time2))
  }
}
5. 创建一个Student类,加入可读写的JavaBeans属性name(类型为String)和id(类型为Long)。

/**
 * Created by Ibuki Suika on 2014/5/26.
 */

import scala.beans.BeanProperty

class Student(@BeanProperty var name: String, @BeanProperty var id: Long) {
}

object ScalaApp {
  def main(args: Array[String]) {
    val student = new Student("Tom", 1000)
    println(student.name)
    println(student.id)
  }
}
6. 在5.2节的Person类中提供一个主构造器,将负年龄转换为0。

/**
 * Created by Ibuki Suika on 2014/5/26.
 */

class Person(private var privateAge: Int) {
  if (privateAge < 0) privateAge = 0
  def age = privateAge
  def age_=(value: Int) {
    if (value > 0) {
      privateAge = value
    }
  }
}

object ScalaApp {
  def main(args: Array[String]) {
    val person = new Person(-1)
    println(person.age)
    person.age = 10
    println(person.age)
  }
}
7. 编写一个Person类,其主构造器接受一个字符串,该字符串包含名字、空格和姓,如new Person("Fred Smith")。提供只读属性firstName和LastName。

/**
 * Created by Ibuki Suika on 2014/5/26.
 */

class Person(name: String) {
  val firstName = name.split(" ")(0)
  val lastName = name.split(" ")(1)
}

object ScalaApp {
  def main(args: Array[String]) {
    val person = new Person("Fred Smith")
    println(person.firstName)
    println(person.lastName)
  }
}
8. 创建一个Car类,以只读属性对应制造商、型号名称、型号年份以及一个可读写的属性用于车牌。提供四组构造器。每一个构造器都要求制造商和型号名称为必填。型号年份以及车牌为可选,如果未填,则型号年份设置为-1,车牌设置为空字符串。你会选择哪一个作为你的主构造器?为什么?

/**
 * Created by Ibuki Suika on 2014/5/26.
 */

class Car(val maker: String, val name: String, val year: Int, var card: String) {
  def this(maker: String, name: String, year: Int) {
    this(maker, name, year, "")
  }
  def this(maker: String, name: String, card: String) {
    this(maker, name, -1, card)
  }
  def this(maker: String, name: String) {
    this(maker, name, -1, "")
  }
}

object ScalaApp {
  def main(args: Array[String]) {
    val car = new Car("IBM", "Nexu", 1999)
    println(car.maker)
    println(car.name)
    println(car.year)
    println(car.card)
  }
}
10.考虑如下类:

class Employee(val name: String, var salary: Double) {

  def this() {this("John Q. Public", 0.0)}

}

重写该类,使用显式的字段定义,和一个缺省主构造器。你更倾向于使用哪一种形式?为什么?

/**
 * Created by Ibuki Suika on 2014/5/26.
 */

class Employee {
  private var emName = ""
  private var emSalary = 0.0
  def this(n: String, s: Double) {
    this()
    this.emName = n
    this.emSalary = s
  }
  def name = emName
  def salary = emSalary
}

object ScalaApp {
  def main(args: Array[String]) {
    val employee = new Employee("Jim", 1800.9)
    println(employee.name)
    println(employee.salary)
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值