Scala初识

课前预备基础知识

编程语言分为编译型和解释型两种

编译型语言

(1)只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译,直接使用之前的编译结果就可以;因此其执行的效率比较高;
(2)编译性语言代表:C、C++、Pascal/Object Pascal(Delphi);
(3)程序执行效率比较高,但比较依赖编译器,因此跨平台性差一些;

解释型语言

(1)源代码不能直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行,源代码—>中间代码—>机器语言

(2)程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次;
(3)解释性语言代表:Python、JavaScript、Shell、Ruby、MATLAB等;
(4)运行效率一般相对比较低,依赖解释器,跨平台性好;

比较

(1)一般,编译性语言的运行效率比解释性语言更;但是不能一概而论,部分解释性语言的解释器通过在运行时动态优化代码,甚至能使解释性语言的性能超过编译性语言;

(2)编译性语言的跨平台特性比解释性语言一些;

java呢?

java属于编译型+解释型语言

java文件先编译成与平台无关的.class的字节码文件,然后.class的字节码文件既可以在Windows平台上的java虚拟机(JVM)上进行解释运行,也可以在Linux平台上的JVM上解释运行;而JVM的翻译过程时解释性的,JVM从.class的字节码文件中读出一条指令,翻译一条指令,然后执行一条指令,这个过程就称为java的解释执行;

语言的类型

强类型语言

强类型语言也称为强类型定义语言,是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。

Java、.Net和C++等一些语言都是强制类型定义的,也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。

例如你有一个整数,如果不显式地进行转换,你不能将其视为一个字符串。

弱类型语言

弱类型语言也称为弱类型定义语言,与强类型定义相反。像VB,PHP等一些语言就属于弱类型语言。

简单理解就是一种变量类型可以被忽略的语言。比如VBScript是弱类型定义的,在VBScript中就可以将字符串’12’和整数3进行连接得到字符串’123’,然后可以把它看成整数123,而不用显示转换。但其实他们的类型没有改变,VB只是在判断出一个表达式含有不同类型的变量之后,自动在这些变量前加了一个clong()或(int)()这样的转换函数而已。能做到这一点其实是归功于VB的编译器的智能化而已,这并非是VB语言本身的长处或短处。

强类型语言和弱类型语言比较

强类型语言在速度上可能略逊色于弱类型语言,但是强类型语言带来的严谨性可以有效地帮助避免许多错误。

语言的模型

面向过程:基本类型+指针

面向对象:基本类型+对象类型

面向函数:基本类型+对象类型+函数

SCALA:面向对象的函数式编程语言

准备工作

scala官网

jdk下载地址

idea官网

idea的欢迎页面,寻找configure-plugins,搜索scala,安装,重启idea

configure - projet defaults - project structure - global libraries - + - scala sdk - download - 2.11.12 - OK - OK,然后开始等待下载完成

右键scala sdk 2.11.12 - copy to library - OK

然后查看libraries里面有没有scala的sdk

HelloWorld

右键新建一个scala class,kind选择object,对比一下两个版本的helloworld,可以发现scala的语法简洁不少

好玩的知识点

scala中类名可以和文件名不一样

object约等于static,是一个单例的对象

只有在类名构造器中的参数可以设置成var,其他方法函数中的参数都是val类型的,并且不允许设置成var类型

最后注意一下伴生关系,在同一个文件中定义一个与类名相同的object,那么这个object叫做这个类的半生对象,这个类叫做这个这个对象的伴生类,伴生对象和半生类可以互相访问彼此的私有属性

附上练习代码

package helloworld

/**
  * @Author: okami mio
  * @Date: 2019/9/25 10:02
  */
object HelloWorldScala01 {
  def main(args: Array[String]): Unit = {
    println("hello world from scala")
  }
}

/**
  * 可以写多个object和class
  */
object Hololive {
  println("hololive start!")
  //  private val minato: Hololive = new Hololive()
  //  private val vtber: Hololive = new Hololive("nakiri", 10)
  //  private val vtber: Hololive = new Hololive("girl")
  private val vtber: Hololive = new Hololive("okami mio", 11)
  private val name = "hololive object"

  def main(args: Array[String]): Unit = {
    println("hello hololive!")
    //    minato.printName()
    vtber.printName()
  }

  println("hololive stop!")
}

class Hololive(var sex: String) {
  var aqua = "minato aqua"
  var age = 13
  val newAge = 14
  var name = "hololive class"
  sex = "girl"
  println("hololive static code start")

  def this(name: String, age: Int) {
    // 如果是个性构造,必须调用默认构造
    this("boy");
    this.aqua = name;
    this.age = age;
  }

  def printName(): Unit = {
    println(s"hello world from $aqua")
    println(s"hello world from ${age + age}")
    println(s"minato aqua'age$newAge")
    //    println(Hololive.minato)
    println(Hololive.vtber)
    println(s"this is sex $sex")
    println(sex)
    println(s"this is hololive'name : ${Hololive.name}")
    println(Hololive.name)
    println(name)
  }

  println("hololive static code end")
}