Scala基础二

一、Object和Class的区别

1.1 存放的数据不同

  同名的Object和class互为半生关系。同名的object是class的半生对象,class是object的半生类。所以一个scala的文件存放同名的Object和Class,Object存放的内容就是像Java中的静态属性和静态方法,Class的是要new一个出来才能使用,所以Object是静态方法和属性的集合,class是一个对象的属性和方法的集合


object ApplyApp {
  println("Hello object enter")
  def sayHello: Unit ={
    println("object say Hello")
  }
  println("Hello object exit")
}

class ApplyApp{
  println("Hello class enter")
  def sayHello: Unit ={
    println("class say Hello")
  }
  println("Hello class exit")
}
ApplyApp.sayHello
结果
Hello object enter
Hello object exit
object say Hello

val a = new ApplyApp()
a.sayHello
结果
Hello class enter
Hello class exit
class say Hello

1.2 两个钟特殊的方法

  在Scala中有一个特殊的方法,这个方法名叫做apply

定义:
object ApplyApp {
  def apply: ApplyApp ={
    println("hi this is apply")
    new ApplyApp()
  } 
}
使用:
var a = ApplyApp()
输出:
hi this is apply

  所以结论就是,半生对象(object)没有new,就是调用半生对象中的apply方法。这个是半生对象object,如果是对象呢?

定义:
class ApplyApp{
  def apply() = {
    println("hi this is class apply")
  }
}
调用:
val a = new ApplyApp()
a()
输出:
hi this is class apply

  所以结论就是,半生对象(object)(),就是调用半生对象中的apply方法;如果是对象(),就是调用对象中的apply方法,当然不止(),里面可以带参数

二、数组(Array)

  数组和Java一样分为定长数组和变长数组。定长数组定义“val a = new Array[String](5)”;变长数组定义“val a = new ArrayBufferInt

2.1 定长数组

  常用的定义方式其实不是正规的定义方式(上面定义这种),其实常用的是这种“val b= Array(“aaa”,”bbbb”)”,根据第一节的介绍,可见底层使用的是半生对象(object)的apply方法。
  如何取值呢,和Java中不太一样,使用:b(0) =”saf”
  常用的方法:

方法 含义 使用
length 数组内元素的个数 b.length
max 数组内元素中最大的那个数 b.max
sum 数组内元素的和 b.sum
min 数组内元素中最小的哪个数 b.min
mkString 数组内元素转成一个字符串 b.mkString每个元素拼接在一个字符串
b.mkString(“,”)每个元素拼接在一个字符串并以”,”分隔
b.mkString(“[“,”,”,”]”)每个元素拼接在一个字符串并以”,”分隔,前后用“[”“]”

2.1 变长数组

  变长数组就是说数组的容量是可以变化的。和定长一样,也不太常用new,所以推荐写法val a = ArrayBufferInt
  如何向可变数组中添加数据:

a += 1
a += (2,3,4)
a ++= Arry(5,6,7)   //变长加上定长用++=
a.Insert(7, 0,0,0)  //向第2个位置中加入3个0 
a.remove(1,3)       //从第2个位置删除连续三个数

三、Case Class

  Case Class是可以不用new就可以生成对象的。

定义
case class Dog(name:String)
使用
plantln(Dog("wangwang").name)

  case class的使用场景:1、不用new 直接使用;2、模式匹配使用
  注意一下

定义:
object ApplyApp {
  def apply(age:String): Unit ={
   println("object")
  }
}
case class ApplyApp(name:String){
  def apply(age:String) = {
    println("hi this is class apply")
  }
}

调用:
println(ApplyApp("s").name)  报错,不识别name

  虽然case class不用new就可以使用对象,但是如果半生对象(object)中用对应形参的apply,优先匹配半生对象???

四、trait

  trait就把他看成Java中的接口,只有定义,没有具体实现。

object ApplyApp extends Longging with Serializable {
}

  实现的方法:继承第一使用extends,后面的使用with。

五、List集合

  Scala中有一个特殊的东西 => Nil,什么是Nil,Nil就是一个空的List。List也分为定长和变长,变长叫做ListBuffer,添加数据的方法和Array一样。

方法 含义 使用
head 数组内第一个元素 b.head
tail 数组除了第一个元素的其他元素 b.tail
:: 将::前后数据放置在一个list中,按照原顺序 1 :: List(2,3)

六、Map

  创建方式:val a = Map(“key1”->”value”,”key2”->”value”),在键和值之间使用->方式成对。如何取值a(“key1”)。但是有个问题,这个是不可变得Map,a(“key1”)=”hahaha”会报错。一般使用可变的Map,叫做HashMap。添加方式如List差不多。
  这种取值的方式有些问题,一旦没有该key,就会报错。常常使用a.getOrElse(“a”,”100”),如果有键,就是该值,如果没键就是这个后面的默认值。

取值方式
1for((key,value) <- a)
2for(key <- a.keySet) {key +" " +a(key)}
3for((key,_) <- a){ key +" " +a(key) }

猜你喜欢

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