Scala基础语法(一)

1.变量 val/var

val/var 变量名:类型=值

1.1 定义变量的关键字

val 不可变的
     var 可变的

1.2 声明与赋值同时定义

只能对var赋默认值,参数类型必须给定,值为 _
     eg: var str:String=_

2.方法 def

2.1 格式:

[修饰符] def methodName(name1:ArgsType1,name2:ArgsType2)[:retrunType]={
     //方法体
  }

2.2 过程 方法的返回类型为Unit时,称之为过程(不建议大家这样做)

eg:
    def test1(a:Int):Unit={} 
      ----> 可以变成如下写法:
    def test1(a:Int){}

2.3 当方法为非递归方法时,可以将返回类型省略

def test(a:Int)={
      a
    }
  eg: 如下为递归方法,不可以将返回类型省略。
    def fac(a:Int):Int={
      a*fac(a-1)
    }

2.4 方法调用 方法名(args)

1.对于无参数的方法,方法调用有两种: 方法名() 或者 方法名
  2.方法调用时,可以通过形参进行无顺序传递。

eg:

def info(a:Int,b:Int,c:Int)={
          a+b+c
 }
  //方法调用:
  info(1,2,3)
  info(a=1,c=3,b=2)
  //注意:当使用形参传递参数时,如果有未指明形参名的必须与对应位置想匹配,不可以随意放置。
  info(b=2,a=1,6) //正确
  info(b=2,6,a=1) //错误 形参a,b有对应的值,那么为c赋值时,需要按照c在方法参数列表中的位置进行对应。

2.5 可变参列表

1.只能位于参数列表的最后一个
    2.表示形式: 类型* 
    3.可变参本质上是一个集合。

def test(a:Int,b:String,c:Any*)={
      println(c)
    }

3.数据类型

8种基本类型+Unit
Unit <===> ()

类层级结构:

Any(顶级父类,最顶级类) 
          
  AnyVal        AnyRef(相当于Java中的Object)
  
8基本+Unit      引用类型

          Nothing(所有类的子类,最底层类)

AnyVal包含:

(实际Scala中是没有基本数据类型的)

Byte Int Short Long Char Boolean Float Double + Unit

AnyRef包含:

String(java.lang) 集合类 数组 自定义数据类型 ...

4.类 class

4.1 格式:

class 类名 private[package] (主构造器参数列表) extends 类/特质 with 特质1 with 特质2{}

eg:

class Student(name:String,age:Int) extends Father with T1 with T2{
  //属性
  //方法
  //主构造器中的代码
  println(".....")
  def this()={
    //.......
  }
}

4.2 构造器:

主构造器 :

与类的定义交织在一起

辅助构造器 :

1.通过方法名this重载构造器 
    2.辅助构造器的第一行代码必须是调用主构造器或者调用其他已经定义好的辅助构造器

4.3 主构造器参数列表

形式:

1.参数名:类型  
  2.var 参数名:类型
  3.val 参数名:类型
  4.private val/var 参数名:类型
  5.@BeanProperty val/var 参数名:类型

总结:

1.当参数没有被修饰,且在类中没有使用该参数,该参数什么都不会生成。
  2.当参数被val修饰时,会生成private修饰的字段/属性,以及提供一个名字为参数名的公有取值方法。
  3.当参数被var修饰时,会生成private修饰的字段/属性,以及提供一个名字为参数名的公有取值方法和一个名字为参数名_=的公有赋值方法。
  4.与2,3生成的字段以及方法个数一致,不同在于生成的方法时私有的。
  5.@BeanProperty 会生成javaBean版本的set/get方法

5.对象 object 单例对象

格式:

object 对象名 extends 类/特质 with 特质1 with 特质2{}

总结: 类中的方法与字段都是非静态的。 对象中的方法与字段都是静态的。

程序入口

1.Main方法

object TestMain1{
      //程序入口
      def main(args:Array[String]):Unit={}
    }
    将代码写到TestMain1.scala文件中。

2.扩展App

object TestMain2 extends App{
      //......程序入口
    }
    将代码写到TestMain2.scala文件中。

准备工作:

mkdir scala/day1
     vi TestMain1.scala

编译命令:

scalac  TestMain1.scala

查看当前目录: ls

使用反编译工具打开 TestMain1.class

scalap TestMain1
        javap -p TestMain1

运行命令:

scala TestMain1

6.特质 trait

格式:

trait 特质名 extends 类/特质 with 特质1 {}

总结:

1.可以包含具体方法/属性
    2.可以包含抽象方法/属性
    3.特质 可以 混入 类/对象/特质/实例(对象)

7.类型 type

格式:

type 变量名=类型

总结:

1.当类型名称比较复杂时,可以对当前类型起个别名,方便后期使用。
    2.当同一个源文件中出现两个不同包的同一类名时,可以通过类型别名来进行区分。

相关推荐