Scala中的类&练习

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

程序代码:

  1. class Counter {
  2.   private var value=100
  3.   def increment(){
  4.     if(value<Int.MaxValue)
  5.       value+=1
  6.     else
  7.       value
  8.   }
  9.   def current=value
  10. }
  11. object Counter{
  12.   def main(args: Array[String]): Unit = {
  13.     val max=Int.MaxValue
  14.     println("Int类型的最大值:"+max)
  15.     val counter=new Counter
  16.     for(i <- 1 to (max))
  17.       counter.increment()
  18.     println("经过"+max+"增加后Value值为:"+counter.current)
  19.   }
  20. }

运行结果:

Int类型的最大值:2147483647

经过2147483647增加后Value值为:2147483647

2. 编写一个BankAccount类,加入deposit和withdraw方法,和一个只读的balance属性

程序代码:

  1. class BankAccount {
  2. private var balance=0.0
  3. def deposit(depamount:Double){
  4. balance+=depamount
  5. }
  6. def withdraw(drawamount:Double){
  7. balance-=drawamount
  8. }
  9. def current=balance
  10. }
  11. object BankAccount{
  12. def main(args: Array[String]): Unit = {
  13. val Drawamount=800
  14. val Depamount=1000
  15. val acc=new BankAccount
  16. println("存入金额:"+Depamount)
  17. acc.deposit(Depamount)
  18. println("余额:"+acc.current)
  19. println("取出金额:"+Drawamount)
  20. acc.withdraw(Drawamount)
  21. println("余额为:"+acc.current)
  22. }
  23. }

运行结果:

存入金额:1000

余额:1000.0

取出金额:800

余额为:200.0

3. 编写一个Time类,加入只读属性hours和minutes,和一个检查某一时刻是否早于另一时刻的方法 before(other:Time):Boolean。Time对象应该以new Time(hrs,min)方式构建。其中hrs以军用时间格式呈现(介于0和23之间)

程序代码:

  1. class Time(val hours:Int , val minutes:Int) {
  2. def before(other:Time):Boolean={
  3. hours<other.hours||(hours==other.hours&&minutes<other.minutes)
  4. }
  5. override def toString():String={
  6. hours+":"+minutes
  7. }
  8. }
  9. object Time{
  10. def main(args: Array[String]): Unit = {
  11. val t1=new Time(10,30)
  12. val t2=new Time(10,50)
  13. val t3=new Time(11,10)
  14. println("t1时刻是:"+t1.toString())
  15. println("t2时刻是:"+t2.toString())
  16. println("t3时刻是:"+t3.toString())
  17. println("t1时刻早于t2吗:"+t1.before(t2))
  18. println("t3时刻早于t2吗:"+t3.before(t2))
  19. }
  20. }

运行结果:

t1时刻是:10:30

t2时刻是:10:50

t3时刻是:11:10

t1时刻早于t2吗:true

t3时刻早于t2吗:false

4. 重新实现前一个类中的Time类,将内部呈现改成午夜起的分钟数(介于0到24*60-1之间)。不要改变公有接口。也就是说,客户端代码不应因你的修改而受影响

程序代码:

  1. class NewTime(val hours:Int,val minutes:Int) {
  2. def before(other:NewTime):Boolean={
  3. hours < other.hours||(hours==other.hours&&minutes<other.minutes)
  4. }
  5. override def toString():String={
  6. hours*60+""+minutes
  7. }
  8. }
  9. object NewTime{
  10. def main(args: Array[String]): Unit = {
  11. val t1=new NewTime(10,30)
  12. val t2=new NewTime(10,50)
  13. val t3=new NewTime(11,10)
  14. println("t1时刻:"+t1.toString())
  15. println("t2时刻:"+t2.toString())
  16. println("t3时刻:"+t3.toString())
  17. println("t1时刻比t2早吗:"+t1.before(t2))
  18. println("t3时刻比t2早吗:"+t3.before(t2))
  19. }
  20. }

运行结果:

t1时刻:60030

t2时刻:60050

t3时刻:66010

t1时刻比t2早吗:true

t3时刻比t2早吗:false

