> 文章列表 > 【Scala入门】scala基础语法:类和对象,变量和常量

【Scala入门】scala基础语法:类和对象,变量和常量

【Scala入门】scala基础语法:类和对象,变量和常量

上一篇请移步【Scala入门】Scala下载及安装(Windows)以及Idea创建第一个scala项目_水w的博客-CSDN博客

目录

一、Scala

二、Scala基础语法

2.1 注释与标识符规范

2.2 变量与常量

【案例:变量声明和赋值】

2.3 object

【案例:伴生对象,val通过对象来改变属性】

【案例:重写构造函数,对象中的apply方法】


一、Scala

  • Scala基于JVM, 和Java完全兼容, 同样具有跨平台,可以执行好,方便的垃圾回收等特性;
  • Scala是一种纯粹的面向对象语言;
  • Scala是一门函数式编程语言;
  • Scala对集合类型数据处理有非常好的支持

Spark的底层用Scla编写, 深入学习Spark必定要掌握Scala。

二、Scala基础语法

注意

  • scala中每行后面都会有分号自动推断机制,不用显式写出“;”
  • 建议在scala中,类名首字母大写 ,方法首字母小写,类和方法命名建议符合驼峰命名法

2.1 注释与标识符规范

(1)注释:

//  	1.单行注释/* */ 	2. 多行注释/** 	3. 文档注释
*
**/

(2)标识符命名规范:

  • 字母下划线开头,后跟字母数字下划线,和C/C++/Java一样。
  • 操作符开头,且只包含(+-*/#!等),也是有效的标识符。这样用会用什么奇怪的好处吗?答案是灵活到天顶星的运算符重载。
  • 用反引号包括的任意字符串,即使是同39个Scala关键字同名也可以。
var _abc:String = "hello"
val -+/%# = 10
val `if` = 10
println(_abc)
println(-+/%#)
println(`if`)

关键字:

  • package import class obejct trait extends with type for
  • private protected abstract sealed final implicit lazy override
  • try catch finlly throw
  • if else match case do while for return yield
  • def var val
  • this super
  • new
  • true false null
  • 其中Java没有的关键字:object trait with implicit match yield def val var

字符串:

  • 类型:String
  • +号连接
  • *字符串乘法,复制一个字符串多次
  • printf格式化输出
  • 字符串插值:s"xxx${varname}"前缀s模板字符串,前缀f格式化模板字符串,通过$获取变量值,%后跟格式化字符串。
  • 原始字符串:raw"rawstringcontents${var}",不会考虑后跟的格式化字符串。
  • 多行字符串:""" """
  • 输出:print printf println ...
    val name: String = "Pyrrha" + " " + "Nikos"  // +号拼接字符串val age = 17println((name + " ") * 3)  // 将一个字符串复制多次进行拼接printf("%s : dead in %d\\n", name, age) // printf:前缀f格式化模板字符串,通过$获取变量值,%后跟格式化字符串print(s"$name : dead in ${age}") // 字符串插值:前缀s模板字符串,通过$获取变量值val power = 98.9072println(f" : power ${power}%.2f.") // 取小数后2位

2.2 变量与常量

Scala有两种类型的变量:

  • 关键字 var 声明的变量,值是可变的
  • 关键字 val 声明的变量,也叫常量,值是不可变的

 

注意

  • 变量的类型如果能够通过变量值推断出来,那么可以省略类型声明;
  • 变量必须进行显示初始化;
  • 一般默认为val类型变量;

案例:变量声明和赋值

object HelloWorld {def main(args: Array[String]): Unit = {// 定义方法 main ==  def 方法名(参数名: 参数类型):返回值 ={}println("hello world")//1. 类型推导; 声明变量时, 类型可以忽略, 编译器会自动推导;var a1 = 10;var a2: Int = 10;var b3 = "areusb?";val c5 = false;//2. 强类型语言; 变量/常量的数据类型确定后, 就不能再修改var e3: Int = 250;e3 = "feswgf"; // 编译器不会对此句报错, 执行时才会报错 type mismatch//3. 声明变量时必须有初始值,否则报错;var e4: Int;//4. var可变, va不可变var f4 = 6;f4 = 9;val f5 = 100;f5 = 200; // 编译器当场报错;}
}

控制台中输出结果:

2.3 object

scala 中的object是单例对象,相当于java中的工具类,可以看成是定义静态的方法的类。

如果在同一个文件中,object对象和class类的名称相同,则这个对象就是这个类的伴生对象,这个类就是这个对象的伴生类。可以互相访问私有变量。

案例:伴生对象,val通过对象来改变属性

  • object不可以传参数;
  • scala中的class类默认可以传参数,默认的传参数就是默认的构造函数。重写构造函数的时候,必须要调用默认的构造函数;
  • class类中的属性默认有setter和getter方法;
package testclass Student(name: String, var age: Int) {def printInfo(): Unit = {println(name + " " + age + " " + Student.school)}
}// 引入 object 伴生对象/单例对象,所有的私有属性都可以互相访问
object Student {val school: String = "atguigu"def main(args: Array[String]): Unit = {val alice = new Student(name = "alice", age = 19)alice.age = 24alice.printInfo()}
}

控制台中输出结果: 

案例:重写构造函数,对象中的apply方法】

  • scala中的class类默认可以传参数,默认的传参数就是默认的构造函数。重写构造函数的时候,必须要调用默认的构造函数;
  • 使用object时,不用new;使用class时要new ,并且new的时候,class中除了方法不执行(不包括构造),其他都执行

  • 对象中的apply方法:object中不可以传参,当创建一个object时,如果传入参数,那么会自动寻找object中的相应参数个数的apply方法;
package com.yt.testclass Person(xname: String, xage: Int) {val name = xnamevar age = xagevar gender = 'M'println("----------- Person Class -----------") // new时,class中除了方法不执行(不包括构造),其他都执行def this(yname: String, yage: Int, ygender: Char) {this(yname, yage)  // 类中重写构造时,构造中第一行要调用默认的构造函数this.gender = ygender}def sayName() = {println("sayName:", ClassAndObj.name) // 调用object静态属性}println("************ Person Class ************")
}object ClassAndObj {println("----------- ClassAndObj object -----------")val name = "wangwu" // object静态属性,相当于java的工具类def apply(s: String, age: Int) = {println("name is " + s + ",age" + age)}def main(args: Array[String]): Unit = {val p1 = new Person("zhangsan", 19)val p2 = new Person("zhangsan", 19, 'F')p1.age = 200println(p1.name, p1.age)p1.sayName()println(p2.name, p2.age, p2.gender)ClassAndObj("lisi", 500)}}

控制台中输出结果: