Scala基础一

  选用的Scala版本:2.11.8

一、申明值和变量

  定义的规范“val name : String = null”,val 表示这个变量是常量,内容无法改变;你也可以使用var 标注变量为可变内容。
  常用的数据类型:

数据类型 含义
Int 整型
Long 长整型
Float 浮点
Double 双精度浮点
String 字符串
Boolean 布尔值

  数值之间的转换:

类型转换
Int -> Double
10.asInstanceOf[Double]
判断是否是某个类型
10.isInstanceOf[Int]

二、函数

  Scala是结合面向对象编程和面向函数式编程的语言。Scala函数的定义“def 函数名(参数名:类型,参数名:类型): 返回值类型 = {}”,这个返回值可以有,可以没有。当没有返回值得时候,可以用Unit,这表示Java中的void;也可以省去“: 返回值类型 =”,这个时候要注意,这个没有参数也会更具最后一行的执行结果返回参数。所以虽好协商Unit。

函数定义:
def main(args: Array[String]): Unit = {
}

  Scala的函数中最后一行的代码默认作为整个函数的返回值

def judge(a:Int){
  if(a > 100){
    true
  } else {
    false
  }
}

  函数怎么调用:

如果有参数
app(a, b)
如果没有参数,可以不写(),除带有默认参数外
app

2.1 命名参数

  如果一个函数有几个参数,你在调用的时候可以指定参数的值。

def teacher(name:String, sex:String): Unit ={
     println(name)
     println(sex)
}

  调用的时候可以使用“teacher(“hehehe”,”man”)”,命名参数调用是“teacher(name = “hahaha”,sex = “weman”)

2.2 可变参数

  当同一类型的参数输入的时候不知道多少个数量,可以使用可变参数。

 def sum(nums:Int*): Int ={
    var result:Int = 0;
    for(num <- nums){
        result += num
    }
    result
}

  调用:sum(1,2,3,4,5) 或者 sum(1 to 5 :_*) 或者 sum(Array(1,2,3,4,5) :_*)

三、Range

  数组中常常需要导入数据,使用一定规律、一定范围数据,比如1到10,200 到300的整数等等。创建的方式:tountilRange

to: []
    1 to 10 或者 1.to(10)
Until: [)
    1.untile(10) 或者 1 untile 10
Range:[)  可以包含步长
    Range(1,10) 或者  Range(1,10,1)

四、循环

  循环包含for、while等。

for 
    for(i <- 1 to 10){}  
    for(i <- 1 to 10 if i % 2 == 0){} \\i等于偶数执行
while   
    while(true){}
do..while
    do....while(true)

五、面向对象编程

  面向对象编程,也是Scala的特性。

5.1 简单类定义

class People{
    var name:String = ""
    var age:Int = 10
    private[this] val gender = "M"

    def eat()={
        name + "  eat....."
    }
}

  如何使用:val people : People = new People(),凡是对象都是需要new一个出来,剩下的操作就像是Java一样。思考一个问题:如果var name换成val name会怎样?当然编译不通过,因为会重复赋值val对象。再思考一个问题,如果一开始在类中没有名字和年龄,就不要给他赋值,那怎么办呢,使用占位符“_”,String默认是null,数值型默认是0。
  People中的属性gender是一个private[this],表示对象私有成员,外界无法访问。很有意思的是这个this,这个表示这个private只能在本对象可见,如果把this 换成 该包名,就表示该包内可见。

5.2 构造函数

  Java中也有构造函数,就是在生成一个对象的时候,按照要求不同,调用不同的构造方法,实现代码复用性。

class Girl(val name:String, val age:Int){
    println("Girl enter")

    println("Girl exit")
}

  调用:val girl = new Girl(“Cindy”, 19)
  输出:Girl enter换行Girl exit
  总结:这种构造叫做主动构造,构造中的参数以及类中属性都被当做对象的属性来使用。当对象被创建的时候先执行执行语句,如“println(“Girl enter”)”。还有一个有趣的事情,如果主动构造中的 var/val 不写,就会把这个属性当做private[this]。
  附属构造函数(相当于构造器的重载),定义

 var phone:String=_
 def this(name:String, age:Int, phone:String){
     this(name,age)
     this.phone=phone
 }

  附属构造器必须在第一行调用祝构造器或者其他的附属构造器。

5.3 继承

  语法:

class Cindy(name:String, age:Int, val major:String) extends Girl(name,age){
}

  因为Girl这个类不存在参数为空的构造,所以,就得将参数传入。

5.4 重写

  重写语法:

override def toString: String = {
      "abcd"
    }

  需要在前头加上override

5.5 抽象类

  定义

abstract class Animal{
    var name:String
    var age = 0
    def speek
    def dosomething():String
}

  上诉定义中, age是被实现的,只有name和speek是抽象,需要重新定义。
  实现

class Dog extends Animal{
    override var name: String = _
    override def speek: Unit = ???
    override def dosomething():String={xxxxx}
}

  ???是占位符,具体要自己去实现,不然调用就会出错。

猜你喜欢

转载自blog.csdn.net/myt0929/article/details/81124688