5. 创建一个Student类,加入可读写的JavaBeans属性name(类型为String)和id(类型为Long)。有哪些方法被生产?你可以在Scala中调用JavaBeans的getter和setter方法吗?应该这样做吗?

程序代码:

class Student {

var name:String=null

var id:Long=0

}

执行命令:javap -private Student

运行结果:

使用@BeanProperty增加兼容JavaBean的get和set方法:

import scala.beans.BeanProperty

class Student {

@BeanProperty

var name:String=null

@BeanProperty

var id:Long=0

}

执行命令: javap -private Student

运行结果:

6. 在Person类中提供一个主构造器,将负年龄转换为0

程序代码:

  1. class Person(var age:Int){
  2. if(age < 0) age=0
  3. }
  4. object Person{
  5. def main(args: Array[String]): Unit = {
  6. val age1 = 10
  7. val age2 = -20
  8. println("将Tom的年龄初始化为:"+age1)
  9. val Tom=new Person(age1)
  10. println("Tom的实际年龄为:"+Tom.age)
  11. println("将Tom的年龄初始化为:"+age2)
  12. val Jhon=new Person(age2)
  13. println("Jhon的实际年龄为:"+Jhon.age)
  14. }
  15. }

运行结果:

将Tom的年龄初始化为:10

Tom的实际年龄为:10

将Jhon的年龄初始化为:-20

Jhon的实际年龄为:0

7. 编写一个Person类,其主构造器接受一个字符串,该字符串包含名字,空格和姓名,如new Person("Fred Smith")。提供只读属性firstName和lastName。主构造器参数应该是var,val还是普通参数,为什么

描述:name应该设定为val以防止被修改

程序代码:

  1. class Person(val name:String) {
  2. private val namearr=name.split("")
  3. def FirstName=namearr(0)
  4. def LastName=namearr(1)
  5. }
  6. object Person{
  7. def main(args: Array[String]): Unit = {
  8. val person=new Person("Xinyu Jiang")
  9. //name参数自动转为私有字段,并生成公有getter
  10. println("person的名称为:"+person.name)
  11. println("person的FisrtName:"+person.FirstName)
  12. println("person的LastName:"+person.LastName)
  13. }
  14. }

运行结果:

person的名称为:Xinyu Jiang

person的FisrtName:Xinyu

person的LastName:Jiang

8. 创建一个Car类,以只读属性对应制造商,型号名称,型号年份以及一个可读写的属性用于车牌。提供四组构造器。每个构造器都要求制造商和型号为必填。型号年份和车牌可选,如果未填,则型号年份为-1,车牌为空串。你会选择哪一个作为你的主构造器,为什么

程序代码:

  1. class Car(val manufactor:String,val model:String=null,val year:String=null,var number:Int= -1){
  2. }
  3. object Car{
  4. def main(args: Array[String]): Unit = {
  5. val Chevrolet=new Car("通用","雪佛兰-爱唯欧")
  6. val Volkswagen=new Car("一汽","大众-斯柯达","2015-1-1")
  7. val Volvo=new Car("吉利","Volvo-s40","2015-1-2",666666)
  8. val nameArr=Array("雪佛兰","大众","沃尔沃")
  9. val carArr=Array(Chevrolet,Volkswagen,Volvo)
  10. Outinfo(nameArr,carArr)
  11. }
  12. def Outinfo(carName:Array[String],carArr:Array[Car])={
  13. for(i <- 0 until carName.length){
  14. println(carName(i))
  15. println("汽车制造商为: "+carArr(i).manufactor)
  16. println("汽车型号为: "+carArr(i).model)
  17. println("汽车产年份为: "+carArr(i).year)
  18. println("汽车车牌号为: "+carArr(i).number)
  19. }
  20. }
  21. }

运行结果:

雪佛兰

汽车制造商为: 通用

汽车型号为: 雪佛兰-爱唯欧

汽车产年份为: null

汽车车牌号为: -1


大众

汽车制造商为: 一汽

汽车型号为: 大众-斯柯达

汽车产年份为: 2015-1-1

汽车车牌号为: -1


