美文网首页
scala(十) 抽象类和单例对象

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

作者: 万事万物 | 来源:发表于2021-06-27 06:03 被阅读0次

    java中的抽象类

    语法:

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

    scala 中的抽象类

    语法:

    abstract class 类名{}

    案例:

    /**
     * 动物抽象类
     */
    abstract class Animal{ }
    

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

    abstract class Animal
    

    抽象方法

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

    abstract class Animal{
      /**
       * 吃饭
       */
      def eat():Unit
    }
    

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

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

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

    具体方法

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

    abstract class Animal{
      /**
       * 吃饭
       */
      def eat():Unit
    
      /**
       * 睡眠
       */
      def sleep(): Unit ={
        println("闭眼,睡觉...")
      }
    
    }
    

    抽象属性

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

    语法:

    val 属性名:类型

    abstract class Animal{
      //抽象属性
      val name:String
    
      /**
       * 吃饭
       */
      def eat():Unit
    
      /**
       * 睡眠
       */
      def sleep(): Unit ={
        println("睡觉...")
      }
    
    }
    
    /**
     * 狗
     */
    class Dog extends Canine{
      /**
       * 吃饭
       */
      override def eat(): Unit = {
        println("狗啃骨头")
      }
    
      override val name: String = "旺财"
    }
    

    注意:

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

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

    创建抽象类

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

        val animal=new Animal {
          override val name: String = _
    
          /**
           * 吃饭
           */
          override def eat(): Unit = ???
        }
    
        val cat=new Animal {
          override val name: String = "小花"
    
          /**
           * 吃饭
           */
          override def eat(): Unit = println("猫爱吃鱼")
        }
    
        print(cat.name)
        cat.eat()
    

    输出结果

    小花猫爱吃鱼
    

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

      def main(args: Array[String]): Unit = {
        val dog:Animal=new Dog
        print(dog.name)
        dog.eat()
      }
    

    输出结果

    旺财狗啃骨头
    

    单例对象

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

    object Demo01 {}
    

    运行测试:

      def main(args: Array[String]): Unit = {
    
        println(Demo01)
        println(Demo01)
        println(Demo01)
    }
    

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

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

    相关文章

      网友评论

          本文标题:scala(十) 抽象类和单例对象

          本文链接:https://www.haomeiwen.com/subject/jscmyltx.html