scala基础之继承,类型判断、特质、对象混入、调用链、模式匹配

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)  相当于
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值