Scala---面向对象

本文深入探讨了Scala中的单例对象,包括初始化顺序和调用方式。同时,介绍了伴生类和伴生对象的概念,展示了如何通过apply方法简化对象创建。此外,还详细讲解了抽象类和特质的用法,包括特质中的抽象方法实现和混入特质的灵活性。
摘要由CSDN通过智能技术生成

单例对象:object

object Oop1 {
  println("-------1-----")
  def showInfo():Unit={
    println("-------2-----")
    println("this is oop1 test")
  }
  println("-------3-----")
}

object TestOop1 {
  def main(args: Array[String]): Unit = {
    Oop1.showInfo()
  }
}

【注意:执行顺序】

【在第一次调用方法时,会将object中的所有的和相关方法进行初始化】
在这里插入图片描述

object Oop1 {
  println("-------1-----")
  def showInfo():Unit={
    println("-------2-----")
    println("this is oop1 test")
  }
  println("-------3-----")
}

object TestOop1 {
  def main(args: Array[String]): Unit = {
    Oop1.showInfo()
    Oop1.showInfo()		//创建第二个
  }
}

【注意:第二次调用方法的时候,仅仅调用了对应的方法】
在这里插入图片描述

伴生类(class)、伴生对象(object)

/*
*  伴生类---伴生对象:class A 和 object A 在同一个文件中,称为 互为伴生
*/

class Oop1(name:String,age:Int){   //伴生类,Scala中默认构造函数(括号里的)--主构造方法
  println("-----class 1-----")
  var uaddress = ""
  println(this.name+"\t"+this.age)

  def this(name:String){   //有一个参数 -- 辅助构造方法
    this(name,0)
  }
  def this(){              //无参 -- 辅助构造方法
    this("Jack",0)
    println("构造器")
  }
  def this(name:String,age:Int,address:String){
    this(name,age)
    uaddress = address
  }
//  def show(): Unit ={
//    println("name    "+name+"    age    "+age+"    address    "+uaddress+"    country    "+Oop1.country)
//  }

  override def toString: String = {
    "name    "+name+"    age    "+age+"    address    "+uaddress+"    country    "+Oop1.country
  }



  println("-----class 2-----")
}

object Oop1 { //伴生对象
  private val country = "中国"

  def apply(name: String, age: Int): Oop1 = new Oop1(name, age)  //调用class的构造方法,创建对象的时候就不用new了

  def apply(): Oop1 = new Oop1()

  def apply(name: String, age: Int,address:String): Oop1 = new Oop1(name, age,address)

  println("-------object 1-----")

  def showInfo():Unit={
    println("-------object 2-----")
    println("this is oop1 test")
  }

  println("-------object 3-----")

  def main(args: Array[String]): Unit = {
//    Oop1.showInfo()
//    Oop1.showInfo()

//    var o1 = new Oop1("Tom",34)   //创建伴生类的对象时,先调用伴生对象(object)中的信息,在调用class中的信息
    var o2 = new Oop1("buck",23,"南京")  //创建class对象
    println(o2)
    val o3 = Oop1("Hudie",23)    //创建object对象 ,在object 中添加apply方法,去调用class构造方法 1
    val o4 = Oop1()              // 2
    val o5 = Oop1("fang",52,"北京") //3
    val o6 = Oop1.apply()        //相当于2
    println(o3)
    println(o4)
    println(o5)
//    o2.show()
//    var o3 = new Oop1("Louis")
  }
}

抽象类

abstract class Car {  //抽象类
  def brand:String    //抽象方法
  def engine:String
  def speaker():Unit={ //非抽象方法
    println("嘀嘀嘀...")
  }
}
class Bmw extends Car{
  override def brand: String = {  //重写抽象方法
    println("BMW x6")
    return "BMW x6"
  }

  override def engine: String = {
    println("3.0TFSI 涡轮增压")
    "3.0TFSI 涡轮增压"
  }
}
object carTest{
  def main(args: Array[String]): Unit = {
    val bwm = new Bmw
    bwm.brand
    bwm.engine
    bwm.speaker()
  }
}

特质 trait

相当于Java中的接口,但是特质中可以定义函数体
实现特质中的抽像方法,必须使用 override
使用类来实现接口的时候,使用 with 关键字

trait Type1{ 
  def wheel:String={
    println("四个轮子")
    "四个轮子"
  }
}

trait Type2{
  def fly(): Unit ={
    println("飞上天空")
  }

  def downToSea():Unit
}

测试类

class Bmw extends Car with Type1 with Type2 {		//继承抽象类的同时实现多个特征
  override def brand: String = {  //重写抽象方法
    println("BMW x6")
    return "BMW x6"
  }

  override def engine: String = {
    println("3.0TFSI 涡轮增压")
    "3.0TFSI 涡轮增压"
  }

  override def downToSea(): Unit = {
    println("不能下海")
  }
}

main方法

object CarTest{
  def main(args: Array[String]): Unit = {
    val bwm = new Bmw		//创建对象,就可以调用对应的方法
	bwm.brand
	bwm.engine
	bwm.speaker()
	bwm.wheel
	bwm.fly()
 	bwm.downToSea()
 	}
}

还有一种写法,在创建对象的时候在 实现 特征,称之为混入特质

这种写法虽然比较麻烦,每一次定义是都要重写对应的方法,但是写法比较灵活,可以随便实现某个特征,而不比满足这个类的规范

val mzd = new Mazida with Type1 with Type2 {   //混入特质
      override def downToSea(): Unit = {
        println("可以但没必要下海")
      }

      override def wheel: String = {
        println("两个轮子")
        "两个轮子"
      }
    }
    mzd.fly()
    mzd.downToSea
    mzd.wheel
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值