Scala基础(6) 单例对象和伴生对象

本文深入探讨Scala中的单例对象、伴生对象、应用程序对象、继承、抽象类和拓展类等核心概念,通过实例讲解如何在Scala中实现这些特性,帮助读者理解Scala与Java在面向对象编程上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 单例对象

Scala并没有提供Java那样的静态方法或者静态字段,但是,可以采用object关键字实现单例对象,具备和Java静态方法同样的功能。

⚠️注意:在Scala中需要对值进行返回可以使用:1. return value;2. 直接写在方法的最后面一行。

object Person{
    private var lastId = 0
    def newPersonId()={
        lastId += 1
        lastId
}
}

printf("first person id is %d.\n", Person.newPersonId())
printf("second person id is %d.\n", Person.newPersonId())
printf("third person id is %d.\n", Person.newPersonId())
// 我没有运行起来

出现在object中的变量和方法都是静态的,也就是多次调用原数据不会被清零。

 

  • 伴生对象

Scala源代码编译后都会变成JVM字节码。实际上,在编译上面的源代码文件以后在Scala里面的class和object在Java层面都会被合二为一,class里面的成员成了实例成员,object成员成了static成员。

  • 应用程序对象

每一个Scala应用程序都必须从一个对象的main方法开始。

object Hello{
    def main(args: Array[String]){
        println("Hello world")
    }
}
  • 继承

Scala中的继承与Java有着显著的不同:1.只有主类构造器可以调用超类的主构造器;2.在子类中重写超类的抽象方法时不需要使用override关键字(如果加上override的话,编译也不会报错);3.重写一个非抽象类方法必须使用override修饰符;4.可以重写超类中的字段。

抽象方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。

抽象类不能生成对象,只能够派生。

抽象类

abstract class Car{
    val carBrand: String //字段没有初始化值,就是一个抽象字段
    def info() //抽象方法,不需要使用abstract关键字
    def greeting(){println("Welcome to my world.")}
}

(1)定义一个抽象类,需要使用关键字abstract。

(2)定义一个抽象类的抽象方法,也不需要关键字abstract,只要把方法体空着不写方法体就可以。

(3)抽象类中定义的字段,只要没有给出初始化值,就表示是一个抽象字段,但是抽象字段必须要声明类型,比如:val carBrand: String,carBrand声明为字符串类型,这个时候不能够省略类型,否则编译会报错。

class BMWCar extends Car{
    override val carBrand = "BMW" // 重写超类字段要使用override关键字,否则编译会报错
    def info(){printf(carBrand)}
    override def greeting(){println("Welcome to my BMW car.")}
    
}

class BYDCar extends Car{
    override val carBrand = "BYD" // 重写超类字段,用override
    def info(){printf(carBrand)} // 重写超类抽象方法,不需要使用override,加上编译也不报错
    override def greeting(){println("Welcome to my BYD car.")} //重写超类非抽象方法,需要override关键字
}

拓展类

abstract class Car{
    val carBrand: String
    def info()
    def greeting(){println(Welcome to my car.)}
}

class BMWCar extends Car{
    override val CarBrand = "BMW"
    def info(){println("%s.\n",carBrand)}
    override def greeting(){println("Welcome to my BMW car.")}
}

class BYDCar extends Car{
    override val carBrand = "BYD"
    def info(){println("Welcome to my BYD car.")}
    override def greeting(){println("Welcome to my BYD car.")}
}

object myCar{
    def main(args:Array[String]){
        val mycar_1 = new BMWCar()
        val mycar_2 = new BYDCar()
        mycar_1.greeting()
        mycar_1.info()
        mycar_2.greeting()
        mycar_2.info()
}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值