沃尔沃

汽车制造商为: 吉利

汽车型号为: Volvo-s40

汽车产年份为: 2015-1-2

汽车车牌号为: 666666

9. 在Java,C#或C++重做前一个练习。Scala相比之下精简多少

程序代码:

  1. class JavaCar{
  2.    private String manufactor;
  3.    private String model;
  4.    private String year;
  5.    private int number;
  6.    public JavaCar(){}
  7.    public JavaCar(String manufactor,String model){
  8.       this.manufactor=manufactor;
  9.       this.model=model;
  10.       this.year=null;
  11.       this.number=-1;
  12.    }
  13.    public JavaCar(String manufactor,String model,String year){
  14.       this.manufactor=manufactor;
  15.       this.model=model;
  16.       this.year=year;
  17.       this.number=-1;
  18.    }
  19.    public JavaCar(String manufactor,String model,String year,int number){
  20.       this.manufactor=manufactor;
  21.       this.model=model;
  22.       this.year=year;
  23.       this.number=number;
  24.    }
  25.    public String getManufactor(){
  26.       return this.manufactor;
  27.    }
  28.    public String getModel(){
  29.       return this.model;
  30.    }
  31.    public String getYear(){
  32.       return this.year;
  33.    }
  34.    public void setNumber(int number){
  35.       this.number=number;
  36.    }
  37.    public int getNumber(){
  38.       return number;
  39.    }
  40.    public static void main(String[] args) {
  41.    }
  42. }
  43. public class CarTest{
  44.    public static void main(String[] args) {
  45.       JavaCar Chevrolet=new JavaCar("通用","雪佛兰-爱唯欧");
  46.       JavaCar Volkswagen=new JavaCar("一汽","大众-斯柯达","2015-1-1");
  47.       JavaCar Volvo=new JavaCar("吉利","Volvo-S40","2015-1-2",66666);
  48.       String[] nameArr={"雪佛兰","大众","沃尔沃"};
  49.       JavaCar[] carinfoArr={Chevrolet,Volkswagen,Volvo};
  50.       CarTest cartest=new CarTest();
  51.       cartest.OutInfo(nameArr,carinfoArr);
  52.    }
  53.    public void OutInfo(String[] nameArr,JavaCar[] carinfoArr){
  54.       for(int i=0;i<nameArr.length;i++){
  55.          System.out.println(nameArr[i]);
  56.          System.out.println("汽车制造商: "+carinfoArr[i].getManufactor());
  57.          System.out.println("汽车型号: "+carinfoArr[i].getModel());
  58.          System.out.println("汽车年份: "+carinfoArr[i].getYear());
  59.          System.out.print("车牌号: "+carinfoArr[i].getNumber());
  60.       }
  61.    }
  62. }

运行结果:

雪佛兰

汽车制造商: 通用

汽车型号: 雪佛兰-爱唯欧

汽车年份: null

车牌号: -1


大众

汽车制造商: 一汽

汽车型号: 大众-斯柯达

汽车年份: 2015-1-1

车牌号: -1


沃尔沃

汽车制造商: 吉利

汽车型号: Volvo-S40

汽车年份: 2015-1-2

车牌号: 66666

10. 考虑如下的类
class Employ(val name:String,var salary:Double){
    def this(){ this ("John Q. Public",0.0) }
}
重写该类,使用显示的字段定义,和一个缺省主构造器。你更倾向于使用哪种形式,为什么

程序代码:

  1. class Employee(var name:String,var salary:Double){
  2. def this(){
  3. this("Jom Q. Public",0)
  4. }
  5. }
  6. object Employee{
  7. def main(args: Array[String]): Unit = {
  8. val ITemployee=new Employee
  9. val Bankemployee=new Employee("Tom Hanks",100000)
  10. println("ITemployee Name: "+ITemployee.name+"Salary: "+ITemployee.salary)
  11. println("Bankemployee Name: "+Bankemployee.name+"Salary: "+Bankemployee.salary)
  12. }
  13. }

运行结果:

ITemployee Name: Jom Q. Public Salary: 0.0

