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

2022-04-15 14:53:17 浏览数 (1)

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 修饰的。

0 人点赞