Scala学习——核心概念

本文介绍Scala中的面向对象编程概念,包括类与对象的定义、构造器的使用、继承与特质等核心特性。探讨了Scala如何支持多态、封装及继承,并详细解释了trait的运用。

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

面向对象编程——类
在scala中定义一个类,类中有一个成员变量age。系统默认会生成一个无参的主构造器
成员变量的getter和setter方法 getter方法就叫age,setter方法叫age_
1、 定义不带privatevar 字段, 此时scala生成的面向JVM的类时, 会定义为privatename字段, 并提供publicgettersetter方法
2、 而如果使用private修饰字段, 则生成的gettersetter也是private
3、如果定义val 字段, 则只会生成getter方法,因为常量值不可更改,所以没有setter方法
4、如果不希望生成settergetter方法, 则将字段声明为private[this]
private修饰的myAge可以被类的当前对象和类的其他对象访问。但是由private[this]修饰的myAge不会生成getter和setter方法,只能被类的当前对象访问而不能被类的其他对象访问
辅助constructor
Scala中, 可以给类定义多个辅助constructor, 类似于Java中的构造函数重载
辅助constructor之间可以互相调用, 而且必须第一行调用主constructor 
主构造器与类同名,他的参数可以放在类名后面,在类中,如果某些代码不在任何方法中,或者不在代码块中,那么这些代码就会被默认为主构造器的代码
面向对象编程——对象
object相当于class的单个实例。在第一次调用object的方法时,就会执行object的constructor
object不能定义有参的constructor。object的constructor只会在第一次被调用时执行一次
伴生对象、伴生类
如果有一个class和一个与class同名的object,那么就称这个object是这个类的伴生对象,这个类就是这个object的伴生类
1、必须放在同一个scala文件中。
2、伴生类与伴生对象之间可以互相访问private成员
在类中调用伴生对象的方法,直接通过伴生对象.方法名调用
在伴生对象中调用类的方法,可以通过创建一个伴生类的对象来调用伴生类中的方法
apply方法
object中非常重要的一个特殊方法, 就是apply方法
通常在伴生对象中实现apply方法, 并在其中实现构造伴生类的对象的功能
而创建伴生类的对象时, 通常不会使用new Class的方式, 而是使用Class()的方式, 隐式地调
用伴生对象的
apply方法, 这样会让对象创建更加简洁  
isinstanceOf和asinstanceOf
用object来实现枚举功能
如果要实现枚举, 则需要用object继承Enumeration类, 并且调用Value方法来初始化枚举值 
还可以通过Value传入枚举值的idname, 通过idtoString可以获取; 还可以通过idname来查找枚举值
main方法
scala中的main方法必须定义在object中。Object类相当于java中的静态类
除了写main方法之外,还可以通过继承App这个trait,实现和main相同的功能
object也可以extends抽象类,并重写抽象类中的方法,使用关键字override
面向对象编程——继承
Scala中的继承和Java中一样,也使用extends关键字
子类重写父类的方法,使用关键字override
子类调用父类中已被子类重写的方法,使用关键字super
不仅仅是方法可以被override 定义为val的常量也可以在子类中override,并给赋予新的值

类型转换和类型判断
在scala中,使用isInstanceOf来判断是否为子类  a.isInstanceOf[B] 判断对象a是否为B类型或者B类的子类型
使用asInstanceOf来完成类型转换 如果a是B类型或者B的子类型,就可以安全地把a赋给B类型的对象b b=a.asInstanceOf(B)
通过对象.getClass()方法可以获得该对象所属的类classOf[类名]可以精准地获得类

访问修饰符
private、private[this]、protect、protect[this]
如果使用protected[this], 则只能在当前子类对象中访问父类的字段和方法, 无法通过其他子类对象访问父类的
字段和方法
如果使用protected[this], 则只能在当前类对象中访问类的字段和方法, 无法通过该类的对象访问

面向对象编程——trait
trait可以作为接口来使用,但是不适用implements 而是使用extends
scala不支持对类进行多继承, 但是支持多重继承trait, 使用with关键字即可
trait中可自定义字段和方法(抽象方法和抽象方法均可) 
如果是在类中实现trait中的抽象方法,不用关键字override
trait中也可以定义字段,如果一个类extends了这个trait,name这个类就自动获得了这个字段,可以在类中直接使用,
就像是自己内部声明的一样

混入trait
在创建类的对象时, 指定该对象混入某个trait, 这样, 就只有这个对象混入该trait的方法, 而类的其他对象则有。
此时,混入的trait如果有和该类继承的trait相同的方法,将会覆盖本身的方法

trait调用链
要形成trait调用链,必须满足以下三个条件:
1、调用链必须是一个类继承多个trait
2、多个trait中必须包含同一个方法,并且多个trait有一个共同的父trait
3、调用的多个trait的同一个方法中,最后的语句必须是super.方法名,通过这种形式调用trait调用链中的下一个trait方法
满足以上条件才能构成trait调用链,在调用链中按照从右往左的顺序依次调用同一个方法。  

trait的构造机制
继承了trait的类的构造机制如下:
1、 父类的构造函数执行,类本身的构造器最后执行;
2、 trait的构造代码执行, 多个trait从左到右依次执行;
3、 构造trait时会先构造父trait, 如果多个trait继承同一个父trait, 则父trait只会构造一次;
4、 所有trait构造完毕之后, 子类的构造函数执行  

trait也可以继承类
Scala中, trait也可以继承自class, 此时这个class就会成为所有继承该trait的类的父类  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值