前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >scala(十) 抽象类和单例对象

scala(十) 抽象类和单例对象

作者头像
用户1483438
发布2022-04-15 14:53:17
2740
发布2022-04-15 14:53:17
举报
文章被收录于专栏:大数据共享

java中的抽象类

语法:

[访问修饰符] abstract class 类名{}

scala 中的抽象类

语法:

abstract class 类名{}

案例:

代码语言:javascript
复制
/**
 * 动物抽象类
 */
abstract class Animal{ }

若 类中什么都没定义{}可以省略

代码语言:javascript
复制
abstract class Animal

抽象方法

没有方法体({})的方法,就是抽象方法。

代码语言:javascript
复制
abstract class Animal{
  /**
   * 吃饭
   */
  def eat():Unit
}

定义成抽象方法的方法,需要由子类去实现该方法,除法子类也是一个抽象类。

代码语言:javascript
复制
/**
 * 犬科
 */
abstract class  Canine extends Animal{}
代码语言:javascript
复制
/**
 * 狗
 */
class Dog extends Canine{
  /**
   * 吃饭
   */
  override def eat(): Unit = {
    println("狗啃骨头")
  }
}

抽象类中,抽象方法返回值类型可以不指定,默认就是Unit类型。

具体方法

在抽象类中,除了有抽象方法,还有具体的方法(带{})实现。 如:动物各种其他行为可能有些区别,但是只要是动物,就应该会睡觉,所以可以定义成具体的方法。

代码语言:javascript
复制
abstract class Animal{
  /**
   * 吃饭
   */
  def eat():Unit

  /**
   * 睡眠
   */
  def sleep(): Unit ={
    println("闭眼,睡觉...")
  }

}

抽象属性

每个动物都会有个名字,那么名字属性就可以定义成 抽象属性,具体叫什么,由子类去定义。

语法:

val 属性名:类型

代码语言:javascript
复制
abstract class Animal{
  //抽象属性
  val name:String

  /**
   * 吃饭
   */
  def eat():Unit

  /**
   * 睡眠
   */
  def sleep(): Unit ={
    println("睡觉...")
  }

}
代码语言:javascript
复制
/**
 * 狗
 */
class Dog extends Canine{
  /**
   * 吃饭
   */
  override def eat(): Unit = {
    println("狗啃骨头")
  }

  override val name: String = "旺财"
}

注意:

  1. 抽象属性必须使用 val
  2. 抽象属性不能对其赋值

既然有抽象属性,那当然也有具体属性,除去抽象属性的定义,那自然就是具体属性了。

创建抽象类

实际情况下,抽象类是可以进行创建new 的,只不过需要实现其内部属性和方法,这种方式叫匿名子类

代码语言:javascript
复制
    val animal=new Animal {
      override val name: String = _

      /**
       * 吃饭
       */
      override def eat(): Unit = ???
    }
代码语言:javascript
复制
    val cat=new Animal {
      override val name: String = "小花"

      /**
       * 吃饭
       */
      override def eat(): Unit = println("猫爱吃鱼")
    }

    print(cat.name)
    cat.eat()

输出结果

代码语言:javascript
复制
小花猫爱吃鱼

通常情况下,还是创建具体的子类

代码语言:javascript
复制
  def main(args: Array[String]): Unit = {
    val dog:Animal=new Dog
    print(dog.name)
    dog.eat()
  }

输出结果

代码语言:javascript
复制
旺财狗啃骨头

单例对象

在scala中 object 就是一个单例对象;如 Demo01 即使一个单例对象

代码语言:javascript
复制
object Demo01 {}

运行测试:

代码语言:javascript
复制
  def main(args: Array[String]): Unit = {

    println(Demo01)
    println(Demo01)
    println(Demo01)
}

无论运行多少次都是一个实例

代码语言:javascript
复制
com.admin.xxx.abst.Demo01$@5a01ccaa
com.admin.xxx.abst.Demo01$@5a01ccaa
com.admin.xxx.abst.Demo01$@5a01ccaa

scala object 中所有的属性和方法都是类似 java static 修饰的。 scala class 中所有的属性和方法都是类似 java 非static 修饰的。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • java中的抽象类
  • scala 中的抽象类
  • 抽象方法
  • 具体方法
  • 抽象属性
  • 创建抽象类
  • 单例对象
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档