1. 相对于java,scala的值修饰用val,变量修饰用var.值相当于java的final 修饰了。

package demo

object ScalaBase extends App {
  println(1)
  println(1 + 1)
  println("Hello!")
  println("Hello," + " World!")
  /**
    * val 是值得修饰符,相当于java的final int x;
    * scala 可以不指名类型
    */
  val x = 1 + 1
  println(x)
  ///x =2 //不编译的
 //指明类型可以如下写
  val x1 : Int = 1 + 1
  println(x1)

  /**
    * var 是变量修饰符,相当于java int x2,不加final修饰
    */
  var x2 = 1 + 1
  x2 = 3
  println(x2 * x2)

  /**
    * scala 是个万能表达式语言,比如可以通过{}组合表达式
    */
  println({
    val x = 1 + 1
    x + 1
  })
  println({
    val x = "test " + "scala "
    x + "demo!"
  })

  /**
    * scala相对于java 方法定义,分为函数和方法
    * 函数是带参数的表达式,也就是相对于java8的匿名方法()->{}
    * (int x, int y) ->{}
    * 左边是参数,右边是表达式
    */
  (x: Int) => x + 1
  val addOne = (x: Int) => x + 1
  println(addOne(1))

  val add = (x: Int,y: Int) => x + y
  println(add(1,2))
  val getTheAnswer = () => 42
  println(getTheAnswer())

  /**
    * def 是方法关键字
    * def 后面是方法名
    * 与java不同的是,scala的返回类型是写在: Int
    * =后面就是方法体
    * 类似于java的 public int addMethod(int x, int y) {return x + y}
    * 注意:scala虽然有return保留字,一般都不用,scala用最后一行进行返回
    * @param x
    * @param y
    * @return
    */
  def addMethod (x: Int, y: Int): Int = x + y
  println(addMethod(1, 2))
  /**
    * 方法可以有多个参数
    * 相对于java,scala有多个参数类别,不用定义在同一()里面,比较明显表明表达式结构
    */
  def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = {
    (x + y) * multiplier
  }

  /**
    * 当然scala也可以没有参数
    */
  def name: String = System.getProperty("name")
  println("Hello, " + name + "!")
  /**
    * scala 可以用{}使用多行表达式
    */
  def getSquareString(input: Double): String = {
    val square = input * input
    square.toString
  }

  println(getSquareString(2.22))

  /**
    * 类跟Java一样都是用class 关键字
    * 不同的是scala的参数可以定义在()里面
    * 类似于Java的构造函数
    * 相对于java用void表示没有返回值,scala用 Unit
    */
  class Greeter(prefix: String, suffix: String) {
    def greet(name: String): Unit = println(prefix + name + suffix)
  }

  /**
    * scala 同样使用new 作为创建实例的关键字
    */
  val greeter = new Greeter("Hello,","!")
  greeter.greet("Scala developer")

  /**
    * case class 是一个非常特殊的类,它可以用于模式匹配
    * case class 可以不用new关键字
    * 它是一个public类
    * 它自动生成hashCode 、equals
    */
  case class Point(x: Int,y: Int)
  val point = Point(1, 2)
  val anotherPoint = Point(1, 2)
  val yetAnotherPoint = Point(2, 2)
  if (point == anotherPoint) {
    println(point + " and " + anotherPoint + " are the same.")
  } else {
    println(point + " and " + anotherPoint + " are different.")
  }
  // Point(1,2) and Point(1,2) are the same.

  if (point == yetAnotherPoint) {
    println(point + " and " + yetAnotherPoint + " are the same.")
  } else {
    println(point + " and " + yetAnotherPoint + " are different.")
  }

  /**
    * Objects 是一个单例,不能用new
    * 就像Java定义单例模式一样,它只有一个
    */
  object IdFactory {
    private var counter = 0
    def create(): Int = {
      counter += 1
      counter
    }
  }

  val newId: Int = IdFactory.create()
  println(newId)
  val newerId: Int = IdFactory.create()
  println(newerId)

  /**
    * Traits 类似于Java的Interface,只不过Traits可以部分实现
    * Java 只能通过default 进行部分实现,实现包内访问
    * trait 只用extends修饰,到不用实现
    */
  trait GreeterTrait {
    def greet(name: String): Unit
    def greetDefault(name: String): Unit =
      println("Hello, " + name + "!")
  }

  class DefaultGreeterTrait extends GreeterTrait {
    override def greet(name: String): Unit = {
      println()
    }
  }

  class CustomizableGreeter(prefix: String, postfix: String) extends GreeterTrait {
    override def greet(name: String): Unit = {
      println(prefix + name + postfix)
    }
  }

  val greeterTrait = new DefaultGreeterTrait()
  greeterTrait.greet("Scala developer")
  val customizableGreeter = new CustomizableGreeter("How are you","?")
  customizableGreeter.greet("Scala developer")

  /**
    * scala 是运行与jvm,因此也需要一个主要方法main,main也是一个字符串数组
    */
}

object ScalaMain {
  def main(args: Array[String]): Unit =
    println("Hello, Scala developer!")
}
posted on 2018-01-15 00:33  先导者  阅读(228)  评论(0编辑  收藏  举报