Scala的面向对象
1.scala的类
(1)类的成员class Student { //使用var定义一个可变的成员变量 var age=18 //使用val定义一不可变的成员变量 val name="zy" //定义一个私有化成员变量(伴生对象仍然可以访问) private var id=1001 //定义一个私有化成员变量(伴生对象也不可以访问) private[this] val address="anhui" //定义一个成员方法 def running(): Unit ={ println(this.name+"跑~") } } 注意点: (2)类的构造器//在类上声明的是主构造器 class Student(val name:String,val age:Int) { //使用this为方法名,这个是辅助构造器 def this(name:String,age:Int){ this(name,age) } } 主构造器的注意点: (3)类的私有化//使用private修饰主构造器,表示私有化类 class Student private(val name: String,val age: Int) { def this(name: String,age: Int) { this(name,age) } } //使用 private[this]私有化类 class Person private[this](val name: String,val age: Int) { } 注意点: 2.伴生对象?在scala的类中,与类名相同的单例对象叫做伴生对象。 //使用private修饰主构造器,表示私有化类 class Student private { private val name="zs" private val age=18 } object Student{ //在伴生对象中创建私有化类的对象 val student=new Student() //在伴生对象中访问私有化的属性 val name=student.name val age=student.age } 单例对象: object person{ val name="zs" val age=18 } 特点: apply方法 object Test01 { def main(args: Array[String]): Unit = { //以下两种方式创建对象等效 val list01 = List(1,3) val list02 = List.apply(1,3) } } 特点: 3.scala的抽象类? 定义:抽象类是一种不能被实例化的类,抽象类中包括了若干不能完整定义的方法,这些方法由子 类去扩展定义自己的实现。 abstract class Annimal { def runing() def eat() } class Cat extends Annimal { def runing(): Unit = { println("running~") } def eat(): Unit = { println("eatting~") } } ? 4.scala的继承例: //父类 class Annimal { //被final修饰的无法被继承 final private val name = "Annimal" def runing(): Unit = { println("running~") } def eat(): Unit = { println("eatting~") } } //子类 class Cat extends Annimal { //重写父类的方法 override def runing(): Unit = { //调用父类原有的方法 super.runing() } } 注意: 5.scala的类型检查和转换例: object Test01 { def main(args: Array[String]): Unit = { val parent=new Annimal //父类 val chrild=new Cat //子类 //类型判断 println(chrild.isInstanceOf[Annimal]) //true //类型获取 println(classOf[Cat]) //class Cat //类型转换 val annimal: Annimal = chrild.asInstanceOf[Annimal] } } //父类 class Annimal { //被final修饰的无法被继承 final private val name = "Annimal" def runing(): Unit = { println("running~") } def eat(): Unit = { println("eatting~") } } //子类 class Cat extends Annimal { //重写父类的方法 override def runing(): Unit = { //调用父类原有的方法 super.runing() } } ? 6.scala的特质 (Trait)(1)特质的介绍? Scala 和 Java 语言一样,采用了很强的限制策略,避免了多继承的问题。在 Java 语言中,只允许继承一个超类,该类可以实现多个接口,但 Java 接口有其自身的局限性:接口中只能包括抽象方法,不能包含字段、具体方法。Scala 语言利用 trait 解决了该问题,在 Scala 的 trait 中,它不但可以包括抽象方法还可以包含字段和具体方法。特质在底层实现是采用的Java的抽象类。 trait Annimal { val name = "Annimal" def runing(): Unit = { println("running~") } def eat() } (1)特质的基本使用特质的特点: trait Car { } trait Person{ } class transformers extends Car with Person{ } (2)特质作为接口使用? 将特质中的方法全部定义成为抽象方法。类可以使用extends的方式继承特质。scala 不支持对类进行多继承,但是支持多重继承 trait,使用 with 关键字即可。类继承 trait 后,必须实现其中的抽象方法,实现时不需要使用 override 关键字。 trait MySQLDAO{ val id:Int def add(o:Any):Boolean def update(o:Any):Int def query(id:String):List[Any] } //如果有多个 trait 的话,则使用 with 关键字即可 class DaoImpl extends MySQLDAO with Serializable{ // 给父类中的抽象字段赋值。 override val id = 12 // 实现抽象方法 def add(o:Any):Boolean = true def update(o:Any):Int = 1 def query(id:String):List[Any] = List(1,3) } (3)为实例对象混入 Trait? 有时我们可以在创建类的对象时,指定该对象混入某个 Trait,这样,就只有这个对象混入该 Trait 的方法,而类的其他对象则没有。 object Test01 { def main(args: Array[String]): Unit = { //会某一个对象混入特质 var HTQ_DHF =new Person() with DHF } } trait transformers trait HTQ extends transformers trait DHF extends transformers trait Person extends HTQ (4)Trait 调用链? scala 中支持让类继承多个 Trait 后,依次调用多个 Trait 中的同一个方法,只要让多个 Trait 的同一个方法中,在最后都执行 super.方法 即可。类中调用多个 Trait 中都有的这个方法时,首先会从最右边的 Trait 的方法开始执行,然后依 次往左执行,形成一个调用链条这种特性非常强大,其实就相当于设计模式中的责任链模式的一种具体实现依赖。 object Test01 { def main(args: Array[String]): Unit = { val p=new Person_TraitChain("zhangxiaolong") p.sayHello } } trait Handler { //父类的trait 必须有实现体,不然会报错 def handler(data:String): Unit ={ println("Handler :"+data) } } trait Handler_A extends Handler{ override def handler(data:String): Unit = { println("Handler_A :"+data) super.handler(data) } } trait Handler_B extends Handler{ override def handler(data:String): Unit = { println("Handler_B :"+data) super.handler(data) } } trait Handler_C extends Handler{ override def handler(data:String): Unit = { println("Handler_C :"+data) super.handler(data) } } class Person_TraitChain(val name:String) extends Handler_C with Handler_B with Handler_A{ def sayHello={ println("Hello "+name) handler(name) } } 结果会打印: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |