1.21
包
包
包就是文件夹,用 package 修饰,可以区分重名类。
作用域:
子包可以直接访问父包中的内容。
上层访问下层内容时,可以通过导包(import)或者写全包名的形式实现。
如果上下层有相同的类,使用时采用就近原则(优先使用下层)。
包对象:
要定义在父包中,一般用于对包的功能进行补充、增强。
可见性:
通过访问权限修饰符 private、protected、默认来限定访问修饰符。
格式:
访问修饰符[包名]
引入:
Scala 默认引入了 java.lang 包的全部内容,scala 包以及 Predef 包的部分内容。
包的引入不限于Scala 文件的顶不,而是可以编写到任何需要使用的地方。
如果需要导入某个包中的所有类和特质,使用下划线 _ 实现。
如果需要的时某个包的某几个类和特质,可以通过选取器 {}实现。
如果引入的多个包含有相同的类,可以通过重命名或隐藏解决。
重命名格式:
import java.util.{HashSet => JavaSet}
隐藏格式:
import java.util.{HashSet => _,_}//引入util包下除了HashSet的类
样例类
样例类是一种特殊类,一般用于保存数据,在并发编程以及 Flink 等框架中会经常使用。
格式:
case class 样例类名([var/val] 成员变量名1:类型1...)
如果不写,变量默认修饰符是val。如果要实现某个成员变量值可以被修改,则需要手动添加var 修饰。
示例:
object ClassDemo {
case class Person(val name:String, var age:Int)
def main(args: Array[String]): Unit = {
val person = new Person(name = "sjh", age = 24)
//person.name = "" 不可修改
person.age = 0
}
}
样例类的默认方法
apply
可以快速使用类名创建对象,省略 new 关键字。
toString
可以在打印时直接打印该对象各个属性值。
equals
可以直接使用 == 直接比较属性值。
hashCode
同一个对象哈希值一定相同,不同对象哈希值一般不同。
copy
可以用来快速创建属性值相同的实例对象,还可以使用带名参数的形式给指定的成员变量赋值。
unapply
示例:
object ClassDemo {
case class Person(var name:String, var age:Int)
def main(args: Array[String]): Unit = {
val person = Person(name = "sjh", age = 24)
println(person)//Person(sjh,24)
val person1 = person.copy(age = 20)
println(person1)//Person(sjh,20)
}
}
样例对象
用 case 修饰的单例对象就叫样例对象,而且它没有主构造器,主要用在:
枚举值
作为没有任何参数的消息传递
示例:
object ClassDemo {
//特质 Sex,表示性别
trait Sex
//样例对象,表示男,继承 Sex 特质
case object Male extends Sex
//样例对象,表示女,继承 Sex 特质
case object Female extends Sex
//定义样例类 Person
case class Person(var name:String, var sex:Sex){}
def main(args: Array[String]): Unit = {
val p = Person("sjh", Male)
}
}
案例:计算器
定义样例类 Calculate,并在其中添加四个方法分别用来计算两个整数的加减乘除操作。
object ClassDemo {
case class Calculate(a:Int, b:Int){
def add(): Int = a + b
def sub(): Int = a - b
def mul(): Int = a * b
def div(): Int = a / b
}
def main(args: Array[String]): Unit = {
val res = Calculate(1, 1)
println(s"加法: ${res.add()}")//2
println(s"减法: ${res.sub()}")//0
println(s"乘法: ${res.mul()}")//1
println(s"除法: ${res.div()}")//1
}
}

浙公网安备 33010602011771号