前言
此系列为scala学习文章,适用于为学spark而学习scala
视频参考地址:Scala快速入门(适合为学Spark学习Scala的同学)
系列文章如下:
6. Scala学习06——trait特性、模式匹配、偏函数、样例类
资料下载地址:Scala课件资料.docx
目录
一、数据类型
- Scala数据类型,首字母大写
- Any是所有类型的超类,其父类为Object,AnyRef与AnyVal为Any类型的子类
- Nothing类型表示不赋类型时,系统默认的类型,无实例值,为所有类型的子类
二、变量和常量的声明
- 常量赋值:val
- 变量赋值:var
- 定义变量/常量时,也可以写上指定类型,一般Scala可以自动识别,因此省略,如:val a:Int = 10
var name = "zhangsan"
println(name)
name ="lisi"
println(name)
//name 是变量,可以再赋值
val gender = "m"
//gender = "f"//错误,不能给常量再赋值
- 用表达式赋值
val x=1
val y=if(1>0) 1 else -1
val p=if (x>5) 1
三、类和对象
- 创建类
class Person{
val name = "zhangsan"
val age = 18
def sayName() = {
"my name is "+ name
}
}
- 创建对象
object Lesson_Class {
//定义主方法
def main(args: Array[String]): Unit = {
val person = new Person()
// 可以直接引用该类中的属性
println(person.age);
println(person.sayName())
}
}
- 对象中的apply方法
- object中不可以传参,当创建一个object时,如果传入参数,那么会自动寻找object中的相应参数个数的apply方法。
/**
* object 单例对象中不可以传参
* 如果在创建Object时传入参数,那么会自动根据参数的个数去Object中寻找相应的apply方法
* 相当于重载方法,会自动根据调用方法的参数类型、个数寻找匹配的apply方法
*/
object Lesson_ObjectWithParam {
def apply(s:String) = {
println("name is "+s)
}
def apply(s:String,age:Int) = {
println("name is "+s+",age = "+age)
}
def main(args: Array[String]): Unit = {
// 传入1个参数 ,自动寻找调用第一个apply方法
Lesson_ObjectWithParam("zhangsang")
// 传入2个参数 ,自动寻找调用第二个apply方法
Lesson_ObjectWithParam("lisi",18)
}
}
- 伴生类和伴生对象
- 伴生对象必须要和伴生类一样的名字;
- 伴生对象和伴生类在同一个scala源文件中;
- 伴生对象和伴生类可以互相访问private属性。
class Person(xname :String , xage :Int){
// case1 伴生类,可以直接调用其伴生对象的变量 值为"zhangsanfeng"
var name = Person.name
// case2 私有变量 name,若object名字不与当前类名一致,则在对象main方法中调用person.name会报错
private val name = xname
val age = xage
var gender = "m"
}
object Person {
val name = "zhangsanfeng"
def main(args: Array[String]): Unit = {
val person = new Person("wagnwu",10,"f")
println(person.name );
}
}
- 构造函数this
- scala中的class类默认可以传参数,默认的传参数就是默认的构造函数。
- 重写构造函数的时候,this函数第一行必须要调用默认的构造函数
- 构造函数更多详见:Scala学习笔记——主构造器、辅助构造器与私有构造器
class Persom(xname:String,xage:Int){
val name = xname
var age = xage
var gender = 'M'
//new该class时,会执行该语句
println("*****************")
//new该class时,会执行该语句,因为是构造函数
def this(yname:String,yage:Int,ysex:Char){
//第一行调用默认的构造函数
this(yname,yage)
this.gender = ysex
}
//new该class时,不执行该语句,只在调用时执行
def setName()={
println("name is .." + lesson_ClassAndObj.name)
}
//new该class时,会执行该语句
println("===============")
}
object lesson_ClassAndObj {
val name = "wangwu"
def main(args: Array[String]): Unit = {
val p = new Persom("ssss",20)
val p1 = new Persom("xxxx",20,'F')
}
}
总结注意:
- 建议类名首字母大写 ,方法首字母小写,类和方法命名建议符合驼峰命名法。
- scala 中的object是单例对象,相当于java中的工具类,可以看成是定义静态的方法的类。object不可以传参数。另:Trait不可以传参数
- scala中的class类默认可以传参数,默认的传参数就是默认的构造函数。
- class 类属性自带getter ,setter方法。
- 使用object时,不用new,使用class时要new ,并且new的时候,class中除了方法不执行(不包括构造),其他都执行。
- 如果在同一个文件中,object对象和class类的名称相同,则这个对象就是这个类的伴生对象,这个类就是这个对象的伴生类。可以互相访问私有变量。