1. 程式人生 > >Scala總結(二)

Scala總結(二)

1、scala類構造的時候,內部所有的成員除了方法以外,全部會被執行。

class Person {
  var name = "anonymous"
  println("My name is " + this.name)

  def sayHello(): Unit = {
    println("Hello!")
  }
}

2、scala類除了主構造器以外的其他構造器內部首行必須用this來呼叫類的預設主構造器。

class Student {
  var name : String = _

  def this(name : String) {
    this
    this
.name = name } }

3、如果主構造器不想讓別人呼叫,則在類後面加private。

class Teacher private (val name : String, val age : Int) {
  var gender : String =_
  println("Teacher:" + gender)

  def this(name : String, age : Int, gender : String) {
    this(name, age)
    this.gender = gender
    println("Teacher:" + name + ":"
+ age + ":" + gender) } }

4、scala的內部類是從屬於物件的。java的內部類從屬外部類。

5、內部類呼叫外部類成員的兩種方法。

object OopDemo3 {

  def main(args: Array[String]) {
    val outer = new Outer("Max")
    new outer.Inner("Alpha").info
    val outer2 = new Outer2("Tom")
    new outer2.Inner2("Dolphin").info
  }

}

class Outer(val name : String)
{
outer => class Inner(val name : String) { def info = println("outer name:" + outer.name + ", Inner Name :" + name) } } class Outer2(val name : String) { class Inner2(val name : String) { def info = println("Outer2 name :" + Outer2.this.name + ", Inner Name:" + name) } }

6、scala中沒有像java一樣的靜態類和靜態方法,但是給我們提供了object物件,這個物件裡面的所有成員都是靜態的,包括欄位和方法。

7、伴生物件:伴生物件本身是一個單例,它有一個與之同名的類。並且同名類和伴生物件之間可以互相訪問私有成員。

class University {
  private var number = 0
  def increaseNumber(number: Int): Int = {
    this.number += number
    this.number += University.num
    this.number
  }
}

object University {
  private var num = 0
  def increaseNums = {
    num += 1
    num
  }
}

8、通常我們使用val arr = Array(1, 2, 3)這種方式建立一個數組,實際上呼叫的也是Array類的伴生物件的apply方法。

9、類和object中都有apply方法。呼叫object中apply可以通過這個object名字後面加()來呼叫。

object OopDemo5 {

  def main(args: Array[String]) {
    val a = ApplyClass()
    a.sayHello
    val b = new ApplyClass
    b.apply
  }
}

class ApplyClass {
  def apply() = println("execute apply function!")

  def sayHello: Unit ={
    println("hello world")
  }
}

object ApplyClass {
  def apply(): ApplyClass = {
    println("object apply")
    new ApplyClass
  }
}

10、scala抽象類也是在類名前加abstract。重寫抽象類的欄位或者方法可以在欄位或者方法前面加override或者也可以不加。一般情況下最後加上override,表明這個欄位被重寫。

abstract class Teacher(val name : String) {
  var id : Int
  var age : Int
  def teach
}

class MathTeacher(name : String) extends Teacher(name) {
  override var id = name.hashCode
  override var age = 29
  override def teach = {println("Teaching math")}
}

11、介面用trait來標識,與java不同的是,scala的trait中允許有非抽象方法。java的介面用Interface來標識,並且接口裡只允許有抽象方法。java的抽象類裡既允許有抽象方法,又允許有非抽象方法。注意兩者的區別。

trait SuperTeacher {
  def teach(content : String)

  def sleep(): Unit = {
    println("sleep")
  }

}

12、實現介面用extends 介面名 如果實現多個介面,用with連線。

class EnglishTeacher1 extends SuperTeacher with Cloneable {
  override def teach(content : String) = println("teaching " + content)

  def eat(): Unit = {
    println("eat fast foot")
  }
}

13、物件中混入trait。應用比較廣泛,通過給物件混入工具trait使得物件可以呼叫工具trait中得方法。

object ScalaDemo8 {

  def main(args: Array[String]) {
    val teacher = new EnglishTeacher1 with NormalPerson
    teacher.teach("English")
    teacher.walk
  }

}

trait NormalPerson{
  def walk: Unit ={
    println("walking")
  }
}

trait SuperTeacher {
  def teach(content : String)

  def sleep(): Unit = {
    println("sleep")
  }

}

class EnglishTeacher1 extends SuperTeacher with Cloneable {
  override def teach(content : String) = println("teaching " + content)

  def eat(): Unit = {
    println("eat fast foot")
  }

}

14、scala包和包物件。以及scala隱式引入的包。

package com.qihoo.oop   //作用範圍是整個檔案

//隱式引入的包
import java.lang._
import scala._
import Predef._

//可通過給類起別名來避免java和scala中類命名衝突
import java.util.{HashMap => JavaHashMap}
//如果不想用包內某個類,可用"_"去掉
import scala.{StringBuilder => _}

/**
 * 包物件
 */
package object people {
  val defaultName = "tom"
}

//包
package people {
  class Person1 {
    var name = defaultName  //包中的類可以任意引用此包物件內容
  }
}

15、包訪問許可權

package country {

  package provice{

    private[country] class City { //將City的可見度擴充套件

      protected[provice] def show() {} //被protected修飾,可以被provice包中所有內容訪問,包括City的子類

      private[this] var nums = 1000000 //只有本物件能訪問,該類的其他例項不能訪問

    }
  }

  package specialCity {
    import provice._
  }
}

16、內部函式:在函式內部定義函式就叫內部函式或者本地函式。