Bankemployee Name: Tom Hanks Salary: 100000.0

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【Sunddenly】。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Scala学习(五)练习相关推荐

  1. Scala学习第五天数组

    2019独角兽企业重金招聘Python工程师标准>>> package com.learn.scalaimport scala.collection.mutable.ArrayBuf ...

  2. Scala学习笔记(三)

    Scala学习笔记(三) 一.模式匹配 1. 简单模式匹配 2. 匹配类型 3. 守卫 4. 匹配样例类 5. 匹配数组 6. 匹配列表 7. 匹配元组 8. 变量声明中的模式匹配 8.1 获取数组中 ...

  3. Scala学习笔记(一)

    Scala学习笔记(一) 一.Scala简介 二.Scala安装与配置 1. 安装JDK 2. 安装Scala SDK 3. 安装IDEA插件 三.Scala解释器 1. 启动Scala解释器 2. ...

  4. Scala学习笔记-方便查找使用 为Spark学习打基础

    Scala学习 注意 伊始 为什么是Scala 网课 环境 电脑环境安装 关于版本的声明 我的环境和版本 IDEA插件安装 IDEA关联Scala源码 基础部分1 文档注释和生成 字符串的三种输出 变 ...

  5. 机器学习(三)--- scala学习笔记

    Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...

  6. vivado 亚稳态_【vivado学习五】时序分析

    想一千次,不如去做一次.华丽的跌倒,胜过无谓的徘徊. [vivado学习五]时序分析 典型的时序模型由发起寄存器.组合逻辑和捕获寄存器3部分组成,如图1所示形成了三条时钟路径:原时钟路径(Source ...

  7. C#多线程学习(五) 多线程的自动管理(定时器) (转载系列)——继续搜索引擎研究...

    Timer类:设置一个定时器,定时执行用户指定的函数.               定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. 初始化一个Timer对象: Timer timer ...

  8. Scala 学习笔记

    Scala 学习笔记 1 object func_exp { 2 println("Welcome to the Scala worksheet") //> Welcome ...

  9. Scala学习笔记-环境搭建以及简单语法

    关于环境的搭建,去官网下载JDK8和Scala的IDE就可以了,Scala的IDE是基于Eclipse的. 下面直接上代码: 这是项目目录: A是scala写的: package first impo ...

最新文章

  1. 全景分割:CVPR2019论文解析
  2. 网盘php资料,怎么搜索百度网盘里的资料(php版)
  3. P4213 【模板】杜教筛
  4. 服务拆分-服务远程调用
  5. 做一个“多人在线编辑器”,你会怎么开始
  6. 为什么没人种植金丝楠木?
  7. python中出现UserWarning: libuv only supports millisecond timer resolution怎么解决
  8. Docker是什么,有什么用?一看就明白
  9. 关于 html 中 table 表格 tr,td 的高度和宽度
  10. TServerSocket阻塞模式下Request-Response编程框架
  11. 2019 AI顶会时间表
  12. 读书札记:30个因素预示美国将再现“大萧条”...
  13. 音视频基础知识---音频编码格式
  14. java开发抢红包算法,抢红包算法的实现-java
  15. mysql时间函数详解
  16. 抑郁研究所融资历程分享--以太一堂--直播课
  17. oracle基本建表语句
  18. Qt 使用 Matlab函数
  19. 批量生成各尺寸的iOS图标
  20. 2021年10月云短信报告出炉,腾讯云蝉联冠军

热门文章

  1. linux和windows和mac的文件读取方式的差异
  2. html中实现雪花飞舞,京东双12年终盛宴雪花飞舞3D视觉特效
  3. 利用copy命令合成一个图片马使用
  4. QQ可以用十六进制登录哦
  5. 想让文本识别更“智能”,到底需要什么样的OCR转写数据?
  6. 【玩转华为云】手把手教你用Modelarts实现猫狗数据集的智能标注
  7. redis主从复制,主读不到从节点信息的坑
  8. js添加多marker 高德地图_点标记-覆盖物-教程-地图 JS API | 高德地图API
  9. PHP的开发效率比java要高,为什么现在java这么流行?
  10. h5-自定义生成海报