scala初探(一)

来源:互联网 发布:域名 主机记录 编辑:程序博客网 时间:2024/05/06 19:46

Scala语言是在JVM上编程的优秀语言之一,其为并发,表达式和可扩展性而设计。这门语言及其程序库可以让你专注于问题而无需深陷于线程和同步等底层基础结构细节。Scala是一门混合了函数式和面向对象的语言。有以下特性:

1. Scala对函数式编程的支持可以写出非常简洁而有表现力的代码;

2. 对于多线程应用,Scala提供了基于actor的消息传递模型,消除了涉及并发的痛苦问题,利用该模型,可以很方便简单的写出多线程代码,而不用考虑线程之间的数据竞争和加锁释放锁等问题;

3. Scala和java一样是运行在JVM上的,可以与java很好的互操作。

       

Scala与java的运行机制类似,首先使用scalac将Scala源代码编译成JVM可以处理的字节码,然后由JVM解释执行。因此从运行上来看和java区别就在于源程序的语法和编译程序上,这也是JVM上语言众多的原因之一。

        了解了Scala的特点和运行机制后,下面开始学习Scala的语法。

学习每一门语言的第一个程序当然是“Hello,World!”。

println("hello world")

如同Python一样简洁的语法,一行程序即可,不需要主函数和类的包裹,直接执行。

当然也可以这么写:

def main(args: Array[String]) = {println("hello world")}
main(null)
1. 循环结构

for(i <- 1 to 100){println(i)}(1 to 100).foreach(i => print(i + ","))

1 to 100表示从1到100,其函数原型是1.to(100),因为在Scala中可以将.()省略,所以可以很简洁的表示成1 to 100,这样表示更像是一般的英语表示。

<-表示将1到100赋值给i这个变量。注意,这里的i是val(不变变量),而不是var(可变变量),这里看似每次循环改变了i的值,实质上是每次新建一个val i,因此i是不可变的。

第二种循环方式使用了foreach,这对于数组等结构的遍历特别方便,其中 => 表示对(1 to 100)中每个元素i执行=>后面的语句。

2. 函数定义

def getInfo(number : Int) :(Int,Int,Int) = {(123,234,345)}
函数是函数式语言中一等公民。定义函数使用def关键字;:后面表示返回类型,这里表示返回一个全是整型的三元组;=表示类型推演(根据函数内容推测返回类型),在函数体中不用使用return关键字(Scala中应该尽量减少使用return,尽量使用类型推演)。

3. 类定义

class Car(val year: Int){private var mileDriven: Int = 0def miles() = mileDrivendef drive(distance: Int){mileDriven += Math.abs(distance)}}val car = new Car(2009)println("The car made in " + car.year)println("Miles drivens " + car.miles)car.drive(100)println("Miles drivens " + car.miles)


class Person(val firstName: String,val lastName: String){// "_ "表示的是该类型的默认值private var position: String = _//@scala.reflect.BeanPropertyvar age: Int = _println("Creating " + toString())//this是副构造函数def this(firstName: String,lastName:String,positionHeld: String){this(firstName,lastName)position = positionHeld}//重写函数override def toString(): String = {firstName + " " + lastName + " holds " + position + " position "}}val john = new Person("John","Smith","Analyst")println(john)val bill = new Person("Bill","Walker")println(bill)


类定义仍然使用class关键字定义,而构造函数则直接镶嵌在类头(val year: Int),可变成员则定义在类内部。在调用函数时,如果函数没有参数,可以省略括号。

4.  继承

//继承class Vehicle(val id: Int,val year: Int){override def toString(): String = "ID: " + id + " Year: " + year}class Car(override val id: Int,override val year: Int, val fuelLevel: Int) extends Vehicle(id,year){override def toString(): String = super.toString() + " Fuel Level: " + fuelLevel}val car = new Car(1,2009,100)println(car)

子类继承父类时,父类的成员属性和成员方法必须使用override关键字区别。因为任何类都继承于Any类,而Any类中含有toString()。



1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两岁宝宝发烧怎么办 网上购票待核验怎么办 老人坐飞机找不到登机口怎么办 儿童不能值机怎么办 飞机上旅客刁难怎么办 飞机上婴儿哭闹怎么办 飞机上婴儿啼哭怎么办 飞机儿童陪护手续怎么办 孕妇感冒鼻子堵怎么办 孕妇用了眼药水怎么办 孕妇用眼药水了怎么办 错过了登机时间怎么办 过了登机时间怎么办 孩子不喜欢做作业怎么办 宝宝腿不一样粗怎么办 一个小腿肿了怎么办 左右小腿不一样粗怎么办 小孩不敢自己睡怎么办 小孩不一个人睡怎么办 晚上一个人睡觉害怕怎么办 孩子自己睡害怕怎么办 小孩晚上睡觉怕怎么办 小孩分房睡害怕怎么办 坐飞机不认识字怎么办 科目一不识字怎么办 孩子不自己睡觉怎么办 70岁老人坐高铁怎么办 八岁儿童怎么办护照 第一次坐飞机有点紧张怎么办 坐飞机恐高耳鸣怎么办 火车坐过站怎么办 凌晨的火车应该怎么办 高铁坐过一站怎么办 宝宝断奶瘦了怎么办 第一次坐飞机怕晕机怎么办 焦虑症怕坐飞机怎么办 新生宝宝老是哭闹怎么办 宝宝坐飞机后哭闹怎么办 飞机经济舱不支持退票怎么办 证件被单位扣押怎么办 小孩高烧41度怎么办