1、override和super,关于继承,我们在子类中使用override需要来重写父类的成员,可以使用super来引用父类
class Person {
val name = "super"
def getName = name
}
class Student extends Person {
// 重写val字段(这里val是重点)
override val name: String = "child"
// 重写getName方法
override def getName: String = "hello, " + super.getName
}
object Main13 {
def main(args: Array[String]): Unit = {
println(new Student().getName)
}
}
2、类型判断
scala中对象提供isInstanceOf和asInstanceOf方法。
- isInstanceOf判断对象是否为指定类的对象
- asInstanceOf将对象转换为指定类型
isInstanceOf 只能判断对象是否为指定类以及其子类的对象,而不能精确的判断出,对象就是指定类的对象。如果要求精确地判断出对象就是指定类的对象,那么就只能使用 getClass 和 classOf 。
object _14Demo {
class Person{}
class Student extends Person
def main(args: Array[String]): Unit = {
val p = new Student
println(p.isInstanceOf[Person])
println(p.getClass == classOf[Person])
println(p.getClass== classOf[Student]
}
}
结果:true false true
3、特质(接口)
-
特质是scala中代码复用的基础单元
-
它可以将方法和字段定义封装起来,然后添加到类中
-
与类继承不一样的是,类继承要求每个类都只能继承一个超类,而一个类可以添加任意数量的特质。
-
特质的定义和抽象类的定义很像,但它是使用trait关键字
-
使用extends来继承trait(scala不论是类还是特质,都是使用extends关键字)
-
如果要继承多个trait,则使用with关键字
object _01Demo { trait Logger{ def log(msg:String){} } class ConsoleLogger extends Logger{ override def log(msg: String): Unit = println("log日志"+msg) } def main(args: Array[String]): Unit = { val logger = new ConsoleLogger logger.log("nihao") } }
4、对象混入
-
scala中可以将trait混入到对象中,就是将trait中定义的方法、字段添加到一个对象中
object _07Demo { trait Logger { def log(msg:String): Unit ={ println(msg) } } class UserService def main(args: Array[String]): Unit = { val service = new UserService with Logger service.log("hi") } }
5、调用链
类继承了多个trait后,可以依次调用多个trait中的同一个方法,只要让多个trait中的同一个方法在最后都依次执行super关键字即可。类中调用多个tait中都有这个方法时,首先会从最右边的trait方法开始执行,然后依次往左执行,形成一个调用链条。
object _08Demo {
trait HandlerTrait{
def handle (msg:String): Unit ={
println("处理数据...")
}
}
trait DataValidHandlerTrait extends HandlerTrait{
override def handle(msg: String): Unit = {
println("验证数据")
super.handle(msg)
}
}
trait SignatureValidHandlerTrait extends HandlerTrait{
override def handle(msg: String): Unit = {
println("检查签名")
super.handle(msg)
}
}
class PaymentService extends DataValidHandlerTrait with SignatureValidHandlerTrait{
override def handle(msg: String): Unit = {
println("准备支付")
super.handle(msg)
}
}
def main(args: Array[String]): Unit = {
val service = new PaymentService
service.handle("支付")
}
}
结果:准备支付,检查签名,验证数据,处理数据...
6、模式匹配和样例类
在Java中,有switch关键字,可以简化if条件判断语句。在scala中,可以使用match表达式替代。
object _04Demo {
def main(args: Array[String]): Unit = {
val str = StdIn.readLine()
val result = str match {
case "hadoop" => println("大数据分布式存储和计算框架")
case "zookeeper" => println("大数据分布式协调服务框架")
case "spark" => println("大数据分布式内存计算框架")
case _ => println("不匹配")
}
println(result)
}
}
样例类
// 1. 创建两个样例类
case class Person(name:String, age:Int)
case class Order(id:String) 相当于