Scala-抽象类、匿名子类、伴生对象、单例模式

抽象类

匿名子类 

伴生对象(单例对象)

单例设计模式


抽象类

  1. 定义抽象类:abstract class Person{} //通过 abstract 关键字标记抽象类
  2. 定义抽象属性:val|var name:String //一个属性没有初始化,就是抽象属性
  3. 定义抽象方法:def hello():String //只声明而没有实现的方法,就是抽象方法
object gou {
  def main(args: Array[String]): Unit = {
    //测试
    val student = new stu0
    println(student.name)
    println(student.age)
    student.run()
    student.sleep()
  }
}

//定义为抽象类父类
abstract class Student0{
  //定义非抽象属性
  val name : String = "yiyi"
  //定义抽象属性
  var age : Int

  //定义非抽象方法
  def run(): Unit ={
    println("跑起来")
  }
  //定义抽象方法
  def sleep(): Unit //抽象方法没有具体的方法体
}

//定义具体的实现子类
class stu0 extends Student0{
  //实现父类抽象属性和方法
  var age: Int = 18
  def sleep(): Unit = {
    println("睡觉吧")
  }

  //重写非抽象父类属性
  override val name: String = "stu"
  override def run(): Unit = {
    super.run()
    println("跑不动了")
  }
}

继承和重写的补充

  1. 如果父类为抽象类,那么子类需要将抽象的属性和方法实现,否则子类也需声明 为抽象类
  2. 重写非抽象方法需要用 override 修饰,重写抽象方法则可以不加 override。
  3. 子类中调用父类的方法使用 super 关键
  4. 子类对抽象属性进行实现,父类抽象属性可以用 var 修饰;
  5. 子类对非抽象属性重写,父类非抽象属性只支持 val 类型,而不支持 var。
  6. 因为 var 修饰的为可变变量,子类继承之后就可以直接使用,没有必要重写 

匿名子类 

     和 Java 一样,可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类。 

object gou {
  def main(args: Array[String]): Unit = {
    //测试
    val stu : Student0 = new Student0 {//匿名子类
      override var num: Int = 1
      override def sleep(): Unit = {
        println("eat")
      }
    }
    //打印匿名子类属性
    println(stu.num)
    //调用匿名子类方法
    stu.sleep()
  }
}

//定义为抽象类父类
abstract class Student0{
  //定义抽象属性
  var num : Int
  //定义抽象方法
  def sleep(): Unit //抽象方法没有具体的方法体
}

伴生对象(单例对象)

       Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概 念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象 来模拟类对象,该对象为单例对象。若单例对象名与类名一致,则称该单例对象这个类的伴 生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明。

object Person{
val country:String="China"
}
  1. 单例对象采用 object 关键字声明
  2. 单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
  3. 单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。
object gou {
  def main(args: Array[String]): Unit = {
    //测试
    val stu : Student_ = new Student_("xixi",18)
    println(s"${stu.name}")
    stu.printt()
    
    //测试工厂方法
    val student = Student_.newStu("aa",20)
  }
}

//定义类
class Student_(val name: String ,val age : Int){
  def printt(): Unit ={
    println(name)
    println(age)
    //可以直接访问伴生对象属性
    println(Student_.school)
  }
}

//定义Student_类的伴生对象
object Student_{
  val school : String = "烧烤学院"
  def printt(): Unit ={
    println(school)
  }
  //定义一个类对象实例的创建方法(工厂方法)
  def newStu(name : String,age:Int): Student_ = new Student_(name,age)
}

 单例设计模式

饿汉模式

object Singlenton {
  def main(args: Array[String]): Unit = {
    //测试
    val stu = Student_.getIn()
    stu.printt()
    val stu2 = Student_.getIn()
    stu2.printt()
    //打印两个对象地址 地址相同 全局只有一份
    println(stu)
    println(stu2)
  }
}
//定义类对象
class Student_(val name: String ,val age : Int){
  def printt(): Unit ={
    println(name)
    println(age)
  }
}

//定义Student_类的伴生对象
object Student_{
  //单例设计
  private val student : Student_ = new Student_("a",18)
  def getIn(): Student_ = student
}

懒汉模式

object Singlenton {
  def main(args: Array[String]): Unit = {
    //测试
    val stu = Student_.getIn()
    stu.printt()
    val stu2 = Student_.getIn()
    stu2.printt()
    //打印两个对象地址 地址相同 全局只有一份
    println(stu)
    println(stu2)
  }
}
//定义类对象
class Student_(val name: String ,val age : Int){
  def printt(): Unit ={
    println(name)
    println(age)
  }
}

//定义Student_类的伴生对象
object Student_{//懒汉模式
  private var student : Student_ = _
  def getIn(): Student_ = {
    if(student == null){
      //如果没有对象实例那么则创建一个
      student = new Student_("aa",20)
    }
    return student
  }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

open_test01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值