Scala学习笔记(二) object class

本文详细介绍了Scala中的类(class)与对象(object)的概念及其用法,包括类的定义、对象的定义、继承、构造器、类成员的访问及伴生对象的使用。通过示例展示了Scala如何提供更简洁的面向对象编程特性。

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

scala中的object 和class

Scala中的class与java类似,但是类名不是必须和文件名相同且一个文件可以定义多个class.同时scala中的class不存在静态成员,java中 的静态成员由scala中的object对象代替,当object对象名和class名相同时称object 为class的伴生对象,反过来class为object的伴生类,它们必须在同一文件中.

1.1 定义类

scala> class Hiscala{
     | private val name:String="zhangsan"
     | def sayName(){
     | println(name)
     | }
     | def getName=name
     | }
defined class Hiscala

scala> val hiscala=new Hiscala
hiscala: Hiscala = Hiscala@16edb8ee

scala> hiscala.sayName
zhangsan

scala> hiscala.getName
res3: String = zhangsan

1.2 定义object

object本身有默认的constructor ,这个constructor 只会被调用一次

scala> object Person{ println("Scala")
     | val age=10
     | def getAge=age
     | }
defined object Person

scala> Person.getAge
Scala   //第一次调用constructor
res0: Int = 10

scala> Person.getAge //不再调用
res1: Int = 10

伴生对象可以访问伴生类的私有成员

1.3 继承

与java很像,一继承多实现

//定义抽象类
abstract class Animal{
    def eat={
    println("Eat food!!!")
    }
    def run
}
//cat 继承Animal,实现了run方法并重写了eat方法
class Cat extends Animal{
    override def eat:Unit={
    println("Eat mouse!!!")
    }
    override def run:Unit={
        println("Running...")
    }
}
> 子类不能重写父类中的 `final`修饰的方法和属性

1.4 主构造器和辅助构造器

scala默认构造器就在类上 ,可以通过以下方式重载

class Person(name:String){
    println(this.name)
    def this(name:String,age:Int){
        this(name) //重载构造器第一行必须是默认构造器或者其他构造器
        println(name+":"+age)
    }
    def this(name:String,age:Int,sex:String)
    {
        this(name,age)
        println(name+":"+age+":"+sex)
    }
}

1.5 类的字段和方法

定义一个 Person类

class Person{
    var name:String ="zhangsan"
    var age =30 
    val sex ="famale"
    def sayHi=println("Hi!!!")
    def increase(age:Int):Int=this.age+age
}
//访问对象属性
val p=new Person
p.name
p.name="lisi"
p.sex

这里注意的是,scala中的val会有getter方法,var 会有setter 和getter方法.,这些方法都会自动生成,但是对于private属性的setter和getter就需要自己写了,否则对象无法访问. scalc默认方法是public的 ,若在方法的前面加上private,则对象实例无法访问方法.
对于无参数的方法,无论定义时带不带括号,调用时都可以不带括号.建议都不要带括号,省事.
对于scala中的settergetter方法的区别在下面的例子中说明

class Person{
    private var myName="Frank" //定义一个私有对象,显然对象不能访问
    //定义getter
    def name=this.myName
    //定义setter
    def name_=(newName:String){
        myName=newName
        println("Hi:"+myName)
    }
}
val person =new Person
println(person.name)
person.name="zhangsan" //这里实际调用的是name_ 系统会自动找这个函数

注意 def name_=(newName :String) 等号两边不能有空格

当然还可以用另外一种定义方式,这种方式就是直接在一个public函数里给它赋值,但是调用的时候就不是直接用person.name="zhangsan"这种方式了,而是使用定义的函数名(比如update)person.update(newName)

然后就是神奇的 _ 下划线,在scala中貌似妙用无穷,让我很懵逼,暂时写到这里吧.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值